raft 日志复制 在上一篇的内容中,我们学习了 raft 的 Leader 选举。在这一篇中,我们将学习 raft 的日志复制。 在 raft 算法中,副本数据是以日志(Log)的形式存在的。在收到来自客户端的信息后,Leader 会复制日志到 Follower,并 Apply 到状态机。 日志是什么日志是由日志项组成的,每个日志项代表一条数据操作命令。 日志项的格式分为三个部分,分别是 Index: 日志项的索 2023-11-13 #raft
raft Leader 选举 raft 协议是当前分布式系统开发的首选共识算法。raft 协议是一个一切以领导者为主,实现一系列值的共识和节点日志的一致性。 raft 协议将共识问题拆分成三个子问题 Leader 选举,Leader 故障后集群能快速选出新 Leader; 日志复制, 集群只有 Leader 能写入日志, Leader 负责复制日志到 Follower 节点,并强制 Follower 节点与自己保持相同; 安 2023-11-08 #raft
声明式 API 声明式 API 是一种软件设计理念和做法,它要求用户描述他们想要达到的目标状态,由服务自身去令系统达到目标状态。 在声明式 API 中,用户不需要关心系统内部的实现细节,只需要描述他们想要的结果即可。这使得声明式 API 更加易于理解和使用,也更容易维护和扩展。 声明式 API 与命令式 API 的区别在于,命令式 API 要求用户描述一系列的动作,这些动作如果被正确的顺利执行,最终结果是系统达到 2023-11-07 #k8s
无法比较的Go结构体 比较运算符在 Go 中比较运算符用于比较两个操作数的大小,并产生一个布尔值。 123456== 等于!= 不等于< 小于<= 小于等于> 大于>= 大于等于 其中 == 和!= 操作符号用于两个 comparable 的类型, 而 <, <=, >, and >= 用于比较 ordered 的类型。类型的定 2023-10-30 #Go
goroutine-stop 在 Go 的开源项目中, 经常能够看到通过关闭一个 stopc 的通道来退出 goroutine 的写法, 如下面这个例子 1234567891011121314151617181920212223242526272829303132333435363738package mainimport ( "fmt" "time")func main() { 2023-10-19 #Go
build-xtrabackup-on-centos-aarch Percona xtrabackup arm 版编译xtrabackup 官方只提供了 x86 版本的安装包, 在 arm 环境上使用需要自己手动编译。这篇文档主要介绍在 CentOS arm 版上编译安装 xtrabackup。 X86 版本的安装方式可以参考这篇官方文档。 安装编译工具xtrabackup 编译需要使用 cmake3, 如果环境尚未安装 cmake3, 可以使用下面的命令来编 2023-08-01 #MySQL
代码的坏味道 代码的坏味道列表: 神秘的命名:代码不是直观明了的,命名无法表明自己的功能和用法 重复的代码:在一处以上的地方看到相同的代码结构 过长的函数:积极的分解函数,当感觉需要以注释来说明点什么的时候,把需要说明的东西写进一个独立的函数中,并以其用途命名 过长的参数列表 全局数据 可变数据:约束对数据的更新,降低风险 发散式变化:杂糅了不同上下文的模块因为不同的原因在不同的方向上发生变化,对某个上下文进 2023-04-24 #重构
何时去重构 在前一篇文章中,记录了为什么要去重构,在这篇文章中,我们将会聚焦于何时去重构。 在阐述何时去重构时,先了解三次法则 第一次做某事时只管去做; 第二次做类似的事时,会产生反感,但无论如何还是可以去做; 第三次做相同的事时,你就应该重构 预备性重构最佳的重构时机是在添加新功能之前。 在添加新功能之前,先检查现有的代码库,通常可以发现其中已经有类似功能的方法。可以对这些方法进行微调,避免出现重复代码 2023-04-11 #重构
优雅的处理错误 本文是对 Dave Cheney 博客的翻译, 这里是原文地址 错误只是值我花了很多时间思考在 Go 程序中处理错误的最佳方式。我真的希望有一种单一的方式来处理错误,这样我们就可以像教授数学或字母一样,教授所有的 Go 程序员。 然而,我得出结论,没有一种单一的方式来处理错误。相反,我认为 Go 的错误处理可以归类为三种核心策略。 哨兵错误第一种错误处理方式我称之为哨兵错误 1if err == 2023-04-03 #Go
重构的原则(上) 最近在重温 Martin Fowler 的 《重构》一书,在博客中记录一下阅读过程的心得笔记。 什么是重构重构是软件开发过程中经常会用到重构一次,但在使用时比较随意,Martin 则是认为这个词的使用需要更为严谨一下,因此给出了两个定义 重构作为一个名词时,是指对软件内部的一种调整,在不改变软件可观察行为的前提下,提供代码的可理解性,降低内部的修改难度。简单的理解便是,优化了程序内部的逻辑,降低 2023-03-30 #重构 #读书笔记