@[oceanbase集群管理]

一、集群介绍

OceanBase 数据库是一款分布式数据库,由多个物理上分散的数据库单元组成,通过计算机网络将这些数据库单元组成的逻辑上的统一整体,称之为 OceanBase 集群。

OceanBase 集群由若干个 Zone 组成,Zone 是一个逻辑概念,是对节点进行管理的容器,一般是具有相似容灾属性的一组节点的组合。从物理层面来讲,一个 Zone 通常是一个独立的物理部署单元,可以是一个数据中心(IDC)或者云上的一个可用区,也可以是一个单独的机架(Rack)。通过将 OceanBase 集群部署于不同的 Zone,实现单个 Zone 故障时的故障隔离及快速恢复。

OceanBase 数据库是单进程软件,进程名为 observer。通常一台物理或者虚拟服务器运行一个 observer 进程,由 IP 和端口作为唯一标识,我们称之为节点,也可以用 OBServer 节点表示。observer 进程作为 OceanBase 数据库最核心的组件,负责几乎所有数据库内核功能,包括 SQL 引擎、存储引擎和事务引擎。分布式的功能也同样在这个进程中,包括 RPC 通信、分区管理和负载均衡等。

二、集群配置项

OceanBase 数据库的 observer 进程首次启动时需要指定某些必需配置项。除了必需配置项以外,如果没有指定,则使用系统指定的 Default 值。进程启动成功后,参数值将持久化到 /home/admin/oceanbase/etc/observer.config.bin 文件中,可以通过 strings observer.config.bin 命令来查看文件中的内容。非首次启动时,系统会读取持久化文件中的配置项,如果无需修改,则无需再次指定任何配置项。
配置项级别
OceanBase 数据库的配置项分为集群级配置项和租户级配置项。

集群级配置项:作用范围为整个集群所有 OBServer 节点。
租户级配置项:作用范围为当前租户在集群内所在的 OBServer 节点。

1.查看配置项的级别和生效方式

1.1通过 SHOW 语句查看集群配置项

SHOW PARAMETERS LIKE 'max_syslog_file_count';

其中:

scope 列表示该配置项的级别,如果对应的值为 CLUSTER,则表示该配置项为集群级别;如果对应的值为 TENANT,则表示该配置项为租户级别。

edit_level 列表示该配置项的生效方式,一般分为动态生效和重启生效两种方式,dynamic_effective 表示动态生效;static_effective 表示重启生效。大部分配置项为动态生效方式,即不需要重启 OBServer 即可生效。

1.2通过 GV$OB_PARAMETERS 视图查看集群配置项

USE oceanbase;
SELECT * FROM GV$OB_PARAMETERS WHERE NAME LIKE '%syslog_level%';

2.修改集群配置项

ALTER SYSTEM [SET] parameter_name = expression 
    [SCOPE = {SPFILE | BOTH}]
    [SERVER [=] 'svr_ip:svr_port' | ZONE [=] 'zone' | TENANT [=] {all | all_user|all_meta|tenant_name} ];

相关参数说明如下:

expression 用于指定修改后该配置项的值。

SCOPE 用于指定本次配置项修改的生效范围,默认值为 BOTH。其中:

SPFILE:表示仅修改配置表中的配置项值,当 OBServer 服务器重启以后才生效。

BOTH:表示既修改配置表,又修改内存值,修改后立即生效,且 OBServer 重启以后配置值仍然生效。

TENANT:用于系统租户修改所有用户租户、所有 Meta 租户或指定租户的租户级配置项。

all 和 all_user:所有用户租户。
all_meta:所有 Meta 租户。

tenant_name:指定租户的租户名。

SERVER 表示指定集群中要修改的 OBServer 服务器,ZONE 表示指定集群中要修改的 Zone。ALTER SYSTEM 语句不能同时指定 Zone 和 Server。并且在指定 Zone 时,仅支持指定一个 Zone;指定 Server 时,仅支持指定一个 Server。如果修改集群级配置项时,不指定 Zone 也不指定 Server,则表示该修改在整个集群内生效。

在修改集群配置项时,集群级别的配置项不能通过用户租户设置,也不可以通过系统租户(即 sys 租户) 指定为用户租户设置。

