Leader election by etcd or Redis

业务中有一个统一写MySQL的服务这里称为DataAgg,但进行为了高可用需要进行主备(master-slave,leader-follower)集群部署,多个运行着的DataAgg只能同时有一个允许工作(基于高可用KV的Master发现策略-Master Discovery by HA KV), 大概的实现思想是, 基于redis集群或者ETCD的分布式锁来实现

以ETCD为例:

如果部署有ETCD(originated from two ideas, the unix “/etc” folder and “d”istributed systems) 直接调用官方包提供的方法即可,主要代码NewSession->NewElection->Campaign,在Campaign时如果未能成为master或者leader就会一直卡住;若Campaign返回则说该调用端的服务获取到了leader角色,具体代码在底部,效果如图:



以redis-cluster为例:

这样会存在什么问题?

后来改善一下:

在redis中这样实现:

由于网络的延迟性,可能会出现多个master角色工作的情况;这样解决:在每一个peer中进行master校验时,发现多个master并且自身也是master的情况,则peer主动退回成slave或者follower的角色,等到下次心跳时进行master的决策认定;

etcd具体代码test case:

2019-12-08