项目内容
基于etcd的搭建配置中心
- etcd是关键数据的分布式可靠kv存储。主要用于一些基础组件事务性数据的存储,强调数据和事务的一致性和可靠性。
- 特点
- 简单,user-facing API(gRPC)
- 安全,automatic TLS 认证
- 快速,10000 writes/sec的速率
- 可靠,Raft分布式算法
分布式一致性算法
Raft一致性算法
节点的三个状态:跟随者、候选者、领导者。三个之间的转换关系如图。
跟随者可以接受候选者的vote_rpc,根据版本号和任期号投出。可以接受领导者的心跳包,维持其leader状态。当timeout时间没收到包时,会转变为候选者状态,像其他节点发起投票。
候选者,收到大多数节点的投票,会转变为领导者。在选举过程中发现任期数比自己高的候选者,会转变为跟随者。如果选举超时,会重新发起投票
领导者,发现任期比自己高的节点会变为跟随者。会发送心跳包维持自己的领导地位;
领导人选举
- 启动时的随机timeout时间
- 增加自己的任期号,转变为候选人状态,发送请求投票RPCs
日志复制
- 收到客户端请求时,并行发起附加条目RPCs给其他服务器,当这条日志被其他服务器复制后,领导者才会加入到它的状态机中,返还结果给客户端。
- 领导人处理不一致是通过强制跟随者直接复制自己的日志来解决了。这意味着在跟随者中的冲突的日志条目会被领导人的日志覆盖
日志压缩
配置更改
服务中配置的动态下发的结构
主要代码结构和细节
- 本地缓存啊
- 起watch监控对应的配置
- 替换本地的配置 多线程同步的问题 读写锁
1 | type Watcher interface { |
- 具体自己提供结构的主要能力
- 不同的本地配置结构实现该三个接口就可以快速的接入watcher配置的能力
- watch结构内会初始化 new client, 对于本地缓存的配置。 会先load_conf 一把,然后会开始开启watch对应的配置
- addEntry 具体配置修改添加本地配置
- delete 参数本地的配置
- getPrefix 配置本地prefix的能力