Skip to content

OceanBase 节点重启

节点重启的类型

OceanBase 数据库节点重启可以分为两种类型:正常重启和强制重启。正常重启是指按照正常流程关闭和启动节点,确保数据的一致性和完整性。强制重启是指在节点无法正常关闭的情况下,通过强制手段关闭节点并重新启动。

正常重启

正常重启是最安全的节点重启方式,它会确保:

  • 所有事务都已完成或回滚
  • 所有数据都已写入磁盘
  • 所有连接都已正常关闭
  • 集群状态保持一致

强制重启

强制重启是在特殊情况下使用的重启方式,例如:

  • 节点进程无响应
  • 节点出现严重错误,无法正常关闭
  • 紧急维护需要快速重启节点

强制重启可能会导致:

  • 未完成的事务回滚
  • 数据一致性检查和修复
  • 集群状态临时不一致
  • 服务短暂中断

节点重启的影响

节点重启会对 OceanBase 集群产生一定的影响,主要包括:

对集群状态的影响

  • 节点状态变化:节点从 ONLINE 状态变为 OFFLINE,然后恢复为 ONLINE
  • 副本同步:重启节点的副本需要与其他节点重新同步数据
  • Paxos 成员变化:节点重启期间,Paxos 组的成员会临时变化
  • Leader 切换:如果重启的节点是某个分区的 Leader,会触发 Leader 切换

对服务的影响

  • 读写服务:重启期间,该节点上的读写服务会短暂中断
  • 连接断开:所有连接到该节点的客户端连接会断开
  • 性能影响:重启后,副本同步会消耗一定的资源,可能影响集群性能

对数据的影响

  • 数据一致性:正常重启不会影响数据一致性,强制重启可能需要进行数据一致性检查
  • 数据丢失风险:正常重启不会导致数据丢失,强制重启在极端情况下可能导致数据丢失
  • 数据同步:重启后,节点需要与其他节点同步数据,确保数据一致性

节点重启前的准备工作

检查集群状态

在重启节点前,需要先检查集群的整体状态,确保集群处于健康状态。

sql
-- 查看集群状态
SHOW CLUSTER STATUS;

-- 查看所有节点状态
SELECT * FROM oceanbase.GV$OB_SERVERS;

-- 查看副本分布情况
SELECT * FROM oceanbase.GV$OB_PARTITION_REPLICA;

-- 查看 Leader 分布情况
SELECT * FROM oceanbase.GV$OB_PARTITION_LEADER;

检查节点状态

需要检查待重启节点的状态,确保节点可以正常关闭。

sql
-- 查看节点状态
SELECT * FROM oceanbase.GV$OB_SERVERS WHERE zone = 'zone1' AND svr_ip = '192.168.1.100';

-- 查看节点负载情况
SELECT * FROM oceanbase.GV$OB_SERVER_MEMORY;
SELECT * FROM oceanbase.GV$OB_SERVER_CPU;

-- 查看节点上的会话情况
SELECT * FROM oceanbase.GV$OB_SESSIONS WHERE svr_ip = '192.168.1.100';

备份数据

在重启节点前,建议备份重要数据,以防万一。

bash
# 使用 OBR 工具备份集群
obr backup cluster --cluster=obcluster --backup-dest=/data/ob/backup --tenant=sys

# 备份重要配置文件
cp /home/oceanbase/conf/observer.conf /data/ob/backup/
cp /home/oceanbase/conf/obproxy.conf /data/ob/backup/

通知相关人员

节点重启会影响服务,需要提前通知相关人员,包括:

  • 应用开发人员
  • 系统管理员
  • 业务负责人
  • 客户服务团队

选择合适的时间窗口

节点重启应该选择在业务低峰期进行,以减少对业务的影响。建议:

  • 选择在夜间或周末进行
  • 避开业务高峰期
  • 预留足够的时间进行重启和验证

正常重启节点的操作步骤

步骤一:停止节点服务

使用 OceanBase 提供的工具或命令停止节点服务。

使用 ob_adm 工具停止节点

bash
# 切换到 oceanbase 用户
su - oceanbase

