ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] # raft ## quorum模型 ![](https://box.kancloud.cn/d61fb8cb218e14bec42485fee928a9c6_1720x645.png) ## 日志格式 ![](https://box.kancloud.cn/ebe4c8536b02f281d9f7ce74d4126698_984x754.png) ## raft日志概念 * replication: 日志在leader生成,向follower复制,达到各个节点的日志序列最终一致 * term: 任期,重新选举产生的leader,其term单调递增 * log index: 日志行在日志序列的下标 ## 交互协议 * 通用的http+json协议,性能低效 * sdk内置GRPC协议,性能高效 ## 重要特性 * 底层存储是按key有序排列,可以顺序遍历 * 因为key有序排列,可以顺序遍历 * 支持复杂事务,提供类型if...then...else的事务能力 * 基于租约机制实现key的ttl过期 存储引擎是按key有序排列 `/config/database` `/feature-flags/verbost-logging` `/feature-flags/redesign` 支持MVCC多版本控制,维护多个历史版本 历史版本过多可以执行compact命令完成删减 ## 监听kv变化 通过watch机制监听某个key,或者某个目录(key前缀)的连续变化 常用于分布式的配置分发,状态同步 # etcd 服务端etcd,客户端etcdctl 一般用etcdctl之前会放api版本 ~~~ ETCDCTL_API=3 ./etcdctl ~~~ ## 使用 ~~~ ➜ Desktop ETCDCTL_API=3 etcdctl put "name" "11" OK ➜ Desktop ETCDCTL_API=3 etcdctl get "name" name 11 ➜ Desktop ETCDCTL_API=3 etcdctl del "name" 1 ➜ Desktop ETCDCTL_API=3 etcdctl get "name" ➜ Desktop ETCDCTL_API=3 etcdctl put "/cron/jobs/job1" "123" OK ➜ Desktop ETCDCTL_API=3 etcdctl put "/cron/jobs/job2" "222" OK ➜ Desktop ETCDCTL_API=3 etcdctl get --prefix "/cron/jobs/" /cron/jobs/job1 123 /cron/jobs/job2 222 ~~~ **watch** ~~~ ➜ Desktop ETCDCTL_API=3 etcdctl watch "/cron/jobs/" --prefix PUT /cron/jobs/job1 111 ~~~ 从修订版本2开始观察key `foo`的改动 ~~~ ➜ Desktop ETCDCTL_API=3 etcdctl watch --rev=2 foo ~~~ **压缩修订版本** ~~~ 这是压缩修订版本的命令: etcdctl compact 5 compacted revision 5 #在压缩修订版本之前的任何修订版本都不可访问 etcdctl get--rev=4 foo Error: rpcerror: code = 11 desc = etcdserver: mvcc: required revision has been compacted ~~~