官方文档:
迁移到多个 Kudu master:https://kudu.apache.org/docs/administration.html#migrate_to_multi_master
从多主部署中删除 Kudu master:https://kudu.apache.org/docs/administration.html#_removing_kudu_masters_from_a_multi_master_deployment
从集群中停用或永久删除 kudu tserver:https://kudu.apache.org/docs/administration.html#tablet_server_decommissioning
kudu 命令行工具参考:https://kudu.apache.org/releases/1.15.0/docs/command_line_tools_reference.html
一、环境
因线上 kudu 服务器到期,新购 3 台新型号新配置的服务器,将原服务器上的 kudu 迁移到新服务器上。
kudu 版本为 1.15.0,新购服务器上已经部署好软件没有运行。
原有服务器信息表:
IP | 主机名 | 运行服务 |
---|---|---|
10.0.0.101 | bigdata01 | kudu-master、kudu-tserver |
10.0.0.102 | bigdata02 | kudu-master、kudu-tserver |
10.0.0.103 | bigdata03 | kudu-master、kudu-tserver |
新服务器信息表:
IP | 主机名 | 运行服务 |
---|---|---|
10.0.0.104 | bigdata04 | kudu-master、kudu-tserver |
10.0.0.105 | bigdata05 | kudu-master、kudu-tserver |
10.0.0.106 | bigdata06 | kudu-master、kudu-tserver |
二、kudu-master 迁移
kudu-master 迁移采用先加后减,先将新的节点逐台加入到集群,再将老的节点从集群中删除。
注意了,配置文件 master 地址建议都采用主机名,不要主机名和 IP 混用,这样会有问题,可能会导致新 master 添加异常。
1、添加 master 流程
从 1.15.0 版开始,可以使用 kudu master add
向 kudu 集群添加主节点。
该过程不需要停止整个集群中的所有 kudu 进程,但是一旦添加完成,所有 kudu 进程都必须重新启动以合并新添加的 master,这可以在不导致停机的情况下完成,如下面的步骤所述。
注意该过程支持一次只添加一个主站。为了添加多个主控,请按下面步骤对下一个新 master 再次执行相同的过程。
- 在需要添加的新的 master 主机上(而不是在任何现有的 master 上)运行 kudu master add 命令来添加 master。程序完成后,无论程序是否成功,新的 master 都会被 shutdown。
- 修改所有 master (包括新 master)的 master_addresses 配置的值。
- 逐个重启现有老 master。
- 启动新的 master。
- 修改所有 tserver 的 tserver_master_addrs 配置的值。
- 逐个重启所有 tserver 以应用新的主配置。
- 验证检查。访问每个 kudu Web UI,查看 /masters 页面,所有的 master 都应该列在那里,其中一个 master 是 LEADER 角色,其他 master 是 FOLLOWER 角色。每个 master 上的内容/masters应该是一样的。使用
kudu cluster ksck
进行集群健康检查。
2、添加 master
语法:kudu master add <master_addresses> <master_address> [-wait_secs=<secs>] [-kudu_abs_path=<path>] [-fs_wal_dir=<dir>] [-fs_data_dirs=<dirs>] [-fs_metadata_dir=<dir>] [-log_dir=<dir>] [-logtostderr]
以下将添加一个新 master bigdata04 到 kudu 集群中,其它 master 按照下面步骤逐个添加即可。
# bigdata04 节点上执行添加 master
$ sudo -u kudu kudu master add bigdata01:7051,bigdata02:7051,bigdata03:7051 bigdata04:7051 --fs_wal_dir=/data/kudu/master/wal --fs_data_dirs=/data/kudu/master/data
# 修改所有 master 配置(包括新 master)
$ sed -ri 's#^(--master_addresses).*#\1=bigdata01:7051,bigdata02:7051,bigdata03:7051,bigdata04:7051#' master.gflagfile
# 逐个重启现有老 master,并且检查状态
$ systemctl restart kudu-master
$ systemctl status kudu-master
$ netstat -ntlp | grep kudu
# 启动新的 master
$ systemctl start kudu-master
$ systemctl status kudu-master
$ netstat -ntlp | grep kudu
# 修改所有 tserver 配置
$ sed -ri 's#^(--tserver_master_addrs).*#\1=bigdata01:7051,bigdata02:7051,bigdata03:7051,bigdata04:7051#' tserver.gflagfile
# 逐个重启所有 tserver,并且检查状态
$ systemctl restart kudu-tserver
$ systemctl status kudu-tserver
$ netstat -ntlp | grep kudu
# 健康检查
$ sudo -u kudu kudu cluster ksck bigdata01:7051,bigdata02:7051,bigdata03:7051,bigdata04:7051
3、删除 master 流程
从 1.15.0 版开始,可以使用 kudu master remove
从 kudu 集群中删除主节点。
- 停止不需要的 kudu master,运行 kudu master remove 命令来删除 master。注意一次只能删除一个 master,如果需要删除多个master,请重复执行。这里我们重复执行,删除所有不需要的 master,注意一个个来,停掉一个 master,就删除一个 master,依次重复操作。
- 修改所有未删除 master 的 master_addresses 配置的值。
- 逐个重启所有未删除的 master。
- 修改所有 tserver 的 tserver_master_addrs 配置的值。
- 逐个重启所有 tserver 以应用新的主配置。
- 验证检查。访问每个 kudu Web UI,查看 /masters 页面,所有的 master 都应该列在
那里,其中一个 master 是 LEADER 角色,其他 master 是 FOLLOWER 角色。每个 master 上的内容/masters应该是一样的。使用 kudu cluster ksck
进行集群健康检查。
4、删除 master
语法:kudu master remove <master_addresses> <master_address> [-master_uuid=<uuid>]
# 停止不需要的 kudu master。
# 注意,停止后检查下,leader 是否正确选举出来,处于新节点上。并进行健康检查
$ systemctl stop kudu-master
$ sudo -u kudu kudu master list bigdata01:7051,bigdata02:7051,bigdata03:7051,bigdata04:7051,bigdata05:7051,bigdata06:7051
$ sudo -u kudu kudu cluster ksck bigdata01:7051,bigdata02:7051,bigdata03:7051,bigdata04:7051,bigdata05:7051,bigdata06:7051
# 删除不需要的 master
$ sudo -u kudu kudu master remove bigdata01:7051,bigdata02:7051,bigdata03:7051,bigdata04:7051,bigdata05:7051,bigdata06:7051 bigdata01:7051
$ sudo -u kudu kudu master remove bigdata01:7051,bigdata02:7051,bigdata03:7051,bigdata04:7051,bigdata05:7051,bigdata06:7051 bigdata02:7051
$ sudo -u kudu kudu master remove bigdata01:7051,bigdata02:7051,bigdata03:7051,bigdata04:7051,bigdata05:7051,bigdata06:7051 bigdata03:7051
# 修改所有未删除 master 配置
$ sed -ri 's#^(--master_addresses).*#\1=bigdata04:7051,bigdata05:7051,bigdata06:7051#' master.gflagfile
# 逐个重启所有未删除的 master
$ systemctl restart kudu-master
$ systemctl status kudu-master
$ netstat -ntlp | grep kudu
# 修改所有 tserver 的配置
$ sed -ri 's#^(--tserver_master_addrs).*#\1=bigdata04:7051,bigdata05:7051,bigdata06:7051#' tserver.gflagfile
# 逐个重启所有 tserver,并且检查状态
$ systemctl restart kudu-tserver
$ systemctl status kudu-tserver
$ netstat -ntlp | grep kudu
# 健康检查
$ sudo -u kudu kudu cluster ksck bigdata04:7051,bigdata05:7051,bigdata06:7051
三、kudu-tserver 迁移
kudu-tserver 的迁移自主恢复机制和 rebalance 有两种方式。
- 自主恢复机制:当 tserver 服务停机超过 5分钟(默认),则停机的 tserver 上的副本将被可用 tserver 上的新副本替换,所以可以利用 kudu 的这种机制来实现迁移。不过需要注意副本数,停掉 tserver 后还需要保证只要有超过一半的 tablet replicas 可用,不然会影响读写;如果是单副本,还会导致数据丢失。
- rabalance:重平衡工具,用在 tserver 之间移动平衡副本。 从 kudu 1.12 开始,kudu rabalance 通过提供 –ignored_tservers 和 –move_replicas_from_ignored_tservers 参数来停用 tserver。
因为线下 kudu 有些表是单副本,无法使用自主恢复机制来进行迁移,所以这次迁移选择 rabalance 来实现。大体流程是先将 tserver 置于维护模式,然后使用 rabalance 来迁移副本开实现迁移。
1、流程
官方建议是不要一次停用多个 tserver。要从集群中移除多个 tserver,请按照以下步骤针对每个 tserver 进行操作。确保在关闭下一台 tserver 之前,上一台 tserver 已从群集中移除,且健康检查运行正常。
- 使用
kudu cluster ksck
命令进行集群健康检查,确保集群出于健康状态 - 将新的 3 台 tserver 服务添加到集群里来。
- 使用
kudu tserver state enter_maintenance
命令将 tserver 置于维护模式。 - 运行
kudu cluster rebalance
工具,向--ignored_tservers
参数提供要停用的 tserver 的 UUID 和加上--move_replicas_from_ignored_tservers
选项。 - 等待要停机的 tserver 上副本移动完成并等待 ksck 显示集群处于健康状态。
- 此时要停机的 tserver 可以关闭脱离集群了。
- 逐个重启所有的 master,将停机的 tserver 从集群中完全删除。
2、相关命令
(1)rebalance
官方文档:https://kudu.apache.org/releases/1.15.0/docs/command_line_tools_reference.html#cluster-rebalance
语法:kudu cluster rebalance <master_addresses>
选项:
- –ignored_tservers:重新平衡集群时要忽略的 tserver UUID(多个逗号分隔列表)。如果指定,则重新平衡工具会有效地忽略 tserver,它们不会被视为集群的一部分以及其上的副本。如果未指定,则重新平衡工具将在群集中的所有平板电脑服务器上运行。
- –move_replicas_from_ignored_tservers:当源 tserver 运行正常时,是否将副本从指定的 "ignored_tservers" 移动到其他服务器。仅当同时指定了 ‘–ignored_tservers’ 标志时,此设置才有效。如果设置为 true,则所有被忽略的平板电脑服务器都必须置于 "维护模式"。
(2)maintenance
官方文档:https://kudu.apache.org/releases/1.15.0/docs/command_line_tools_reference.html#state-enter_maintenance
进入维护模式:kudu tserver state enter_maintenance <master_addresses> <tserver_uuid>
退出维护模式:kudu tserver state exit_maintenance <master_addresses> <tserver_uuid>
3、迁移
以下将从 kudu 集群中移除 bigdata01 的 tserver 服务,其它 tserver 的移除按照下面步骤一个个来即可。
# 启动新的 3 台 tserver,将其加入到集群中
$ systemctl start kudu-tserver
$ systemctl status kudu-tserver
$ netstat -ntlp | grep kudu
# 获取 bigdata01 的 uuid,并将 bigdata01 设置为维护状态。
# 此时 bigdata 的状态会变成 MAINTENANCE_MODE。
$ sudo -u kudu kudu tserver list bigdata04:7051,bigdata05:7051,bigdata06:7051 -columns=uuid,rpc-addresses,state,heartbeat
$ sudo -u kudu kudu tserver state enter_maintenance bigdata04:7051,bigdata05:7051,bigdata06:7051 xxxxxx
# 执行重平衡
$ sudo -u kudu kudu cluster rebalance bigdata04:7051,bigdata05:7051,bigdata06:7051 --ignored_tservers xxxxxx --move_replicas_from_ignored_tservers
# 观察进度,可以发现 bigdata01 Tablet Leaders 在逐渐减少。
$ sudo -u kudu kudu cluster ksck bigdata04:7051,bigdata05:7051,bigdata06:7051 | sed -n '/Tablet Server Summary/,/Tablet Server Location Summary/p'
# 当重平衡跑完,健康检查正常,就可以关闭要停机的 tserver 服务了
$ systemctl stop kudu-tserver
# 退出 bigdata01 的维护状态
$ sudo -u kudu kudu tserver state exit_maintenance bigdata04:7051,bigdata05:7051,bigdata06:7051 xxxxxx
# 逐个重启所有的 master
$ systemctl restart kudu-master
$ systemctl status kudu-master
$ netstat -ntlp | grep kudu
# 最后验证检查
$ sudo -u kudu kudu cluster ksck bigdata04:7051,bigdata05:7051,bigdata06:7051
当然,实测是可以一次性移除多台,迁移完后数据没受影响。但是不知道在一次性移除多台过程中,数据的查询和写入会不会受到影响。如一个表 3 个副本,分布在 3 台机器上,一次性将这 3 台机器同时下线,查询和写入会不会影响。
在删除master这一步# 停止所有不需要的 kudu master。我实测不行,除了要删掉的那个master,如果还有其他master也被停掉了,执行remove指令会出现超时
感谢指正,已经更新。
感谢分享