Etcd客户端基本操作

提供了如下操作接口:

  • put - 添加一个新的 key-value 到存储中
  • get - 获取一个 key 的 value
  • delete - 删除节点
  • range - 获取一个范围的 key 的 value,例如:key1 - key10
  • txn(Transaction) - 读、if-else、修改、写的组合(事务处理)
  • watch - 监控一个或一个范围的 key,发生变化后就会得到通知

Etcd整体架构

gRPC Server:集群之间的通讯及Server与Client之间的通讯

Boltdb:是支持事务的KV数据库,boltdb为每一个key都创建了一个索引(B+树),B+树中存储了这个key的版本信息(如下)

  • raft_term任期,每一个Leader当选,任期就+1
  • revision:全局版本号,只要对etcd进行修改,全局版本号就+1
  • create_revision:创建key时的全局版本号
  • mod_revision:修改key时的全局版本号

步骤:

0)写请求发送
1)转发给Leader
2)Leader写日志记录,
    2.1)Leader将写日志操作广播到Follower
    2.2)Follower写日志
3)Follower返回ack表示收到
4)Leader提交写数据到磁盘
    4.1)Leader广播commit信息到Follower
    4.2)Follower提交数据到磁盘

Etcd一致性实现 raft机制

raft是Etcd的一致性实现机制,主要包括集群的Leader选举、数据复制、http://thesecretlivesofdata.com/raft/

Leader选举

0)集群三个节点为例
1)当未收到Leader发送的消息,则三个节点分别随机产生时间进行选举倒计时,谁先倒计时完成,谁成为候选者
2)候选者term任期+1,对自己的vote投票数+1,候选者节点重新选举倒计时,并向其他节点发送投票消息
3)其他节点收到消息后回复,也分别重新开始倒计时
4)候选者收到>n/2的消息,则自动成为Leader
5)成为Leader后,Leader会发送心跳/数据给Follower节点,每次Follower节点收到后都会重置选举倒计时
6)如果Leader节点Down机,循环1)->5)

Log复制

流程如上架构图

Etcd分布式锁机制

Lease租约(过期时间):etcd将过期时间相同的key放在一起,称为一个租约

续约:一般在主线程下再开启一个子线程专门用来续约,在租约时长还剩1/3时进行续约

1.获取锁,即存个key并规定这个key的过期时间(Lease),如果存在key则锁存在,如果key过期则无锁。

2.在获取锁的主线程下,开一个子线程专门用来续约,如果主线程没有执行完,则在租约时长还剩1/3时子线程会进行续约。

所以,如果服务Down掉,子线程也会Down掉,则锁到租期后会自动解锁。

最新文章

  1. 前端学HTTP之摘要认证
  2. ubuntu搭建shad(-_-)owscoks(影梭)
  3. 10款最好的 Bootstrap 3.0 免费主题和模板
  4. C#中MySQL数据库的备份 还原 初始化
  5. iOS远程推送1
  6. Python的高级特性6:使用__slots__真的能省很多内存
  7. linux string 操作
  8. 超级内存NVDIMM:下一代数据中心存储关键技术
  9. SharePoint REST api
  10. Solr4.8.0源码分析(9)之Lucene的索引文件(2)
  11. 利用sql 存储过程把表中内容自动生成insert语句
  12. javascript笔记整理(字符串对象)
  13. Mac下改动Android Studio 所用的JDK版本号
  14. HDU 4309 Seikimatsu Occult Tonneru 网络流量+像缩进
  15. Android dumpsys命令的使用
  16. linux 在jetty中部署web工程
  17. java基础知识5--集合类(Set,List,Map)和迭代器Iterator的使用
  18. ssh连接原理介绍( 无密码连接登录的原理)
  19. RISC-V踩坑记----__builtin_clz((x)库函数的应用
  20. 异常来自 HRESULT:0x80070057 (E_INVALIDARG)(转)

热门文章

  1. SQL Server 2012主从数据库的订阅和发布,实现数据库读写分离(主从备份)
  2. Mysql 系统参数查看
  3. URLDecoder.decode() 特殊字符的处理
  4. vue-seamless-scroll 组件用法-区域内容滚动效果
  5. java写 变量到文件
  6. RabbitMQ 修改密码
  7. Nucmer+LINKVIEW实现序列水平的共线性分析
  8. How to Avoid Trivial Solutions in Physics-Informed Neural Networks
  9. nvim比较两个文件的不同
  10. Codeforces Round #781 (Div. 2) - D. GCD Guess