0%

dolphinscheduler中的zookeeper角色

dolphinscheduler中使用zookeeper实现自杀机制,用于解决
dolphinscheduler和zookeeper网络分区时发生的脑裂问题,
比如master容错时,当前master与zk失联,任务被其他master接管,然后master又脸上了,这个时候要master需要自杀,避免master更新db造成混乱

dolphinscheduler的zookeeper存储结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/dboard

# lock
/dboard/lock
/dboard/lock/masters
/dboard/lock/masters/_c_36c30bcf-9334-4f93-8f8e-27029e881612-lock-0025272899
/dboard/lock/masters/_c_3f098290-1b34-4e2e-9e3b-b00f9d3968c1-lock-0025272900
/dboard/lock/failover
/dboard/lock/failover/startup-masters
/dboard/lock/failover/masters
/dboard/lock/failover/workers

# dead-servers
/dboard/dead-servers
/dboard/dead-servers/master_172.24.0.2:5678
/dboard/dead-servers/worker_172.24.0.1:1234

# nodes
/dboard/nodes
/dboard/nodes/worker
/dboard/nodes/worker/default
/dboard/nodes/worker/default/worker_172.24.0.4:1234
/dboard/nodes/worker/default/worker_172.24.0.3:1234

/dboard/nodes/master
/dboard/nodes/master/master_172.24.0.5:5678
/dboard/nodes/master/master_172.24.0.4:5678

dolphinscheduler中的zk监听顺序问题

AbstractListener有33个实现类

  1. NodeChangeListener:触发master和worker的容错逻辑;
  2. MasterNodeListener:更新内存的master列表,master节点删除时新增告警记录
  3. WorkerGroupNodeListener:更新内存的服务组列表
  • ZKMasterClient会通过NodeChangeListener监听master和worker的上线下线状态变更;
  • ServerNodeManager启动时会注册MasterNodeListener和WorkerGroupNodeListener

之前没有顺序,导致1先执行,3和2后执行,

3种情况会导致这个问题

  1. QuartzExecutors先shutdown(quartz内部会close传给他的connection),MasterNodeListener和WorkerGroupNodeListener插入alert会报错;
  2. master的HeartBeatTask会定期检测自己是否在zk的dead_server列表中,如果在master会自杀,触发QuartzExecutors先shutdown;
  3. 另外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
2
3
4
5
6
// master registry
//10s后触发检测dead_server,自杀
masterRegistry.registry();
String registryPath = this.masterRegistry.getMasterPath();
//将自己从dead_server中移除
masterRegistry.getZookeeperRegistryCenter().getRegisterOperator().handleDeadServer(registryPath, ZKNodeType.MASTER, Constants.DELETE_ZK_OP);

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