• Post author:
  • Post category:kudu
  • Post comments:1评论

官方文档:

迁移到多个 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_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 bigdata04:7051
$ sudo -u kudu kudu master remove bigdata01:7051,bigdata02:7051,bigdata03:7051,bigdata04:7051,bigdata05:7051,bigdata06:7051 bigdata05:7051
$ sudo -u kudu kudu master remove bigdata01:7051,bigdata02:7051,bigdata03:7051,bigdata04:7051,bigdata05:7051,bigdata06:7051 bigdata05: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 台机器同时下线,查询和写入会不会影响。

这篇文章有一个评论

  1. Avatar photo
    第 匿名页

    感谢分享

发表评论

验证码: 6 + 2 =