例如,执行 ALTER SYSTEM SET memory_limit=‘100G’ TENANT=‘test_tenant’ 语句将导致报错,因为 memory_limit 是集群级别的配置项。确认一个配置项为集群级别还是租户级别,可根据 SHOW PARAMETERS LIKE ‘parameter_name’; 语句执行结果中的 scope 列对应的值来判断:

scope 值为 CLUSTER 则表示为集群级别的配置项。

scope 值为 TENANT 则表示为租户级别的配置项。

三、集群常见操作

1. Zone

1.1查看zone

SELECT * FROM oceanbase.DBA_OB_ZONES;

查询结果中的字段说明如下:

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。

1.2 添加zone

ALTER SYSTEM ADD ZONE zone_name [IDC [=] 'idc_name', REGION [=] 'region_name', ZONE_TYPE [=] 'ReadWrite'];
ALTER SYSTEM ADD ZONE zone4 IDC 'sz1', REGION 'shenzhen';

相关参数说明如下:

zone_name:待添加的 Zone 的名称,每条语句每次仅支持添加一个 Zone。如果需要添加多个 Zone,需要重复执行该语句。

idc_name:指定 Zone 所在机房的名称。如果不指定,默认为空。

region_name:指定 Zone 所在 Region 的名称,如果不指定,默认值为 default_region。

ZONE_TYPE:指定 Zone 的类型,当前版本仅支持读写 Zone(ReadWrite)。如果不指定,默认为读写 Zone。

1.3启动 Zone

启动 Zone 通常使用在以下场景:

添加了新的 Zone,且该 Zone 的状态为 INACTIVE,当前需要使用该 Zone 内的服务器。

当前 Zone 因业务原因被隔离,且该 Zone 的状态为 INACTIVE,需要执行启动 Zone 操作使 Zone 解除隔离。

ALTER SYSTEM START ZONE zone_name;
#其中,zone_name 为待启动的 Zone 的名称。每条语句每次仅支持启动一个 Zone。DBA_OB_ZONES 视图Zone 的状态从 INACTIVE 变为 ACTIVE,表示 Zone 启动成功。

ALTER SYSTEM START ZONE zone4;

1.4删除 Zone

删除 Zone 通常用于集群缩容的场景中。

前提条件
删除 Zone 前,需要确认以下事项:

请确认该 Zone 下已不存在节点。

SELECT * FROM oceanbase.DBA_OB_SERVERS;

请确认该 Zone 已停止。

##ALTER SYSTEM STOP ZONE zone_name;
ALTER SYSTEM STOP ZONE zone4;
SELECT * FROM oceanbase.DBA_OB_ZONES;

其中,zone_name 为待停止的 Zone 的名称。每条语句每次仅支持停止一个 Zone。

#ALTER SYSTEM DELETE ZONE zone_name;
ALTER SYSTEM DELETE ZONE zone4;
SELECT * FROM oceanbase.DBA_OB_ZONES;

1.5修改 Zone

修改 Zone 主要修改 Zone 所属的 Region 及 IDC 信息。

使用限制
当前不支持修改 Zone 的 ZONE_TYPE。

#ALTER SYSTEM {ALTER|CHANGE|MODIFY} ZONE zone_name SET [IDC [=]'idc_name', REGION [=]'region_name'];
ALTER SYSTEM ALTER ZONE zone4 SET REGION 'shanghai',IDC 'sh1';

{ALTER|CHANGE|MODIFY} :表示 ALTER、CHANGE、MODIFY 三者的功能相同,可以使用任意一个关键字来修改 Zone 属性。

zone_name:表示待修改的 Zone 的名称。每条语句每次仅支持修改一个 Zone。

idc_name:指定 Zone 所在机房的名称。

region_name:指定 Zone 所在 Region 的名称。

1.6隔离zone

当需要进行 Zone 级容灾或者 Zone 级运维变更时,可以隔离 Zone。隔离后,新的读写请求不会路由到该 Zone 内的节点上,从而可以隔离故障或者无损的执行运维变更动作。

故障隔离场景:例如多机房部署架构下,某机房内有交换机异常,此时部分节点出现丢包、重传,甚至无主选举。为了快速恢复,可以直接隔离该机房对应的 Zone。

运维变更场景:例如 OceanBase 集群升级时采用的轮转升级方案,首先隔离一个 Zone,将用户流量从该 Zone 切到其他 Zone,然后执行升级动作。该 Zone 升级完成后执行 Start 操作恢复流量,再依次升级其他 Zone,从而做到升级对用户透明。