# 停止节点服务
cd /home/oceanbase/observer
./bin/ob_adm --flagfile=conf/observer.conf stop_server

使用 SQL 命令停止节点

sql
-- 停止节点服务
ALTER SYSTEM STOP SERVER '192.168.1.100:2882';

步骤二:验证节点已停止

需要验证节点已经完全停止,没有残留进程。

bash
# 检查节点进程是否存在
ps -ef | grep observer | grep -v grep

# 检查节点端口是否已关闭
netstat -tlnp | grep 2882
netstat -tlnp | grep 2881

步骤三:进行必要的维护操作

在节点停止期间,可以进行一些必要的维护操作,例如:

  • 硬件维护
  • 操作系统升级
  • 配置文件修改
  • 磁盘清理

步骤四:启动节点服务

使用 OceanBase 提供的工具或命令启动节点服务。

使用 observer 命令启动节点

bash
# 切换到 oceanbase 用户
su - oceanbase

# 启动节点服务
cd /home/oceanbase/observer
./bin/observer --flagfile=conf/observer.conf > observer.log 2>&1 &

使用 systemd 启动节点

如果使用 systemd 管理 OceanBase 服务,可以使用 systemctl 命令启动节点。

bash
# 启动节点服务
systemctl start oceanbase

# 查看节点服务状态
systemctl status oceanbase

步骤五:验证节点已启动

需要验证节点已经成功启动,并恢复正常服务。

sql
-- 查看节点状态
SELECT * FROM oceanbase.GV$OB_SERVERS WHERE svr_ip = '192.168.1.100';

-- 查看节点上的服务状态
SELECT * FROM oceanbase.GV$OB_SERVICE_STATUS WHERE svr_ip = '192.168.1.100';

-- 查看副本同步状态
SELECT * FROM oceanbase.GV$OB_PARTITION_REPLICA WHERE svr_ip = '192.168.1.100';

步骤六:检查集群状态

需要检查整个集群的状态,确保集群恢复正常。

sql
-- 查看集群状态
SHOW CLUSTER STATUS;

-- 查看所有节点状态
SELECT * FROM oceanbase.GV$OB_SERVERS;

-- 查看副本同步状态
SELECT * FROM oceanbase.GV$OB_PARTITION_REPLICA WHERE status != 'NORMAL';

-- 查看 Leader 分布情况
SELECT * FROM oceanbase.GV$OB_PARTITION_LEADER;

强制重启节点的操作步骤

步骤一:检查节点状态

在强制重启节点前,需要先检查节点的状态,确认节点确实无法正常关闭。

bash
# 检查节点进程状态
ps -ef | grep observer | grep -v grep

# 检查节点响应情况
ping -c 3 192.168.1.100
telnet 192.168.1.100 2881
telnet 192.168.1.100 2882

步骤二:强制终止节点进程

如果节点无法正常关闭,可以使用 kill 命令强制终止节点进程。

bash
# 查找节点进程 ID
PID=$(ps -ef | grep observer | grep -v grep | awk '{print $2}')

# 尝试优雅终止进程
kill -15 $PID

# 如果优雅终止失败,使用强制终止
kill -9 $PID

步骤三:清理资源

强制终止节点进程后,需要清理一些资源,例如:

bash
# 清理临时文件
rm -f /home/oceanbase/observer/log/observer.pid
rm -f /home/oceanbase/observer/log/observer.sock

# 检查并清理共享内存
ipcs -m | grep oceanbase | awk '{print $2}' | xargs -n1 ipcrm -m

# 检查并清理信号量
ipcs -s | grep oceanbase | awk '{print $2}' | xargs -n1 ipcrm -s

步骤四:启动节点服务

清理资源后,可以启动节点服务。

bash
# 切换到 oceanbase 用户
su - oceanbase

# 启动节点服务
cd /home/oceanbase/observer
./bin/observer --flagfile=conf/observer.conf > observer.log 2>&1 &

步骤五:验证节点已启动

需要验证节点已经成功启动,并恢复正常服务。

