dm-master集群扩容后master不会自动加入集群

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:
【 TiDB 使用环境】
全nvme生产环境,通过operator部署于kubernetes集群中
【概述】 场景 + 问题概述
通过statefulset方式在同一个kubernetes集群中部署了1master3worker的dm集群
【备份和数据迁移策略逻辑】
每个worker上都在运行上游mysql的同步任务
【背景】 做过哪些操作
现在master所在节点需要下线维护,参考了生产环境高可用方案,将statefulset.apps.pingcap.com/dm-cluster-dm-master中replica副本数调整为3(相当于先扩容了2个master,待master之间数据同步完成后再删除老的dm-master)
【现象】 业务和数据库现象
在老的dm-master中查询当前任务:

./dmctl --master-addr 127.0.0.1:8261 query-status
{
    "result": true,
    "msg": "",
    "tasks": [
        {
            "taskName": "mysql-01-sync-task",
            "taskStatus": "Running",
            "sources": [
                "mysql-replica-01"
            ]
        },
        {
            "taskName": "mysql-02-sync-task",
            "taskStatus": "Running",
            "sources": [
                "mysql-replica-02"
            ]
        }
    ]
}
在两个新的dm-master执行同样的命令:
./dmctl --master-addr 127.0.0.1:8261 query-status
{
    "result": true,
    "msg": "",
    "tasks": []
}
可以看到,新的dm-master中并不能看到task任务,查看启动命令如下:
老的dm-master中的启动命令为:
/dm-master --data-dir=/var/lib/dm-master --name=dm-cluster-dm-master-0 --peer-urls=http://0.0.0.0:8291 --advertise-peer-urls=http://dm-cluster-dm-master-0.dm-cluster-dm-master-peer:8291 --master-addr=:8261 --advertise-addr=dm-cluster-dm-master-0.dm-cluster-dm-master-peer:8261 --config=/etc/dm-master/dm-master.toml
新增的dm-master副本中的启动命令如下:
/dm-master --data-dir=/var/lib/dm-master --name=dm-cluster-dm-master-1 --peer-urls=http://0.0.0.0:8291 --advertise-peer-urls=http://dm-cluster-dm-master-1.dm-cluster-dm-master-peer:8291 --master-addr=:8261 --advertise-addr=dm-cluster-dm-master-1.dm-cluster-dm-master-peer:8261 --config=/etc/dm-master/dm-master.toml --initial-cluster=dm-cluster-dm-master-1=http://dm-cluster-dm-master-1.dm-cluster-dm-master-peer:8291

【问题】 当前遇到的问题
新的dm-master节点实际上没有加入集群,有没有相关文档说明这种情况下手动操作方式,或自动的解决方案(不是参数说明文档)
【业务影响】
无法增减dm-master节点的数量,高可用实际上没有起作用,只是增加了dm-master副本数量
【TiDB 版本】
v5.0.1

DM 是哪个版本?

image

你好,dm是v2.0.4版本的,我查看了下到v2.0.7版本为止文档的note release和bug fix,好像没有这方面的修复相关内容,是在其他地方查看的吗?这个好像属于tidb工具集云原生改造的问题,dmctl本身的命令我查看到有join的命令

dm-master就是一个etcd,扩容和etcd基本完全一样,按照etcd的扩容流程就可以

官方会有相关问题的开发计划或RoadMap吗?现在考虑自己重新实现一个Operator,如果官方有计划,还得考虑后期升级的问题

你的 dm-master 是不是没有 join 到原集群中?

这个是指什么?

举个栗子,有没有类似dm operator的方式,通过replica的变更来触发副本的增加和减少,以达到自动运维的目的,我的理解,在这个过程中,需要控制join/rejoin/remove等逻辑

我这边确认了下,DM 相关功能使用可以参考 release note 的,operator 这块我理解扩容和 TiDB 集群一样。你这边扩容 dm-master 没有加到 DM 集群中,方便拿一下新节点的 日志么?

另外,dm-ctl 中查一下 list-member 相关信息

在老的dm-master中查看 list-member:

