首批通过分布式安全可靠测评,为关键业务系统打造
OBServer 机器下线维修相关处理流程
更新时间:2026-06-04 09:56
本文适用于当 OceanBase 集群中出现机器故障,需要将故障机器临时下线进行维修的场景。
适用版本
OceanBase 数据库 V2.x 和 V3.x 版本。
OBServer 机器下线维修流程
环境检查
登录需要停机维修节点所在集群的 sys 租户。
mysql -h[$OB_Host] -uroot@sys#[$集群名] -p[$pwd] -P[$port] -Doceanbase -c检查 RS leader 所在 server,若操作机器为 RS leader,建议切换到其他 zone,再进行停机。
select svr_ip,zone from __all_root_table where tenant_id=1 and role=1 group by svr_ip;RS leader 切换至其他 zone。
alter tenant sys set primary_zone='[$zone_name]';检查切换 RS leader 切换后的结果。
select svr_ip,zone from __all_meta_table where tenant_id=1 and role=1 group by svr_ip;检查停机节点是否是 leader(1=leader),以及节点上的租户分布情况。没有租户 leader 可以直接停服务关机维修,存在租户 leader 建议将 leader 切换至其他 zone。
select t.tenant_id,t.svr_ip,t.role,p.tenant_name from __all_virtual_meta_table t,__all_tenant p where t.tenant_id=p.tenant_id and t.svr_ip='[$svr_ip]' group by t.svr_ip,t.tenant_id asc;查看 leader 租户当前 primary_zone 分布。
select tenant_id,tenant_name,primary_zone,status from __all_tenant where tenant_name='[$tenant_name]';业务租户 leader 切换至其他 zone。
alter tenant [$tenant_name] set primary_zone = 'zone1;zone2;zone3';检查租户 leader 切换后的结果。
select t.tenant_id,t.svr_ip,t.role,p.tenant_name from __all_virtual_meta_table t,__all_tenant p where t.tenant_id=p.tenant_id and t.svr_ip='[$svr_ip]' group by t.svr_ip,t.tenant_id asc;
OBServer 机器下线维修
停止 OBServer。
临时调整服务器永久下线时间为 5 小时,inactive 超过 1 个小时(默认参数),OceanBase 数据库会把 server 永久下线掉。
alter system set server_permanent_offline_time = '18000s';show parameters like 'server_permanent_offline_time'; -- 检查修改是否成功逻辑下线 OBServer。
alter system stop server 'xx.xx.xx.xx:2882';若该台机器的主较多,切主时间会较长,执行超时,可通过设置参数值增加超时时间。
语句
set ob_query_timeout =180000000;、set ob_trx_timeout = 1000000000;。检查执行结果,确认 stop_time 非 0。
select svr_ip,gmt_modified,zone,usec_to_time(start_service_time),stop_time,status from __all_server;检查 stop server 历史记录,value1 执行结果返回 0 代表成功。
select * from __all_rootservice_event_history where event like '%stop%' order by gmt_create desc limit 2\G登录需要停机的节点进行 OBServer 进程停服。
可能存在自启动脚本,如果杀掉后 OBServer 自启动请将自启动脚本挪走后重试。机器恢复后恢复自启动脚本位置。
ll /usr/local/bin/auto_start_ob.sh pgrep observer|xargs kill -9 #杀掉 observer 服务 ps -ef|grep -v grep |grep observer #检查服务关机检修,等待机器检修完成恢复服务。
shutdown -h now机器维修完成,节点启动后检查 ntp 时间源是否正确,正确即可按照下列步骤重新恢复。若 ntp 偏差过大请拉齐时间后在进行服务恢复。
ntpq -pn #查看时间同步服务器列表 chronyc -n sources -v #查看时间同步服务器列表
启动 OBServer。
启动 observer 进程(若不需要修改配置,无需添加启动参数,默认读取上次启动的配置)。
su - admin -c "cd /home/admin/oceanbase; ulimit -s 20480; ulimit -c unlimited; /home/admin/oceanbase/bin/observer"启动后登录 sys 租户检查 server 状态。
select svr_ip,gmt_modified,zone,usec_to_time(start_service_time),stop_time,status from __all_server;gmt_modified:server 状态变更时间,例如:执行 stop server,改字段时间会变更为执行时间。start_service_time:observer 进程启动 check,成功后变更为当前启动时间。status:server 状态,需为 active。
clog 同步状态检查,结果返回为空,代表已同步完成。
select svr_ip, svr_port, table_id, partition_idx from __all_virtual_clog_stat where is_in_sync= 0 and is_offline = 0 and replica_type != 16检查 table 的副本数为 3,查询结果为空,代表副本数均 3。
select table_id,partition_id, count(*) as a from __all_virtual_meta_table group by table_id,partition_id having a!=3;逻辑上线 OBServer,可提供服务。
alter system start server 'xxx.xxx.xxx.xx:2882';上线状态检查。name 字段值为 ret,value2 字段的值有返回相应的错误码;若无,代表正常执行成功了;value1 执行结果返回 0 代表成功。
select * from __all_rootservice_event_history where event like '%start%' order by gmt_create desc limit 2\G
启动 obagent。
容器或者物理机重启需检查 obagent 是否正常启动,若没有需手动启动启动命令并检查进程。
cd /home/admin/obztools_agent;./ob_agent.py start agent ps -ef |grep ob_启动 OBProxy。
启动 proxy 守护进程,守护进程拉起 OBProxy。
su - admin cd /opt/taobao/install/obproxy-1.5.5/;./bin/obproxyd.sh -c start -n obproxy_gz ps -ef|grep obproxy恢复调整过的参数。
所有机器恢复正常后,将服务器永久下线时间调回默认值。
alter system set server_permanent_offline_time = '3600s';show parameters like 'server_permanent_offline_time'; # 检查修改是否成功
结果验证
登录停机维修的节点连接数据库,验证可用。
# 验证2881端口 mysql -h127.0.0.1 -uroot@sys -p[$pwd] -P2881 -Doceanbase -c # 验证2883端口 mysql -h127.0.0.1 -uroot@sys#[$集群名] -p[$pwd] -P2883 -Doceanbase -c登录数据库验证服务状态。
select svr_ip,svr_port,id,zone,inner_port,status from __all_server;