sql
-- 查看节点状态
SELECT * FROM oceanbase.GV$OB_SERVERS WHERE svr_ip = '192.168.1.100';

-- 查看节点上的服务状态
SELECT * FROM oceanbase.GV$OB_SERVICE_STATUS WHERE svr_ip = '192.168.1.100';

-- 查看副本同步状态
SELECT * FROM oceanbase.GV$OB_PARTITION_REPLICA WHERE svr_ip = '192.168.1.100';

步骤六:检查数据一致性

强制重启后,需要检查数据一致性,确保数据没有损坏。

sql
-- 检查数据一致性
ALTER SYSTEM CHECK DATA CONSISTENCY;

-- 查看一致性检查结果
SELECT * FROM oceanbase.GV$OB_DATA_CONSISTENCY_CHECK;

步骤七:检查集群状态

需要检查整个集群的状态,确保集群恢复正常。

sql
-- 查看集群状态
SHOW CLUSTER STATUS;

-- 查看所有节点状态
SELECT * FROM oceanbase.GV$OB_SERVERS;

-- 查看副本同步状态
SELECT * FROM oceanbase.GV$OB_PARTITION_REPLICA WHERE status != 'NORMAL';

-- 查看 Leader 分布情况
SELECT * FROM oceanbase.GV$OB_PARTITION_LEADER;

节点重启的最佳实践

选择合适的重启方式

  • 正常情况下:使用正常重启方式,确保数据一致性
  • 紧急情况下:可以使用强制重启方式,但需要谨慎使用
  • 维护操作:对于计划性维护,建议使用正常重启方式

选择合适的时间窗口

  • 业务低峰期:选择在业务低峰期进行节点重启
  • 预留足够时间:预留足够的时间进行重启和验证
  • 避开重要业务时段:避开重要业务时段,如促销活动、报表生成等

提前通知相关人员

  • 应用开发人员:提前通知应用开发人员,以便他们做好准备
  • 系统管理员:通知系统管理员,以便他们协助处理可能的问题
  • 业务负责人:通知业务负责人,确保业务不受影响
  • 客户服务团队:通知客户服务团队,以便他们处理可能的客户投诉

备份重要数据

  • 配置文件备份:备份节点的配置文件
  • 数据备份:在重启前备份重要数据
  • 日志备份:备份节点的日志文件,以便后续分析

监控重启过程

  • 实时监控:实时监控节点重启过程
  • 日志分析:分析节点重启日志,及时发现问题
  • 性能监控:监控集群性能,确保重启后性能恢复正常

验证重启结果

  • 节点状态验证:验证节点是否成功启动
  • 集群状态验证:验证集群是否恢复正常
  • 服务验证:验证服务是否正常提供
  • 数据一致性验证:验证数据是否一致

节点重启的常见问题

节点无法正常关闭

症状:执行停止节点命令后,节点长时间无法关闭

解决方案

  1. 查看节点日志,找出无法关闭的原因
  2. 检查节点上的会话情况,终止长时间运行的会话
  3. 检查节点上的事务情况,终止长时间运行的事务
  4. 如果无法正常关闭,可以使用强制终止方式

节点无法正常启动

症状:执行启动命令后,节点无法正常启动

解决方案

  1. 查看节点日志,找出无法启动的原因
  2. 检查配置文件,确保配置正确
  3. 检查端口占用情况,确保端口未被占用
  4. 检查磁盘空间,确保磁盘空间充足
  5. 检查内存使用情况,确保内存充足

节点启动后状态异常

症状:节点启动后,状态异常,无法提供服务

解决方案

  1. 查看节点日志,找出状态异常的原因
  2. 检查节点与其他节点的网络连接
  3. 检查节点上的副本状态
  4. 检查节点的资源使用情况
  5. 尝试重启节点或重新部署节点

数据一致性问题

症状:节点重启后,出现数据一致性问题

