OceanBase 集群由若干个 Zone 组成。从物理层面来讲,一个 Zone 通常是一个独立的物理部署单元,可以是一个数据中心(IDC)或者云上的一个 Zone(可用区),也可以是一个单独的机架(Rack)。通过将 OceanBase 集群部署于不同的 Zone,实现单个 Zone 故障时的故障隔离及快速恢复。
操作步骤
-
使用
root
用户登录到集群的sys
租户。连接示例如下,连接数据库时请以实际环境为准。
obclient -h10.xx.xx.xx -P2883 -uroot@sys#obdemo -p***** -A
有关更加详细的连接数据库的操作指引,参见 连接数据库概述(MySQL 模式) 和 连接数据库概述(Oracle 模式)。
-
查询
oceanbase.DBA_OB_ZONES
视图,获取集群中的 Zone 信息。obclient [(none)]> SELECT * FROM oceanbase.DBA_OB_ZONES; +-------+----------------------------+----------------------------+----------+-----+----------+-----------+ | ZONE | CREATE_TIME | MODIFY_TIME | STATUS | IDC | REGION | TYPE | +-------+----------------------------+----------------------------+----------+-----+----------+-----------+ | zone1 | 2022-12-20 17:50:17.168745 | 2022-12-20 17:50:40.801054 | ACTIVE | HZ0 | hangzhou | ReadWrite | | zone2 | 2022-12-20 17:50:17.168745 | 2022-12-20 17:50:40.809504 | ACTIVE | HZ0 | hangzhou | ReadWrite | | zone3 | 2022-12-20 17:50:17.169804 | 2023-01-11 17:28:57.211079 | ACTIVE | HZ1 | hangzhou | ReadWrite | | zone4 | 2023-01-06 15:30:30.887362 | 2023-01-06 15:30:30.888420 | INACTIVE | hz1 | hangzhou | ReadWrite | +-------+----------------------------+----------------------------+----------+-----+----------+-----------+ 4 rows in set
查询结果中的字段说明如下:
-
ZONE
: Zone 名称。 -
STATUS
: Zone 状态。-
ACTIVE
:表示该 Zone 为可用状态。 -
INACTIVE
:表示该 Zone 为不可用状态。用于客户端识别该状态并将业务流程路由到其他 Zone。新增 Zone 或对 Zone 执行隔离命令(Stop Zone/Force Stop Zone/Isolate Zone)后,该 Zone 的状态会变为
INACTIVE
。通常出现在故障隔离或运维变更等场景。
-
-
IDC
:Zone 所在的机房名。 -
REGION
:Zone 所在的区域,通常为城市名(例如,上海)或者区域名(例如,华东)。 -
TYPE
:Zone 类型,ReadWrite
表示读写类型,当前版本仅支持读写类型的 Zone。
-
OceanBase 数据库是单进程软件,进程名为 observer。通常一台物理或者虚拟服务器运行一个 observer 进程,由 IP 和端口作为唯一标识,称之为节点。
操作步骤
-
使用
root
用户登录到集群的sys
租户。连接示例如下,连接数据库时请以实际环境为准。
obclient -h10.xx.xx.xx -P2883 -uroot@sys#obdemo -p***** -A
有关更加详细的连接数据库的操作指引,参见 连接数据库概述(MySQL 模式) 和 连接数据库概述(Oracle 模式)。
-
查询
DBA_OB_SERVERS
视图,获取集群中的所有节点信息。obclient [(none)]> SELECT * FROM oceanbase.DBA_OB_SERVERS; +-------------+----------+----+--------------+----------+-----------------+--------+----------------------------+-----------+-----------------------+----------------------------+----------------------------+-------------------------------------------------------------------------------------------+ | SVR_IP | SVR_PORT | ID | ZONE | SQL_PORT | WITH_ROOTSERVER | STATUS | START_SERVICE_TIME | STOP_TIME | BLOCK_MIGRATE_IN_TIME | CREATE_TIME | MODIFY_TIME | BUILD_VERSION | +-------------+----------+----+--------------+----------+-----------------+--------+----------------------------+-----------+-----------------------+----------------------------+----------------------------+-------------------------------------------------------------------------------------------+ | 172.xx.xx.xx| 2882 | 3 | sa128_obv4_3 | 2881 | NO | ACTIVE | 2022-11-14 12:28:49.796499 | NULL | NULL | 2022-11-03 15:37:09.530894 | 2022-11-14 12:28:50.795464 | 4.0.0.0_100000302022111120-7cef93737c5cd03331b5f29130c6e80ac950d33b(Nov 11 2022 20:38:33) | | 172.xx.xx.xx| 2882 | 1 | sa128_obv4_1 | 2881 | NO | ACTIVE | 2022-11-14 11:57:31.763941 | NULL | NULL | 2022-11-03 15:37:08.990683 | 2022-11-14 11:57:32.762787 | 4.0.0.0_100000302022111120-7cef93737c5cd03331b5f29130c6e80ac950d33b(Nov 11 2022 20:38:33) | | 172.xx.xx.xx| 2882 | 2 | sa128_obv4_2 | 2881 | YES | ACTIVE | 2022-11-14 11:35:34.223948 | NULL | NULL | 2022-11-03 15:37:09.490511 | 2022-11-14 11:37:26.542479 | 4.0.0.0_100000302022111120-7cef93737c5cd03331b5f29130c6e80ac950d33b(Nov 11 2022 20:38:33) | +-------------+----------+----+--------------+----------+-----------------+--------+----------------------------+-----------+-----------------------+----------------------------+----------------------------+-------------------------------------------------------------------------------------------+ 3 rows in set
查询结果中的相关字段说明如下:
-
SVR_IP
:节点 IP。 -
SVR_PORT
:节点的 RPC 端口。 -
ZONE
:节点所在的 Zone。 -
SQL_PORT
:节点的 SQL 端口,可以使用该端口通过直连方式连接 OceanBase 数据库。 -
WITH_ROOTSERVER
:该节点是否为集群 RS(RootServer),RS 负责处理集群管理操作。 -
STATUS
:节点的状态。-
ACTIVE
:表示该节点为可用状态。 -
INACTIVE
:表示该节点为宕机状态。 -
DELETING
:表示该节点正在被删除。
-
-
STOP_TIME
:用户主动停止节点服务的时间点。如果值为NULL
,表示节点服务正常运行。 -
START_SERVICE_TIME
:节点进程启动后,可以对外提供服务的时间点。如果值为NULL
,表示节点进程未启动或节点状态不可用。 -
BLOCK_MIGRATE_IN_TIME
:禁止副本迁入的开始时间点。如果为NULL
,表示副本正常迁入。 -
BUILD_VERSION
:OceanBase 数据库软件的版本号。
-
重启是常见运维动作之一,适用于对机器进行短暂维修,以及修改系统配置项后需要重启生效的场景。重启过程中节点的下线时间需要在配置项 server_permanent_offline_time
设置的时间以内,否则会被永久下线。如果机器长时间维修,需要走机器替换流程,有关机器替换的详细操作请参见 替换节点。
说明
集群级配置项 server_permanent_offline_time
用于设置节点心跳中断的时间阈值,即节点心跳中断多久后认为其被永久下线,永久下线的节点上的数据副本需要被自动补足。默认为 3600s。有关该配置项的更多详细信息,请参见 server_permanent_offline_time。
背景信息
OceanBase 数据库作为一款分布式数据库,典型的部署架构为多副本部署(例如,同城三中心部署架构为 3 份副本,三地五中心部署架构为 5 份副本)。事务提交时利用 Paxos 协议在多个副本间达成多数派提交,从而维护副本之间的数据一致性,在少数派副本异常的情况下达成 RPO=0 的 SLA。
STOP SERVER
命令在多副本架构的基础上能够达到业务无损的重启效果,STOP SERVER
命令执行以下逻辑:
-
将待重启节点上的 Leader 全部切走,并保证除了重启节点以外的其他节点上的副本满足多数派。
-
在 Root Service 上将待重启节点标记为 stopped(节点状态为
ACTIVE
状态且stop_time
字段大于 0),客户端识别后,不会将业务请求路由到该节点。
最终成功 Stop Server 后,重启节点不会引起无主选举及客户端报错等问题,对业务流量完全透明。如果 Stop Server 操作执行失败,需要停止重启并检查原因,例如,可能出现的原因有缺少副本、RedoLog 延迟、总投票成员数小于多数派等。
操作步骤
重启节点的主要流程为:停止服务 -> 转储 -> 关闭进程 -> 启动进程 -> 启动服务。
本文以重启集群中的一个节点为例提供操作指导,如果需要重启多个节点,请参考本操作执行多次即可。
-
使用
root
用户登录到集群的sys
租户。连接示例如下,连接数据库时请以实际环境为准。
obclient -h10.xx.xx.xx -P2883 -uroot@sys#obdemo -p***** -A
有关更加详细的连接数据库的操作指引,参见 连接数据库概述(MySQL 模式) 和 连接数据库概述(Oracle 模式)。
-
执行以下命令,进行节点隔离。
节点在重启过程中可能会影响服务的连续性,例如,集群只有一个或两个节点、或者租户的数据只分布在两个节点上的场景,重启节点的过程中系统将可能会无法提供服务。执行 Stop Server 操作进行节点隔离时,系统将会执行安全检查,保证节点重启过程中不影响系统服务的连续性。待节点成功隔离后,该节点上将不再提供服务。如果 Stop Server 操作失败,则需要检查集群的部署情况或根据报错信息解决问题后再重新执行 Stop Server 操作;或者如果可以接受节点停止服务,也可以跳过本步骤。
obclient [(none)]> ALTER SYSTEM STOP SERVER 'svr_ip:svr_port';
相关参数说明如下:
-
svr_ip
:表示待停止的节点所在的 IP。 -
svr_port
:表示待停止的节点的 RPC 端口,默认为 2882。
示例如下:
obclient [(none)]> ALTER SYSTEM STOP SERVER '172.xx.xx.xx:2882';
执行成功后,可以查询
oceanbase.DBA_OB_SERVERS
视图中该 Server 的STATUS
字段,可以看到字段值仍为ACTIVE
不变,但STOP_TIME
字段的值由NULL
变为停止服务的时间点。查询
oceanbase.DBA_OB_SERVERS
视图的具体操作可参见 查看节点。 -
-
执行以下命令,对待重启的节点进行转储操作,以便缩短重启后回放 Redo Log 的时间,加速重启。
obclient [(none)]> ALTER SYSTEM MINOR FREEZE SERVER = ('svr_ip:svr_port');
相关参数说明如下:
-
svr_ip
:表示待重启的节点的 IP。 -
svr_port
:表示待重启的节点的 RPC 端口,默认为 2882。
示例如下:
obclient [(none)]> ALTER SYSTEM MINOR FREEZE SERVER = ('172.xx.xx.xx:2882');
执行转储操作后,需要等待转储结束方可执行下一步操作,查看转储进度的相关操作请参见 查看转储信息。
更多转储相关的详细介绍,请参见 转储。
-
-
停止 observer 进程。
-
使用
admin
用户登录待停止进程的节点所在的机器。 -
通过命令行工具进入
/home/admin/oceanbase
目录。[admin@xxx /]$ cd /home/admin/oceanbase
更多 OceanBase 数据库软件的安装目录的详细介绍信息,请参见 OBServer 安装目录结构。
-
执行以下命令,查看并获取节点的进程 ID。
[admin@xxx oceanbase]$ ps -ef | grep observer | grep -v grep admin 103364 1 99 2022 ? 51-17:24:41 /home/admin/oceanbase/bin/observer
示例中,
103364
即为节点的进程 ID。 -
停止 observer 进程。
命令如下:
[admin@xxx oceanbase]$ kill -9 pid
其中,
pid
为待停止的节点的 observer 进程 ID。示例如下:
[admin@xxx oceanbase]$ kill -9 103364
注意
一个部署目录只能停止该节点上的一个 observer 进程,如果需要停止多个节点上的 observer 进程,则需要依次登录多台机器进行操作。
-
执行以下命令,确认进程是否已停止。
[admin@xxx oceanbase]$ ps aux | grep observer
如果命令执行后没有返回信息,则表示进程停止成功。
-
-
(可选)如果需要维修机器,在本步骤对机器进行短暂的维修。
-
启动 observer 进程。
-
使用
admin
用户登录待启动进程的节点所在的机器。 -
启动 observer 进程。
[admin@xxx oceanbase]$ cd /home/admin/oceanbase && ./bin/observer
注意
一个部署目录只能启动该节点上的一个 observer 进程,如果需要启动多个节点上的 observer 进程,则需要依次登录多台机器进行操作。
更多 OceanBase 数据库软件的安装目录的详细介绍信息,请参见 OBServer 安装目录结构。
执行成功后,可以查询
oceanbase.DBA_OB_SERVERS
视图中的START_SERVICE_TIME
字段,如果该值不为NULL
,则表示 observer 进程启动成功。
-
-
执行以下命令,启动节点服务。
obclient [(none)]> ALTER SYSTEM START SERVER 'svr_ip:svr_port';
其中:
-
svr_ip
:表示待启动的节点的 IP。 -
svr_port
:表示待启动的节点的 RPC 端口,默认为 2882。
示例如下:
obclient [(none)]> ALTER SYSTEM START SERVER '172.xx.xx.xx:2882';
执行成功后,可以查询
oceanbase.DBA_OB_SERVERS
视图中的STOP_TIME
字段,如果该值为NULL
,则表示该节点启动服务成功,可以对外提供服务。 -
可以向 OceanBase 集群中添加节点,添加节点适用于弹性扩容场景和调整部署场景。
-
弹性扩容场景:扩容后,Zone 内有更多的节点容纳 Unit,从而可以执行后续的迁移 Unit、调整租户的
UNIT_NUM
、新建租户等操作。 -
调整部署场景:调整部署场景,包括将集群的部署方式从同城三中心调整为三地五中心,以及机房裁撤场景下将 Zone 从一个机房搬迁到另一个机房。该场景需要先增加 Zone,再在该 Zone 内增加节点,然后调整租户的 Locatity 属性。
OceanBase 数据库的弹性扩容能力相比于传统数据库具有明显的架构优势。传统数据库的数据存放于一台机器上,而 OceanBase 数据库能够把数据打散到不同机器,从而能够解决可扩展性的问题,真正体现出分布式架构的优势。当集群或者租户的容量不足时,只需要增加更多的节点,集群就能够容纳更多的租户,租户也能够容纳更多的数据和业务流量。同样,在集群或者租户的容量富余时,也可以将节点下线,从而降低成本。
多副本部署能力同样是 OceanBase 数据库相比于传统数据库的架构优势,多副本部署能力是 OceanBase 数据库具备多级无损容灾能力的基础,包括单机级无损容灾、机房级无损容灾、城市级无损容灾等能力。此外,OceanBase 数据库支持灵活地调整集群部署架构,从而可以满足业务场景的技术演进。
前提条件
-
请确认待增加的所有 OBServer 服务器已完成相关配置,具体操作可参见 部署前准备 章节。
-
添加节点前需要为所有 OBServer 服务器安装数据库软件,您可以从 OceanBase 官网的下载中心下载对应版本的 OceanBase 数据库软件安装包,或者从 OceanBase 技术支持人员处获取。
操作步骤
说明
本节主要介绍如何通过命令手动向集群中添加节点,对于 OceanBase 数据库社区版,如果需要通过 obd 向 OceanBase 集群中添加节点,可参考 obd 产品文档 中 集群扩容 的相关内容进行操作。
-
(可选)对于需要添加 Zone 后再向该 Zone 中添加节点的场景,请确认已添加新的 Zone,添加 Zone 的操作请参见 添加 Zone。
-
通过
ssh
登录到待添加的 OBServer 服务器,初始化 OBServer 服务器并配置时钟源。初始化 OBServer 服务器的详细操作,请参见 使用 oatcli 初始化 OBServer 服务器。
配置时钟源的详细操作,请参见 配置时钟源。
-
通过
ssh
登录到待添加的 OBServer 服务器,安装 OceanBase 数据库的 RPM 包。在添加节点前,需要为待添加的所有 OBServer 服务器安装数据库软件。
命令如下:
[root@xxx /]#cd $rpm_dir [root@xxx $rpm_dir]#rpm -ivh $rpm_name
其中,
rpm_dir
表示存放 RPM 包的目录;$rpm_name
表示 RPM 包的名称。 -
初始化 OceanBase 数据库的目录。
OceanBase 数据库的数据目录通常建议设置在独立的磁盘上,然后通过软链接方式链接到软件的
Home
目录下面。[root@xxx admin]#su - admin -bash-4.2$ mkdir -p /data/1/$cluster_name/{etc3,sort_dir,sstable,slog} -bash-4.2$ mkdir -p /data/log1/$cluster_name/{clog,etc2,ilog,oob_clog} -bash-4.2$ mkdir -p /home/admin/oceanbase/store/$cluster_name -bash-4.2$ for t in {etc3,sort_dir,sstable,slog};do ln -s /data/1/$cluster_name/$t /home/admin/oceanbase/store/$cluster_name/$t; done -bash-4.2$ for t in {clog,etc2,ilog,oob_clog};do ln -s /data/log1/$cluster_name/$t /home/admin/oceanbase/store/$cluster_name/$t; done
其中,
cluster_name
表示待添加 OBServer 服务器的集群名。示例如下:
[root@xxx admin]#su - admin -bash-4.2$ mkdir -p /data/1/obdemo/{etc3,sort_dir,sstable,slog} -bash-4.2$ mkdir -p /data/log1/obdemo/{clog,etc2,ilog,oob_clog} -bash-4.2$ mkdir -p /home/admin/oceanbase/store/obdemo -bash-4.2$ for t in {etc3,sort_dir,sstable,slog};do ln -s /data/1/obdemo/$t /home/admin/oceanbase/store/obdemo/$t; done -bash-4.2$ for t in {clog,etc2,ilog,oob_clog};do ln -s /data/log1/obdemo/$t /home/admin/oceanbase/store/obdemo/$t; done
-
启动节点 observer 进程。
执行以下命令,启动 observer 进程。
[root@xxx admin]$ su - admin -bash-4.2$ cd /home/admin/oceanbase -bash-4.2$ ./bin/observer -I xx.xx.xx.xx -P XXXX -p YYYY -z zone1 -d /home/admin/oceanbase/store/obdemo -r 'xx.xx.xx.xx:xxxx:yyyy' -c 20190716 -n obdemo -o "system_memory=30GB,datafile_size=100G,config_additional_dir=/data/1/obdemo/etc3;/data/log1/obdemo/etc2"
相关参数说明如下:
-
-I
:参数用于指定待启动的节点 IP。在多机部署场景下,不能指定127.0.0.1
作为目标 IP。通过指定网卡名来启动节点(例如
-i eth0
)的方式在当前版本依然可以使用,但建议使用指定 IP(例如,-I 10.10.10.1
)来启动。此外,通过同时指定 IP 和网卡名(例如-I 10.10.10.1 -i eth0
)来启动节点也可以,但不建议这么用。对于当前版本,支持指定的节点 IP 为 ipv6 地址,使用时需要注意以下事项:
- ipv6 地址分为 Global 地址和 Link 地址,建议使用 Global 地址。
- 需要在
-I
前,添加-6
。
-
-c
:用于指定集群 ID。其值可通过SHOW PARAMETERS LIKE 'cluster_id';
语句获取。 -
-p
:用于指定 SQL 端口号。一般为 2881,除非有明确目的,一般不建议修改。 -
-P
:用于指定 RPC 端口号。一般为 2882,除非有明确目的,不建议修改。 -
-n
:用于指定集群名。其值可通过SHOW PARAMETERS LIKE 'cluster';
语句获取。本示例中集群名为obdemo
。 -
-z
:用于指定待加入的 Zone。可通过视图DBA_OB_ZONES
查看集群中的 Zone 名。 -
-d
:用于指定数据目录。 -
-r
:用于指定待添加的 OceanBase 集群的 RS 地址列表。指定的地址为 ipv6 地址时,需要注意以下事项:
- ipv6 地址分为 Global 地址和 Link 地址,建议使用 Global 地址。
- IP 地址需要使用
[]
包裹。 - 需要在
-r
前,添加-6
。
-
-l
:用于指定日志的级别,本示例中为WARN
,表示日志级别为 WARNING 级别。有关 OceanBase 数据库日志级别的详细介绍,请参见 日志级别。
-
-o
:用于指定集群的启动配置项,需要根据实际情况配置。使用
-o
参数时,需满足以下条件:-
不分大小写,但是推荐按照
observer.config.bin
中的名称来写。 -
配置项名不能包含以下特殊字符:空格、
\r
、\n
、\t
-
配置项名和配置项值中间必须有等号(=)。
-
配置项之间使用英文逗号(,)进行分割。
语句中:
system_memory
:用于指定 OceanBase 数据库内部保留内存,默认是 30G。datafile_size
:用于指定 OceanBase 数据库数据文件 SSTable 的大小(一次性初始化),根据/data/1/
可用空间评估,建议不少于 100G,同时又保留一些剩余空间。config_additional_dir
:用于指定参数文件的冗余目录。
-
示例如下:
[root@xxx admin]$ su - admin -bash-4.2$ cd /home/admin/oceanbase -bash-4.2$ ./bin/observer -I xx.xx.xx.1 -c 20221216 -p 2881 -P 2882 -z zone4 -n obdemo -d /home/admin/oceanbase/store/obdemo -r 'xx.xx.xx.1:2882:2881' -l WARN -o "system_memory=30GB,datafile_size=100G,config_additional_dir=/data/1/obdemo/etc3;/data/log1/obdemo/etc2"
使用 ipv6 地址启动的示例如下:
[root@xxx admin]$ su - admin -bash-4.2$ cd /home/admin/oceanbase -bash-4.2$ ./bin/observer -6 -I xxxx:xxxx:xxxx:xxxx:xxx:xxxx:xxxx:ebd8 -c 20221216 -p 2881 -P 2882 -z zone4 -n obdemo -d /home/admin/oceanbase/store/obdemo -r '[xxxx:xxxx:xxxx:xxxx:xxx:xxxx:xxxx:ebd8]:2882:2881' -l WARN -o "system_memory=30GB,datafile_size=100G,config_additional_dir=/data/1/obdemo/etc3;/data/log1/obdemo/etc2"
-
-
(可选)如果需要添加多个节点,请重复执行步骤 2 ~ 5。
-
向集群中添加节点。
-
使用
root
用户登录到集群的sys
租户。连接示例如下,连接数据库时请以实际环境为准。
obclient -h10.xx.xx.xx -P2883 -uroot@sys#obdemo -p***** -A
有关更加详细的连接数据库的操作指引,参见 连接数据库概述(MySQL 模式) 和 连接数据库概述(Oracle 模式)。
-
执行以下命令,向集群的 Zone 中添加节点。
ALTER SYSTEM ADD SERVER 'svr_ip:svr_port' [,'svr_ip:svr_port'...] [ZONE [=] 'zone_name'];
相关参数说明如下:
-
svr_ip
:表示待添加的节点的 IP。 -
svr_port
:表示待添加的节点的 RPC 端口。默认为2882
。 -
zone_name
:表示待添加节点的 Zone。
示例如下:
ALTER SYSTEM ADD SERVER '10.xx.xx.xx:2882','10.xx.xx.xx:2882' ZONE 'zone4';
该操作会将 OBServer 服务器加入到服务列表,只有服务列表中的 OBServer 服务器才可以提供服务。
-
-
-
执行成功后,可以查询
DBA_OB_SERVERS
视图进行确认。查询示例如下:
SELECT * FROM oceanbase.DBA_OB_SERVERS;
列表中有刚刚添加的 OBServer 服务器,则表示添加成功。
可以向 OceanBase 集群中删除节点,删除节点是添加节点的逆向操作,适用于弹性缩容场景和调整部署场景。
-
弹性缩容场景:集群中有资源富余时,可以通过调整 Unit 分布、缩减租户的
UNIT_NUM
等操作来减少节点的资源占用,并最终通过删除节点来下线机器。 -
调整部署场景:调整集群的部署架构时,如果调整租户的 Locality 属性后使得某 Zone 内不再分布有任何租户的 Unit,可以通过 Stop Zone -> Delete Server -> Delete Zone 等一系列操作下线该 Zone。
注意事项
Delete Server 操作涉及到负载均衡,被删除的节点上的资源单元(称为 Unit )会在同一个 Zone 中进行迁移。Unit 的迁移动作是 Unit 自动均衡的过程,主要由 Root Service 控制。待 Unit 迁移成功,Delete Server 操作即可执行成功。如果您想要选择待删除节点上 Unit 迁移的目标机器,可以手动执行 Unit 迁移。
注意
删除节点会减少可用资源,如果同 Zone 中其他节点的剩余资源不足以容纳待删除节点上的 Unit,将会导致 Unit 迁移失败,故在执行删除节点之前建议先查询 oceanbase.GV$OB_SERVERS
视图判断 Zone 内各节点的资源使用情况。
Unit 自动迁移过程中,迁移任务会占用迁出节点与迁入节点的网络资源和 IO 资源,从而使迁移流量与业务流量叠加,并导致业务流量受影响。为了避免业务流程受影响:
-
可以先执行 Stop Zone 操作后再执行 Delete Server 操作,确保两种流量不发生叠加。
Stop Zone 的相关操作请参见 隔离节点。
-
也可以调整迁移任务的相关配置项来控制迁移速度。
迁移任务相关的配置项如下表所示。
配置项名 描述 balancer_idle_time 租户级配置项,可以控制每次发起迁移任务的时间间隔。默认值为 10s,表示 10 秒,取值范围为 [10s, +∞)。 sys_bkgd_net_percentage 集群级配置项,可以控制迁移任务占用网卡带宽的百分比。默认值为 60,取值范围为 [0, 100]。 查看并修改各配置项值的相关操作请参见 修改集群配置项。
操作步骤
-
使用
root
用户登录到集群的sys
租户。连接示例如下,连接数据库时请以实际环境为准。
obclient -h10.xx.xx.xx -P2883 -uroot@sys#obdemo -p***** -A
有关更加详细的连接数据库的操作指引,参见 连接数据库概述(MySQL 模式) 和 连接数据库概述(Oracle 模式)。
-
(可选)手动迁移待删除节点上的 Unit。
注意
下线节点时,建议您先手动迁移待删除的节点上的 Unit 后再执行 Delete Server 操作。
-
查看当前 Unit 分布,获取待迁移的 Unit 的 ID。
obclient [(none)]> SELECT UNIT_ID,TENANT_ID,STATUS,ZONE,SVR_IP FROM oceanbase.DBA_OB_UNITS; +---------+-----------+--------+-------+----------------+ | UNIT_ID | TENANT_ID | STATUS | ZONE | SVR_IP | +---------+-----------+--------+-------+----------------+ | 1 | 1 | ACTIVE | zone1 | xx.xx.xx.237 | | 2 | 1 | ACTIVE | zone2 | xx.xx.xx.238 | | 3 | 1 | ACTIVE | zone3 | xx.xx.xx.218 | | 1001 | 1002 | ACTIVE | zone3 | xx.xx.xx.218 | | 1002 | 1002 | ACTIVE | zone1 | xx.xx.xx.237 | | 1003 | 1002 | ACTIVE | zone2 | xx.xx.xx.238 | | 1010 | 1008 | ACTIVE | zone3 | xx.xx.xx.218 | | 1011 | 1008 | ACTIVE | zone2 | xx.xx.xx.238 | | 1012 | 1008 | ACTIVE | zone1 | xx.xx.xx.237 | | 1013 | 1010 | ACTIVE | zone3 | xx.xx.xx.218 | | 1014 | 1010 | ACTIVE | zone1 | xx.xx.xx.237 | | 1015 | 1010 | ACTIVE | zone2 | xx.xx.xx.238 | | 1016 | NULL | ACTIVE | zone1 | xx.xx.xx.237 | | 1017 | NULL | ACTIVE | zone2 | xx.xx.xx.238 | +---------+-----------+--------+-------+----------------+ 14 rows in set
其中:
-
UNIT_ID
:表示节点上各 Unit 的 ID。 -
TENANT_ID
:表示该 Unit 所属的租户 ID。如果值为NULL
,表示当前 Unit 不属于任何租户。 -
STATUS
:表示该 Unit 当前的状态:-
ACTIVE
:正常状态 -
DELETING
:正在删除状态
-
-
ZONE
:表示该 Unit 所属的 Zone。 -
SVR_IP
:表示该 Unit 所属的节点 IP。
有关
DBA_OB_UNITS
视图的更多说明,请参见 DBA_OB_UNITS。 -
-
根据查询结果,执行以下命令,手动迁移 Unit。
语句如下:
obclient [(none)]> ALTER SYSTEM MIGRATE UNIT = unit_id DESTINATION = 'svr_ip:svr_port';
相关参数说明如下:
-
unit_id
:表示待迁移的 Unit 的 ID。 -
svr_ip
:指定 Unit 迁移后的节点的 IP。 -
svr_port
:指定 Unit 迁移后的节点的 RPC 端口。
将 ID 为
1012
的 Unit 迁移到同 Zone 的172.xx.xx.xx
服务器上的示例如下:obclient [(none)]> ALTER SYSTEM MIGRATE UNIT = 1012 DESTINATION = '172.xx.xx.xx:2882';
该命令可多次执行,如果手动迁移 Unit 失败,可以根据报错信息解决问题后再重新执行。
更多关于 Unit 迁移的操作及说明,请参见 Unit 迁移。
-
-
-
执行以下命令,删除节点。
语句如下:
obclient [(none)]> ALTER SYSTEM DELETE SERVER 'svr_ip:svr_port' [,'svr_ip:svr_port'...] [ZONE [=] 'zone_name']
相关参数说明如下:
-
svr_ip
:表示待删除的节点的 IP。 -
svr_port
:表示待删除的节点的 RPC 端口。 -
zone_name
:待删除的节点所属的 Zone。如果需要删除多个节点,多个节点要求必须在同一 Zone 内。
删除
zone1
中的一台 OBServer 服务器,示例如下:obclient [(none)]> ALTER SYSTEM DELETE SERVER "172.xx.xx.xx:2882" zone='zone1'
-
-
待所有操作结束后,查询
oceanbase.DBA_OB_SERVERS
视图,确认节点是否删除成功。obclient [(none)]> SELECT * FROM oceanbase.DBA_OB_SERVERS;
如果列表中已经查询不到该节点,则表示删除成功。如果列表中仍然有该节点,且该节点的状态为
DELETING
,则表示该节点仍然在删除状态中。对于未手动迁移 Unit 而是直接执行 Delete Server 操作的场景,可能会导致节点删除失败,确认节点删除失败后,可以参考 后续操作 进行处理。
后续操作
对于未手动迁移 Unit 而是直接执行 Delete Server 操作的场景,由于 Unit 均衡过程中可能会发生资源不足,即同 Zone 中其他节点的剩余资源不足以容纳待删除节点上的 Unit,将会导致 Unit 迁移失败,从而使该节点持续在删除状态中。您可以通过 Root Service 机器上的 /home/admin/oceanbase/log/rootservice.log
查看 Unit 是否迁移失败。如果确认是 Unit 迁移失败,则需要执行 Cancel Delete Server 操作,然后向 Zone 内添加节点对集群扩容后再重新删除节点。向 Zone 内添加节点的相关操作请参见 添加节点。
Cancel Delete Server 的具体操作如下:
-
使用
root
用户登录到集群的sys
租户。连接示例如下,连接数据库时请以实际环境为准。
obclient -h10.xx.xx.xx -P2883 -uroot@sys#obdemo -p***** -A
-
执行以下语句,取消删除节点。
语句如下:
obclient [(none)]> ALTER SYSTEM CANCEL DELETE SERVER 'svr_ip:svr_port' [,'svr_ip:svr_port'...] [ZONE [=] 'zone_name']
相关参数说明如下:
-
svr_ip
:表示待取消删除的节点的 IP。 -
svr_port
:表示待取消删除的节点的 RPC 端口,默认为 2882。 -
zone_name
:待取消删除的节点所属的 Zone。
示例如下:
obclient [(none)]> ALTER SYSTEM CANCEL DELETE SERVER '172.xx.xx.xx:2882' zone='zone1';
-
-
查询
oceanbase.DBA_OB_SERVERS
视图,确认节点是否取消删除成功。obclient [(none)]> SELECT * FROM oceanbase.DBA_OB_SERVERS;
如果待取消删除的 OBServer 的状态从
DELETING
变为ACTIVE
,则表示取消删除成功。