dolphinscheduler中使用zookeeper实现自杀机制,用于解决
dolphinscheduler和zookeeper网络分区时发生的脑裂问题,
比如master容错时,当前master与zk失联,任务被其他master接管,然后master又脸上了,这个时候要master需要自杀,避免master更新db造成混乱
dolphinscheduler的zookeeper存储结构
1 | /dboard |
dolphinscheduler中的zk监听顺序问题
AbstractListener有33个实现类
- NodeChangeListener:触发master和worker的容错逻辑;
- MasterNodeListener:更新内存的master列表,master节点删除时新增告警记录
- WorkerGroupNodeListener:更新内存的服务组列表
- ZKMasterClient会通过NodeChangeListener监听master和worker的上线下线状态变更;
- ServerNodeManager启动时会注册MasterNodeListener和WorkerGroupNodeListener
之前没有顺序,导致1先执行,3和2后执行,
3种情况会导致这个问题
- QuartzExecutors先shutdown(quartz内部会close传给他的connection),MasterNodeListener和WorkerGroupNodeListener插入alert会报错;
- master的HeartBeatTask会定期检测自己是否在zk的dead_server列表中,如果在master会自杀,触发QuartzExecutors先shutdown;
- 另外master也有可能随时收到zk发送过来的其他master/worker down的信息,此时update库也会报connection close错误
应该是2,3先发生,再发生1
请教个ops的问题。ds在用ansible重新发布的时候,2个master配置了串行重启,检测到5678端口后再启动下一个。
现在发现总是只能启动1个,第二个手动重启才行。
我的理解:
有2个master:master1和master2
master1重启,master2会将master1放入/dead_server中(默认10s检查一次,第一次延迟10s)
master2重启,master2启动时会将自己从dead_server中移除
2个master同时存活时,
现在现象是master1启动成功,master2重启时,master1容错把master2放入dead_server,然后master2启动时自杀,没有从dead_server中移除自己
1个master存活时,重启偶尔能2个都成功
1 | // master registry |
master快速重启失败问题
由于master之间存在zk的相互watch,1个master挂了会被另一个master watch并标记为dead
现象:
master1如果快速restart,会导致registry去删除/dead_server记录的时候,dead记录还不存在
当master2标记dead的时候,将导致master1停止stop quartz sheduler, close jdbc连接
解决:
stop和start的间隔必须大于zk的session超时时间zookeeper.session.timeout=60s
master和worker的重启时序:
stop 70s后再start,
server1 start 40s后再start server2.
参考
*Master failover add dead-server should check zk the master node is not exist