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 阻塞等待

脱离集群 指令分为三个阶段。

  1. 预备阶段
  2. 执行阶段
  3. 执行完成

在第一步预备阶段,如果有先来的 集群相关指令或者管理端(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 的插入语句

results matching ""

    No results matching ""