背景:
多个设备节点上有相同的程序,可以提供相同的服务,但是如果多个设备同时提供服务,有可能会造成数据不一致性。
一般情况下,大家会利用zookeeper创建分布式锁,也就是多个设备节点都在zookeeper上创建相同名称的临时节点,哪个设备节点创建成功了,那么这个设备节点就获取到了服务权限,可以提供服务,其他的设备节点就会创建失败,不可以提供服务。
服务完成之后,再删除zookeeper上的临时节点,这样其他的设备节点就可以再次尝试创建zookeeper的临时节点。
带来的问题:
问题1:删除临时节点时,不一定能保证zookeeper的临时节点可以删除;例如设备节点的服务刚刚完成,刚要删除zookeeper的临时节点时,网络断了,而zookeeper自己也没有删除临时节点。
问题2:设备节点的服务还在继续,网络断开,zookeeper感知到了,主动删除了临时节点,会造成其他的设备节点抢占锁成功,这时就会有2各设备节点在提供服务。
解决方法:
1.将创建临时节点改为创建zookeeper的永久节点;
2.服务完成后,主动删除zookeeper节点;
3.创建节点时,在节点中设置value值,value值包含2各字段,分别是设备节点ID和租约时间;
4.设备节点ID表示是哪个设备创建的节点,只有设备节点ID对应的设备可以更新租约时间;
5.设备在提供服务时,要定时更新租约时间;例如是5秒钟更新一次,更新为当前时间;
6.设备定时检查zookeeper节点中的租约时间有没有过期,例如设备的当前时间大于zookeeper节点中的租约时间超过10秒钟,可以认为锁过期,可以删除该zookeeper节点;
7.创建zookeeper节点成功的设备,定时检查zookeeper节点中的租约时间,若发现获取不到租约时间,或者发现租约过期,停止本设备中的服务。