2.1.22 脱离集群 命令
以下内容只针对集群状态下的 dble 有效。
2.1.22.1 背景
在部分场合下,集群状态下的 dble 可能需要临时断开和集群中心(指zookeeper/ucore)的连接。
典型的应用场景是:集群中心需要进行升级/维护时。
在版本<3.21.10 , 唯一的方式是配置修改为单机版并重新启动 dble;需要加回来时,改会原来的配置并重启 dble。但这对业务影响很大,通常在生产环境下难以接受。
2.1.22.2 介绍
在版本≥3.21.10,dble提供了一个脱离集群的指令,可以在不重启的情况下,临时断开和集群中心的连接,让 dble 以一个 伪集群模式 的单实例方式运行。
之所以叫做 伪集群,因为他的状态和 普通的单机版dble 不同, dble 会认为自己还是处于集群状态,操作方式还是和集群方式相同,只是没法和集群通讯。他执行一些集群相关指令(含义见2.1.22.4)
会报错,比如reload @@config
。
2.1.22.3 命令
cluster @@detach [timeout=10]
- 脱离集群,断开和集群中心的连接。
- 在执行完 脱离集群指令后,在加入集群之前,集群相关指令(含义见2.1.22.4)将不可用且报错:"cluster is detached"
- 可以指定 timeout 单位是秒,默认是 10s,不建议设置过大,因为会阻塞其他指令。
cluster @@attach [timeout=10]
- 唯一用途:脱离集群的逆操作。用于重新加入集群。恢复和集群中心的连接
- 可以指定 timeout 单位是秒,默认是 10s,不建议设置过大,因为会阻塞其他指令。
2.1.22.4 伪集群模式下的限制
2.1.22.4.1 阻塞等待
脱离集群 指令分为三个阶段。
- 预备阶段
- 执行阶段
- 执行完成
在第一步预备阶段,如果有先来的 集群相关指令或者管理端(9066执行的)指令 正在执行,则 脱离集群指令 会阻塞等待这些指令完成,或者阻塞超时了直接返回报错。因为脱离集群和这些指令并发可能有风险。
在第一步预备阶段和第二步执行阶段,如果有后来的 集群相关指令或者管理端(9066执行的)指令 即将执行,则这些指令会阻塞等待,直到 脱离集群 指令完成。因为脱离集群和这些指令并发可能有风险。
简单来说,脱离集群指令会被 集群相关指令或者管理端(9066执行的)指令 阻塞,集群相关指令或者管理端(9066执行的)指令 会被 脱离集群 阻塞。为了防止 集群相关指令或者管理端(9066执行的)指令被阻塞太久影响实际使用,建议 timeout超时时间不宜配置太长。
加入集群 指令 同上。
2.1.22.4.2 无法执行
在执行完 脱离集群指令后,在加入集群之前,集群相关指令将不可用且报错:"cluster is detached"。这是合理的,因为此时和集群不通讯,所以无法完成进一步操作。
2.1.22.4.3 不一致问题
在执行完 脱离集群指令后,如果集群内的其他节点执行 集群相关指令,将正常执行,但是,将不会对该节点产生任何影响,因为收不到消息。 此时,集群外和集群内的 dble 很有可能状态不一致,即使后续重新加入了集群,但是dble 仍不能保证一致性。
比如,集群中有 A,B,C 三个节点。节点 A 脱离了集群,节点 B 加入了一张表t1并进行reload,此时节点C和节点B的信息一致,均包含 表t1,但是节点A收不到消息,不会 reload 也不知道 表t1 的存在。在这个时间点,A 和 B 不一致。在这之后,节点 A 重新加入了集群,但是A 已经错过了 reload 事件,不会进行 reload ,依旧是和 B 不一致。
因此不建议在 脱离集群后加入集群前 这个时间点执行集群相关指令。 如果已经做了,请手动确认一致性。
2.1.22.5 术语解释
集群相关指令 指的是 使用了集群元数据的指令,主要是 https://actiontech.github.io/dble-docs-cn/2.Function/2.08_cluster.html 提到的指令。包括以下这些(可能信息更新不及时,具体以链接里提到的为主)
- DDL
- reload @@config
- show @@binlog.status
- 创建view
- 高可用命令同步
- 暂停流量
- xa 日志的commit/rollback
- 全局序列中采用的”分布式offset-step方式“实现的 table 的插入语句