一、问题现象描述
最近在部署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
三、网络问题排查
网络问题是节点加入失败的常见元凶。有一次我们排查三天,最后发现是交换机端口速率协商错误。以下是必查项:
- 防火墙规则:OceanBase需要这些端口畅通无阻
# 查看防火墙规则
iptables -L -n
# 开放OceanBase默认端口(2881,2882,2883)
iptables -I INPUT -p tcp --dport 2881:2883 -j ACCEPT
- 网络延迟测试:
# 测试节点间延迟
ping -c 10 目标节点IP
# 测试带宽
iperf3 -c 目标节点IP
- 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)
这类日志通常表示新节点与集群主节点通信失败。可能原因包括:
- 网络分区
- 防火墙拦截
- 节点资源不足
- 版本不一致
六、特殊场景处理
有些特殊情况需要特殊处理:
- 异构硬件环境:当新节点硬件配置与旧节点差异较大时,需要调整参数:
-- 设置资源池权重
ALTER RESOURCE POOL pool1 UNIT='unit1', UNIT_NUM=1, ZONE='zone1',
WEIGHT=50; -- 新节点权重调低
- 大集群扩容:超过20个节点时,建议分批加入:
-- 第一批加入
ALTER SYSTEM ADD SERVER '192.168.1.101:2882' ZONE='zone1';
-- 等待第一批完成后再加第二批
ALTER SYSTEM ADD SERVER '192.168.1.102:2882' ZONE='zone2';
- 版本升级场景:滚动升级时需要特别注意:
# 先停服
./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 "=== 检查完成,可以尝试加入集群 ==="
八、最佳实践总结
经过多次实战,我总结了这些经验:
预检查清单:
- 硬件配置一致性检查
- 网络延迟测试(<1ms)
- 磁盘性能测试(IOPS >5000)
- 系统参数调优
加入流程建议:
graph TD A[准备新节点] --> B[基础环境检查] B --> C[参数配置核对] C --> D[加入观察者节点] D --> E[等待数据同步完成] E --> F[正式加入集群]监控指标:加入过程中要监控这些关键指标:
ob_sql_execute_time执行时间突增ob_network_flow网络流量激增ob_disk_usage磁盘使用率变化
回滚方案:一定要提前准备
-- 如果加入失败需要移除节点 ALTER SYSTEM DELETE SERVER '192.168.1.103:2882';
记住,OceanBase集群操作就像外科手术,需要准备充分、操作谨慎、监控到位。希望这篇分享能帮你少走弯路!
评论