隔离 Zone,只是将用户流量从该 Zone 切走,并没有改变 Paxos 投票成员的数量。不同的隔离命令有不同的安全级别保证,需要根据执行的具体的隔离命令仔细斟酌后续能够安全执行的动作。隔离命令适用于短时间隔离场景,需要持续保持关注,提前做好二次故障的应急预案。如果短时间内恢复不了,可以采用替换 Zone 的方式彻底去除隐患。

隔离 Zone 有以下三种命令,不同的隔离命令有不同的安全级别保证:

通过 STOP ZONE 命令隔离 Zone

ALTER SYSTEM STOP ZONE 'zone_name';

获取指定日志流副本的最新日志位点信息,并转换成时间戳形式

SELECT SCN_TO_TIMESTAMP(END_SCN) FROM GV$OB_LOG_STAT WHERE TENANT_ID = 1001 and LS_ID = 1;

通过 FORCE STOP ZONE 命令隔离 Zone

ALTER SYSTEM FORCE STOP ZONE zone_name;

通过 ISOLATE ZONE 命令隔离 Zone

ALTER SYSTEM ISOLATE ZONE zone_name;

通过以上命令成功隔离 Zone 后,Zone 的 STATUS 的值变为 INACTIVE,表示该 Zone 处于隔离状态。

总结
任何场景下都应该首选 STOP ZONE 命令,成功执行后除了达成故障隔离的目的,还可以保证能够安全的对被隔离 Zone 内节点执行任何应急动作和运维动作。STOP ZONE 无法成功的情况下可以选择弱化版本的 Zone 隔离命令,但弱化版本的 Zone 隔离后不能保证能够安全的执行侵入性动作。

FORCE STOP ZONE 适用于除了待隔离 Zone 内节点外存在其他节点日志延迟的场景,ISOLATE ZONE 适用于除了待隔离 Zone 内节点外存在其他节点状态异常的场景。此时隔离 Zone 的目的仅仅是故障隔离,不能进行任何会造成进程停止的侵入性运维动作,否则会破坏 Paxos 多数派,造成租户无主,影响数据库服务的连续性。

详细介绍参考官方文档:https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000003378852

2.节点

2.1查看节点

SELECT * FROM oceanbase.DBA_OB_SERVERS;

2.2重启节点

重启是常见运维动作之一,适用于对机器进行短暂维修,以及修改系统配置项后需要重启生效的场景。重启过程中节点的下线时间需要在配置项 server_permanent_offline_time 设置的时间以内,否则会被永久下线。如果机器长时间维修,需要走机器替换流程,有关机器替换的详细操作请参见 替换节点。

集群级配置项 server_permanent_offline_time 用于设置节点心跳中断的时间阈值,即节点心跳中断多久后认为其被永久下线,永久下线的节点上的数据副本需要被自动补足。默认为 3600s。
STOP SERVER 命令在多副本架构的基础上能够达到业务无损的重启效果,STOP SERVER 命令执行以下逻辑:

将待重启节点上的 Leader 全部切走,并保证除了重启节点以外的其他节点上的副本满足多数派。

在 Root Service 上将待重启节点标记为 stopped(节点状态为 ACTIVE 状态且 stop_time 字段大于 0),客户端识别后,不会将业务请求路由到该节点。

最终成功 Stop Server 后,重启节点不会引起无主选举及客户端报错等问题,对业务流量完全透明。如果 Stop Server 操作执行失败,需要停止重启并检查原因,例如,可能出现的原因有缺少副本、RedoLog 延迟、总投票成员数小于多数派等。

重启节点的主要流程为:停止服务 -> 转储 -> 关闭进程 -> 启动进程 -> 启动服务。

1.停止节点。

``bash
Alter System Stop Server’svr_ip:svr_port’;
Alter System Stop Server’172.10.10.42:2882’;

svr_ip:表示待停止的节点所在的 IP。
svr_port:表示待停止的节点的 RPC 端口,默认为 2882。

执行成功后,可以查询 oceanbase.DBA_OB_SERVERS 视图中该 Server 的 STATUS 字段,可以看到字段值仍为 ACTIVE 不变,但 STOP_TIME 字段的值由 NULL 变为停止服务的时间点。

#### 2.节点进行转储操作
执行以下命令,对待重启的节点进行转储操作,以便缩短重启后回放 Redo Log 的时间,加速重启。