解决方案

  1. 运行数据一致性检查:`ALTER SYSTEM CHECK DATA CONSISTENCY;
  2. 根据检查结果进行修复
  3. 如果数据损坏严重,考虑从备份恢复
  4. 检查并修复配置问题,避免类似问题再次发生

集群性能下降

症状:节点重启后,集群性能下降

解决方案

  1. 检查副本同步情况,确保副本已同步完成
  2. 检查 Leader 分布情况,确保 Leader 分布均衡
  3. 检查节点资源使用情况,确保资源充足
  4. 优化集群配置,提高性能
  5. 等待集群自动恢复,性能可能需要一段时间才能恢复正常

节点重启的监控与日志

监控节点重启过程

sql
-- 查看节点状态变化
SELECT * FROM oceanbase.GV$OB_SERVER_EVENT_HISTORY;

-- 查看副本同步进度
SELECT * FROM oceanbase.GV$OB_REPLICA_SYNC_STATUS;

-- 查看 Leader 切换情况
SELECT * FROM oceanbase.GV$OB_LEADER_HISTORY;

查看节点日志

bash
# 查看节点启动日志
tail -f /home/oceanbase/observer/log/observer.log

# 查看节点错误日志
grep -i "error" /home/oceanbase/observer/log/observer.log

# 查看节点警告日志
grep -i "warning" /home/oceanbase/observer/log/observer.log

查看集群日志

sql
-- 查看集群事件日志
SELECT * FROM oceanbase.GV$OB_EVENT_HISTORY;

-- 查看集群错误日志
SELECT * FROM oceanbase.GV$OB_ERROR_LOG;

-- 查看集群警告日志
SELECT * FROM oceanbase.GV$OB_WARNING_LOG;

节点重启的自动化

使用脚本自动化节点重启

可以编写脚本自动化节点重启过程,提高效率和可靠性。

bash
#!/bin/bash

# 节点重启脚本

# 配置信息
NODE_IP="192.168.1.100"
NODE_PORT="2882"
OBSERVER_HOME="/home/oceanbase/observer"
CONF_FILE="${OBSERVER_HOME}/conf/observer.conf"
LOG_FILE="${OBSERVER_HOME}/log/observer.log"

# 检查集群状态
check_cluster_status() {
    echo "检查集群状态..."
    mysql -h127.0.0.1 -P2881 -uroot -p123456 -e "SHOW CLUSTER STATUS;"
}

# 停止节点
stop_node() {
    echo "停止节点 ${NODE_IP}:${NODE_PORT}..."
    mysql -h127.0.0.1 -P2881 -uroot -p123456 -e "ALTER SYSTEM STOP SERVER '${NODE_IP}:${NODE_PORT}';"
    sleep 10
}

# 启动节点
start_node() {
    echo "启动节点 ${NODE_IP}:${NODE_PORT}..."
    su - oceanbase -c "cd ${OBSERVER_HOME} && ./bin/observer --flagfile=${CONF_FILE} > ${LOG_FILE} 2>&1 &"
    sleep 10
}

# 检查节点状态
check_node_status() {
    echo "检查节点 ${NODE_IP}:${NODE_PORT} 状态..."
    mysql -h127.0.0.1 -P2881 -uroot -p123456 -e "SELECT * FROM oceanbase.GV$OB_SERVERS WHERE svr_ip = '${NODE_IP}';"
}

# 主流程
echo "开始节点重启流程..."
check_cluster_status
stop_node
start_node
sleep 30
check_node_status
check_cluster_status
echo "节点重启流程完成..."

使用 OCP 平台自动化节点重启

OceanBase 云平台(OCP)提供了节点重启的自动化功能,可以通过 OCP 控制台或 API 实现节点重启的自动化。

  1. 登录 OCP 控制台
  2. 进入 "集群管理" 页面
  3. 选择目标集群
  4. 进入 "节点管理" 页面
  5. 选择待重启的节点
  6. 点击 "重启" 按钮
  7. 确认重启操作
  8. 监控重启过程

常见问题(FAQ)

Q1: 节点重启需要多长时间?

A1: 节点重启的时间取决于多种因素:

  • 节点的负载情况
  • 数据量大小
  • 副本同步情况
  • 硬件性能

一般情况下,正常重启需要 5-15 分钟,强制重启需要 10-30 分钟。

Q2: 节点重启会影响业务吗?

A2: 节点重启会对业务产生一定的影响:

  • 重启期间,该节点上的读写服务会短暂中断
  • 连接到该节点的客户端连接会断开
  • 副本同步会消耗一定的资源,可能影响集群性能

建议在业务低峰期进行节点重启,以减少对业务的影响。

Q3: 如何减少节点重启对业务的影响?

A3: 减少节点重启对业务影响的方法:

  • 选择在业务低峰期进行节点重启
  • 提前通知相关人员,做好准备
  • 确保集群有足够的冗余节点
  • 优化集群配置,提高集群的容错能力
  • 使用负载均衡,分散业务流量

Q4: 节点重启后,副本需要多长时间才能同步完成?

A4: 副本同步的时间取决于多种因素:

  • 数据量大小
  • 网络带宽
  • 集群负载情况
  • 硬件性能

一般情况下,副本同步需要几分钟到几小时不等。可以通过 GV$OB_REPLICA_SYNC_STATUS 视图查看副本同步进度。

Q5: 如何处理节点重启失败?

A5: 处理节点重启失败的方法:

  1. 查看节点日志,找出重启失败的原因
  2. 检查配置文件,确保配置正确
  3. 检查端口占用情况,确保端口未被占用
  4. 检查磁盘空间,确保磁盘空间充足
  5. 检查内存使用情况,确保内存充足
  6. 尝试重新启动节点
  7. 如果无法解决,可以考虑重新部署节点

Q6: 节点重启后,如何验证数据一致性?

A6: 验证数据一致性的方法:

  • 运行数据一致性检查:`ALTER SYSTEM CHECK DATA CONSISTENCY;
  • 查看一致性检查结果:`SELECT * FROM oceanbase.GV$OB_DATA_CONSISTENCY_CHECK;
  • 对比不同节点上的同一份数据,确保数据一致
  • 运行业务验证测试,确保业务功能正常

Q7: 如何避免节点重启?

A7: 避免节点重启的方法:

  • 定期维护节点,保持节点健康
  • 优化节点配置,提高节点的稳定性
  • 监控节点状态,及时发现并处理问题
  • 采用高可用架构,减少单个节点的影响
  • 合理规划维护窗口,减少不必要的重启

Q8: 节点重启和集群重启有什么区别?

A8: 节点重启和集群重启的区别:

  • 节点重启:只重启单个节点,影响范围小
  • 集群重启:重启整个集群,影响范围大
  • 节点重启:用于单个节点的维护或故障处理
  • 集群重启:用于整个集群的升级或重大维护

Q9: 如何处理节点重启后的性能下降?

A9: 处理节点重启后性能下降的方法:

  • 检查副本同步情况,确保副本已同步完成
  • 检查 Leader 分布情况,确保 Leader 分布均衡
  • 检查节点资源使用情况,确保资源充足
  • 优化集群配置,提高性能
  • 等待集群自动恢复,性能可能需要一段时间才能恢复正常

Q10: 如何实现节点的滚动重启?

A10: 实现节点滚动重启的方法:

  • 逐个重启集群中的节点
  • 确保每个节点重启完成并恢复正常后,再重启下一个节点
  • 监控集群状态,确保集群在重启过程中保持可用
  • 选择在业务低峰期进行滚动重启
  • 提前通知相关人员,做好准备

节点重启的注意事项

  • 数据安全:节点重启前,确保数据已备份,以防万一
  • 服务可用性:确保集群有足够的冗余节点,保证服务可用性
  • 网络连接:确保节点与其他节点的网络连接正常
  • 资源充足:确保节点有足够的资源(CPU、内存、磁盘)
  • 配置正确:确保节点的配置文件正确
  • 日志监控:实时监控节点重启日志,及时发现问题
  • 回滚计划:制定回滚计划,以防重启过程中出现问题
  • 验证结果:重启完成后,仔细验证重启结果

通过以上步骤和最佳实践,可以确保 OceanBase 节点重启的安全和顺利进行,减少对业务的影响,确保集群的稳定性和可靠性。