一、问题现象描述

最近在部署OceanBase集群时遇到了一个让人头疼的问题:新节点死活加不进集群。具体表现是,执行ALTER SYSTEM ADD SERVER命令后,长时间卡在"adding server"状态,最终超时失败。日志里反复出现"waiting for server to report"的提示,就像在等一个永远不会来的约会对象。

这种情况在生产环境特别危险,因为扩容失败可能导致集群负载不均。我遇到过好几次凌晨三点被报警叫醒,就是因为某个节点加入失败导致整个集群性能下降。下面就把我这些年踩过的坑和解决方案分享给大家。

二、基础环境检查

首先得确认基础环境是否达标,这就像盖房子要先打地基。OceanBase对节点环境有严格要求:

# 检查系统内核版本(OceanBase要求3.10以上)
uname -r  
# 检查内存是否足够(建议至少64GB)
free -g
# 检查磁盘类型(必须SSD或NVMe)
lsblk -d -o name,rota
# 检查时钟同步(偏差需小于100ms)
ntpstat
# 检查网络带宽(建议万兆网卡)
ethtool eth0 | grep Speed

特别容易忽略的是透明大页(THP)设置,这货会导致性能问题:

# 禁用透明大页
echo never > /sys/kernel/mm/transparent_hugepage/enabled

三、网络问题排查

网络问题是节点加入失败的常见元凶。有一次我们排查三天,最后发现是交换机端口速率协商错误。以下是必查项:

  1. 防火墙规则:OceanBase需要这些端口畅通无阻
# 查看防火墙规则
iptables -L -n
# 开放OceanBase默认端口(2881,2882,2883)
iptables -I INPUT -p tcp --dport 2881:2883 -j ACCEPT
  1. 网络延迟测试
# 测试节点间延迟
ping -c 10 目标节点IP
# 测试带宽
iperf3 -c 目标节点IP
  1. DNS解析:建议所有节点配置hosts解析
# /etc/hosts示例
192.168.1.101 ob01
192.168.1.102 ob02
192.168.1.103 ob03

四、配置参数检查

配置文件就像菜谱,错一个参数整道菜就毁了。重点关注这些参数:

# oceanbase.conf关键参数
memory_limit=64G         # 不能超过物理内存70%
system_memory=8G         # 系统预留内存
cpu_count=16             # 必须与实际CPU核数一致
datafile_size=200G       # 数据文件初始大小
datafile_next=20G        # 自动扩展步长

常见错误包括:

  • 内存分配超过物理内存
  • CPU核数配置错误
  • 数据目录权限不对(必须obadmin用户可写)
  • 时间戳配置不一致(所有节点必须使用相同NTP服务器)

五、日志分析技巧

OceanBase的日志就像破案线索,关键信息往往藏在细节里。重点查看:

# 查看observer.log
tail -f /home/admin/oceanbase/log/observer.log
# 过滤错误信息
grep -E "ERROR|WARN" /home/admin/oceanbase/log/observer.log

典型错误日志示例:

[2023-08-20 03:14:15] ERROR [SERVER] sync config failed(ret=-4016)
[2023-08-20 03:14:16] WARN  [RS] waiting for server report timeout(server=192.168.1.103:2882)

这类日志通常表示新节点与集群主节点通信失败。可能原因包括:

  • 网络分区
  • 防火墙拦截
  • 节点资源不足
  • 版本不一致

六、特殊场景处理

有些特殊情况需要特殊处理:

  1. 异构硬件环境:当新节点硬件配置与旧节点差异较大时,需要调整参数:
-- 设置资源池权重
ALTER RESOURCE POOL pool1 UNIT='unit1', UNIT_NUM=1, ZONE='zone1', 
WEIGHT=50;  -- 新节点权重调低
  1. 大集群扩容:超过20个节点时,建议分批加入:
-- 第一批加入
ALTER SYSTEM ADD SERVER '192.168.1.101:2882' ZONE='zone1';
-- 等待第一批完成后再加第二批
ALTER SYSTEM ADD SERVER '192.168.1.102:2882' ZONE='zone2';
  1. 版本升级场景:滚动升级时需要特别注意:
# 先停服
./bin/observer stop
# 升级二进制文件
cp -f oceanbase-new /home/admin/oceanbase/bin/observer
# 重启
./bin/observer start

七、自动化排查脚本

为了提升效率,我写了个自动化排查脚本:

#!/bin/bash
# OceanBase节点加入检查脚本
# 用法:./check_ob_node.sh 新节点IP

NEW_NODE=$1
CLUSTER_IP="192.168.1.100"  # 集群VIP

echo "=== 开始检查节点 $NEW_NODE ==="

# 1. 检查基础连通性
ping -c 3 $NEW_NODE >/dev/null || {
    echo "[错误] 无法ping通目标节点"
    exit 1
}

# 2. 检查端口连通性
nc -zv $NEW_NODE 2881 || {
    echo "[错误] 2881端口不通"
    exit 1
}

# 3. 检查时钟同步
ssh $NEW_NODE "ntpstat" | grep -q "synchronised" || {
    echo "[警告] 目标节点时钟未同步"
}

# 4. 检查OceanBase进程
ssh $NEW_NODE "pgrep observer" || {
    echo "[错误] observer进程未运行"
    exit 1
}

echo "=== 检查完成,可以尝试加入集群 ==="

八、最佳实践总结

经过多次实战,我总结了这些经验:

  1. 预检查清单

    • 硬件配置一致性检查
    • 网络延迟测试(<1ms)
    • 磁盘性能测试(IOPS >5000)
    • 系统参数调优
  2. 加入流程建议

    graph TD
      A[准备新节点] --> B[基础环境检查]
      B --> C[参数配置核对]
      C --> D[加入观察者节点]
      D --> E[等待数据同步完成]
      E --> F[正式加入集群]
    
  3. 监控指标:加入过程中要监控这些关键指标:

    • ob_sql_execute_time 执行时间突增
    • ob_network_flow 网络流量激增
    • ob_disk_usage 磁盘使用率变化
  4. 回滚方案:一定要提前准备

    -- 如果加入失败需要移除节点
    ALTER SYSTEM DELETE SERVER '192.168.1.103:2882';
    

记住,OceanBase集群操作就像外科手术,需要准备充分、操作谨慎、监控到位。希望这篇分享能帮你少走弯路!