```bash
ALTER SYSTEM MINOR FREEZE SERVER = ('svr_ip:svr_port');
ALTER SYSTEM  MINOR FREEZE SERVER = ('172.10.10.42:2882');

如果执行报连接超时,请将ob_query_timeout 参数调大如修改为60s

obclient [oceanbase]> ALTER SYSTEM  MINOR FREEZE SERVER = ('172.10.10.42:2882');
ERROR 4012 (HY000): Timeout
obclient [oceanbase]> SET SESSION ob_query_timeout = 60000000;
Query OK, 0 rows affected (0.002 sec)

obclient [oceanbase]> ALTER SYSTEM  MINOR FREEZE SERVER = ('172.10.10.42:2882');
Query OK, 0 rows affected (12.520 sec)
3.停止 observer 进程。

使用 admin 用户登录待停止进程的节点所在的机器。
通过命令行工具进入 /home/admin/oceanbase 目录。

cd /home/admin/oceanbase

执行以下命令,查看并获取节点的进程 ID。

ps -ef | grep observer | grep -v grep
admin    103364      1 99  2022 ?        51-17:24:41 /home/admin/oceanbase/bin/observer

停止 observer 进程。

kill -9 103364

执行以下命令,确认进程是否已停止。
ps aux | grep observer
(可选)如果需要维修机器,在本步骤对机器进行短暂的维修。

4.启动 observer 进程。

使用 admin 用户登录待启动进程的节点所在的机器。
启动 observer 进程。
cd /home/admin/myoceanbase/oceanbase/bin && ./bin/observer
执行成功后,可以查询 oceanbase.DBA_OB_SERVERS 视图中的 START_SERVICE_TIME 字段,如果该值不为 NULL,则表示 observer 进程启动成功。

启动后可能需要等待一点时间,如果长时间不更新,停止observer进程后,再次重启确认START_SERVICE_TIME 不为null

5.启动节点服务

执行以下命令,启动节点服务。

ALTER SYSTEM START SERVER 'svr_ip:svr_port';
ALTER SYSTEM START SERVER '172.10.10.42:2882';

执行成功后,可以查询 oceanbase.DBA_OB_SERVERS 视图中的 STOP_TIME 字段,如果该值为 NULL,则表示该节点启动服务成功,可以对外提供服务。

2.2添加节点

1.待添加的 OBServer 服务器安装ob软件

前提条件:已完成初始化 OBServer 服务器
(包含创建用户目录ssh时钟源等等)
参考
openeuler部署OceanBase集群二、安装前准备

tar -xzf oceanbase-all-in-one-*.tar.gz
cd oceanbase-all-in-one/bin/rpms
rpm -ivh oceanbase-ce-4.2.2.0-100010012024022719.el8.x86_64.rpm
2.初始化 OceanBase 数据库的目录。
 mkdir -p /data/slog  
 mkdir -p /data/sstable
 mkdir -p /redo/clog
 ln -s /redo/clog /data/
 mkdir - p /home/admin/myoceanbase/oceanbase/etc2/
 mkdir - p /home/admin/myoceanbase/oceanbase/etc3/

这些目录跟原来的目录保持一致。

3.启动observer
./bin/observer -I 172.10.10.44 -p 2881 -P 2882 -z zone4 -d /data -r '172.10.10.41:2882:2881;172.10.10.42:2882:2881;172.10.10.43:2882:2881;172.10.10.44:2882:2881' -c 1753085070 -n myoceanbase -o "system_memory=2GB,datafile_size=2G,config_additional_dir=/home/admin/myoceanbase/oceanbase/etc2;/home/admin/myoceanbase/oceanbase/etc3,redo_dir=/redo"
ps -elf | grep observer

**rootservice_list,-r参数去掉把新节点172.10.10.44:2882:2881加入到里面。不然后面创建租户时会报rootservice shutdown错误
如果没有写可以通过下面命令更新
ALTER SYSTEM SET rootservice_list = ‘172.10.10.42:2882:2881;172.10.10.43:2882:2881;172.10.10.41:2882:2881;172.10.10.44:2882:2881’;
**
这里还需要将sys租户的locality添加到zone4才能确保每次重启observer,rootservice_list不会删除44.
参考
https://ask.oceanbase.com/t/topic/35628880/15

ALTER RESOURCE POOL sys_pool ZONE_LIST=('zone1','zone2','zone3','zone4');
ALTER TENANT sys LOCALITY='FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3, FULL{1}@zone4';
cat /home/admin/myoceanbase/oceanbase/etc/observer.config.bin
### 上面的参数可以查看上面的配置文件

-I:参数用于指定待启动的节点 IP。在多机部署场景下,不能指定 127.0.0.1 作为目标 IP。
-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 地址列表。
-o:用于指定集群的启动配置项,需要根据实际情况配置。

使用 -o 参数时,需满足以下条件:

不分大小写,但是推荐按照 observer.config.bin 中的名称来写。

配置项名不能包含以下特殊字符:空格、\r、\n、\t

配置项名和配置项值中间必须有等号(=)。

配置项之间使用英文逗号(,)进行分割。

语句中:

system_memory:用于指定 OceanBase 数据库内部保留内存,默认是 30G。
datafile_size:用于指定 OceanBase 数据库数据文件 SSTable 的大小(一次性初始化),根据 /data/1/ 可用空间评估,建议不少于 100G,同时又保留一些剩余空间。
config_additional_dir:用于指定参数文件的冗余目录。
如果不指定 config_additional_dir,OceanBase会使用默认的 etc2 和 etc3 目录。

3.确认已添加新的 Zone
SELECT * FROM oceanbase.DBA_OB_ZONES;
ALTER SYSTEM START ZONE zone4;
4.向集群的 Zone 中添加节点
ALTER SYSTEM ADD SERVER 'svr_ip:svr_port' [,'svr_ip:svr_port'...] [ZONE [=] 'zone_name'];

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 '172.10.10.44:2882' ZONE 'zone4';

查询DBA_OB_SERVERS确认节点已经加入到集群。

SELECT * FROM oceanbase.DBA_OB_SERVERS;
5.后续操作

增加节点主要用于弹性扩容场景和调整部署场景:

对于弹性扩容场景,增加节点后,节点所在的 Zone 内有更多的节点容纳 Unit,从而可以执行后续的迁移 Unit、调整租户的 UNIT_NUM 以及新建租户等操作,相关操作可参考以下内容:

Unit 迁移
调整 Unit Number
创建租户

调整部署场景:调整部署场景,包括将集群的部署方式从同城三中心调整为三地五中心,以及机房裁撤场景下将 Zone 从一个机房搬迁到另一个机房。该场景需要先增加 Zone,再在该 Zone 内增加节点,然后调整租户的 Locality 属性。调整租户 Locality 属性的相关操作请参见 修改 Locality。

2.3.删除节点

可以向 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 资源,从而使迁移流量与业务流量叠加,并导致业务流量受影响。为了避免业务流程受影响:

1查看当前 Unit 分布,获取待迁移的 Unit 的 ID。
SELECT UNIT_ID,TENANT_ID,STATUS,ZONE,SVR_IP FROM oceanbase.DBA_OB_UNITS;
2.根据查询结果,执行以下命令,手动迁移 Unit。
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 服务器上的示例如下:

ALTER SYSTEM MIGRATE UNIT = 1012 DESTINATION = '172.xx.xx.xx:2882'; 
3.执行以下命令,删除节点
ALTER SYSTEM DELETE SERVER 'svr_ip:svr_port' [,'svr_ip:svr_port'...] [ZONE [=] 'zone_name']
ALTER SYSTEM DELETE SERVER "172.xx.xx.xx:2882" zone='zone1'
4.确认节点是否删除成功。

待所有操作结束后,查询 oceanbase.DBA_OB_SERVERS 视图,确认节点是否删除成功。
如果列表中已经查询不到该节点,则表示删除成功。如果列表中仍然有该节点,且该节点的状态为 DELETING,则表示该节点仍然在删除状态中。

5.后续操作

对于未手动迁移 Unit 而是直接执行 Delete Server 操作的场景,由于 Unit 均衡过程中可能会发生资源不足,即同 Zone 中其他节点的剩余资源不足以容纳待删除节点上的 Unit,将会导致 Unit 迁移失败,从而使该节点持续在删除状态中。您可以通过 Root Service 机器上的 /home/admin/oceanbase/log/rootservice.log 查看 Unit 是否迁移失败。如果确认是 Unit 迁移失败,则需要执行 Cancel Delete Server 操作,然后向 Zone 内添加节点对集群扩容后再重新删除节点。

ALTER SYSTEM CANCEL DELETE SERVER 'svr_ip:svr_port' [,'svr_ip:svr_port'...] [ZONE [=] 'zone_name']
ALTER SYSTEM CANCEL DELETE SERVER '172.xx.xx.xx:2882' zone='zone1';

查询 oceanbase.DBA_OB_SERVERS 视图,确认节点是否取消删除成功。

2.4隔离节点

当需要进行 Zone 级容灾或者 Zone 级运维变更时,可以隔离 Zone。隔离后,新的读写请求不会路由到该 Zone 内的节点上,从而可以隔离故障或者无损的执行运维变更动作。
隔离节点有以下三种命令,不同的隔离命令有不同的安全级别保证:

通过 STOP SERVER 命令隔离节点

ALTER SYSTEM STOP SERVER 'svr_ip1:svr_port1', 'svr_ip2:svr_port2', ...;

获取指定日志流副本的最新日志位点信息,并转换成时间戳形式

SELECT SCN_TO_TIMESTAMP(END_SCN) FROM GV$OB_LOG_STAT WHERE TENANT_ID = 1001 and LS_ID = 1;

通过 FORCE STOP SERVER 命令隔离节点

ALTER SYSTEM FORCE STOP SERVER 'svr_ip1:svr_port1', 'svr_ip2:svr_port2', ...;

通过 ISOLATE SERVER 命令隔离节点

ALTER SYSTEM ISOLATE SERVER 'svr_ip1:svr_port1', 'svr_ip2:svr_port2', ...;

总结
任何场景下都应该首选 STOP SERVER 命令,成功执行后除了达成故障隔离的目的,还可以保证能够安全的对被隔离节点执行任何应急动作和运维动作。STOP SERVER 无法成功的情况下可以选择弱化版本的节点隔离命令,但弱化版本的节点隔离后不能保证能够安全的执行侵入性动作。

FORCE STOP SERVER 适用于除了待隔离节点外存在其他节点日志延迟的场景,ISOLATE SERVER 适用于除了待隔离节点外存在其他节点状态异常的场景。此时隔离节点的目的仅仅是故障隔离,不能进行任何会造成进程停止的侵入性运维动作,否则会破坏 Paxos 多数派,造成租户无主,影响数据库服务的连续性。

2.5替换节点

1.在待替换节点所在的 Zone 上添加新节点。
2.将旧节点上的 Unit 迁移到新节点。

a.查询 DBA_OB_SERVERS 视图获取待替换节点的相关信息。

SELECT * FROM oceanbase.DBA_OB_SERVERS;

b.根据节点 IP 查询待替换的节点的 Unit 列表。

SELECT  unit_id FROM  oceanbase.DBA_OB_UNITS WHERE SVR_IP = 'svr_ip';

c.提交 Unit 迁移任务,将旧节点上的 Unit 迁移到同 Zone 的其他节点上。

ALTER SYSTEM MIGRATE UNIT unit_id DESTINATION 'svr_ip:svr_port';

unit_id:待迁移的 Unit 的 unit_id。

svr_ip:svr_port:新节点的 IP 地址和 RPC 端口号,端口号默认为 2882。

每条命令仅支持迁移一个 Unit,多个 Unit 需要执行多次该命令。

ALTER SYSTEM MIGRATE UNIT 1016 DESTINATION '172.xx.xx.xx:2882';

d.查询 oceanbase.DBA_OB_UNIT_JOBS 视图,确认 Unit 的迁移进度。

SELECT * FROM oceanbase.DBA_OB_UNIT_JOBS WHERE JOB_TYPE = 'MIGRATE_UNIT';

如果查询结果为空,则表示 Unit 迁移完成。

3.等待旧节点上的所有 Unit 迁移完成后,将旧节点删除。

a.执行以下命令,删除旧节点。

ALTER SYSTEM DELETE SERVER 'svr_ip:svr_port' [,'svr_ip:svr_port'...] [ZONE [=] 'zone_name']
ALTER SYSTEM DELETE SERVER "172.xx.xx.xx:2882" zone='zone1'

svr_ip:表示待删除的旧节点的 IP。

port:表示待删除的旧节点的 RPC 端口,默认为 2882。

zone_name:待删除的旧节点所属的 Zone。

b.待操作结束后,查询 oceanbase.DBA_OB_SERVERS 视图,确认旧节点是否删除成功。

SELECT * FROM oceanbase.DBA_OB_SERVERS;
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