# ./dmctl --master-addr 127.0.0.1:8261 list-member
{
    "result": true,
    "msg": "",
    "members": [
        {
            "leader": {
                "msg": "",
                "name": "dm-cluster-dm-master-0",
                "addr": "dm-cluster-dm-master-0.dm-cluster-dm-master-peer:8261"
            }
        },
        {
            "master": {
                "msg": "",
                "masters": [
                    {
                        "name": "dm-cluster-dm-master-0",
                        "memberID": "18437442196168938303",
                        "alive": true,
                        "peerURLs": [
                            "http://dm-cluster-dm-master-0.dm-cluster-dm-master-peer:8291"
                        ],
                        "clientURLs": [
                            "http://dm-cluster-dm-master-0.dm-cluster-dm-master-peer:8261"
                        ]
                    }
                ]
            }
        },
        {
            "worker": {
                "msg": "",
                "workers": [
                    {
                        "name": "dm-cluster-dm-worker-0",
                        "addr": "dm-cluster-dm-worker-0.dm-cluster-dm-worker-peer:8262",
                        "stage": "bound",
                        "source": "mysql-replica-04"
                    },
                    {
                        "name": "dm-cluster-dm-worker-1",
                        "addr": "dm-cluster-dm-worker-1.dm-cluster-dm-worker-peer:8262",
                        "stage": "bound",
                        "source": "mysql-replica-02"
                    },
                    {
                        "name": "dm-cluster-dm-worker-2",
                        "addr": "dm-cluster-dm-worker-2.dm-cluster-dm-worker-peer:8262",
                        "stage": "bound",
                        "source": "mysql-replica-01"
                    }
                ]
            }
        }
    ]
}

在新的dm-master中查看:

./dmctl --master-addr 127.0.0.1:8261 list-member
{
    "result": true,
    "msg": "",
    "members": [
        {
            "leader": {
                "msg": "",
                "name": "dm-cluster-dm-master-1",
                "addr": "dm-cluster-dm-master-1.dm-cluster-dm-master-peer:8261"
            }
        },
        {
            "master": {
                "msg": "",
                "masters": [
                    {
                        "name": "dm-cluster-dm-master-1",
                        "memberID": "7753727239955239486",
                        "alive": true,
                        "peerURLs": [
                            "http://dm-cluster-dm-master-1.dm-cluster-dm-master-peer:8291"
                        ],
                        "clientURLs": [
                            "http://dm-cluster-dm-master-1.dm-cluster-dm-master-peer:8261"
                        ]
                    }
                ]
            }
        },
        {
            "worker": {
                "msg": "",
                "workers": [
                ]
            }
        }
    ]
}

可见,新的dm-master确实没有加入集群,我发现新的dm-master的pod启动命令没有传递关键参数join,这应该是主要原因,相当于单独创建了一个不在集群的master

这块方便提供下吗?我这手头暂时没 k8s 环境:sleepy:

我打印出新的dm-master中的启动命令:

/ # ps -ef|more
PID   USER     TIME  COMMAND
    1 root      1h20 /dm-master --data-dir=/var/lib/dm-master --name=dm-cluster-dm-master-1 --peer-urls=http://0.0.0.0:8291 --advertise-peer-urls=http://dm-cluster-dm-master-1.dm-cluster-dm-master-peer:8291 --master-addr=:8261 --advertise-addr=dm-cluster-dm-master-1.dm-cluster-dm-master-peer:8261 --config=/etc/dm-master/dm-master.toml --initial-cluster=dm-cluster-dm-master-1=http://dm-cluster-dm-master-1.dm-cluster-dm-master-peer:8291
  422 root      0:00 /bin/sh

可以看出,实际上单独增加容器的副本数只是重新起了多个独立的master,dm-master --join的方式才会正常加入已有的master,这个问题已经找到了,主要是想看看有没有类似operator这种已经实现验证的方案

当然,既然可以手动解决,这个问题其实原本不应该出现,但我的疑问是,云原生场景下,这种高可用是否可以用更合适的方式?打个不恰当的比方,etcd集群也完全可以手动配置,高可用配置在启动配置上直接就可以配置,但这种方式其实只是满足了基本的高可用,故障自动转移等功能其实不会像operator中的tikv等组件那样完善

好的,我这边反馈下问题。

你好,提供下 Operator 版本以及 DM spec,我们尝试复现一下

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。