ODL Boron-SR2集群模式下RHEL 6.9中Config Shard创建失败及熔断超时问题
问题分析与解决方案
问题概述
我们在RHEL 6.9集群环境下启动ODL Boron-SR2版本时,遇到以下稳定复现的异常:
- "Config" Shard 无法创建,触发
Circuit Breaker Timed Out(熔断超时)错误 - "Operational" Shard 可正常创建
- 由于Config Shard不可用,无法在"Config" tree中持久化任何数据
- 通过JMX控制台检查发现"Shards"缺失
- 该问题在CentOS环境下运行完全正常,相关日志时间:
2018-04-04 08:00:38,396
可能的根因
这个问题主要源于RHEL 6.9与CentOS在系统内核、默认配置(如透明大页)、JDK版本兼容性上的差异,加上ODL Boron-SR2早期版本对RHEL 6.x集群环境的适配不足:
- Transparent Huge Pages(THP)拖慢JVM性能:RHEL6默认开启THP,会导致JVM内存分配延迟增加,拖慢Shard初始化速度,触发熔断超时
- JDK版本不兼容:RHEL6默认可能搭载OpenJDK 7,而ODL Boron系列推荐使用JDK 8,版本不匹配会引发Shard创建的隐性异常
- 熔断超时阈值设置过短:默认的超时时间不足以应对RHEL6下较慢的Shard初始化流程
- 文件系统锁机制差异:RHEL与CentOS的文件系统锁实现细节不同,导致Config Shard在集群模式下无法正常获取锁完成初始化
分步解决方案
1. 禁用Transparent Huge Pages(THP)
THP是导致JVM性能下降的常见原因,执行以下命令临时禁用:
echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag
为了永久生效,将上述命令添加到/etc/rc.d/rc.local文件中,并赋予执行权限:
chmod +x /etc/rc.d/rc.local
2. 切换到兼容的JDK版本
ODL Boron-SR2要求使用JDK 8,建议安装Oracle JDK 8或OpenJDK 8:
- 卸载系统默认的OpenJDK 7:
yum remove java-1.7.0-openjdk*
- 安装OpenJDK 8:
yum install java-1.8.0-openjdk-devel
- 设置默认JDK:
alternatives --config java alternatives --config javac
3. 调整Circuit Breaker超时参数
修改ODL的数据存储配置文件$ODL_HOME/etc/org.opendaylight.controller.cluster.datastore.cfg,增大熔断超时时间:
找到以下配置项,将值从默认的30000(30秒)调整为60000(60秒):
circuit-breaker-timeout=60000
修改后重启ODL服务。
4. 检查并修复文件系统权限
确保ODL运行用户对数据目录拥有完整的读写权限:
chown -R odl-user:odl-group $ODL_HOME/data chmod -R 755 $ODL_HOME/data
如果使用集群共享存储,还要确认共享存储的挂载权限是否正确。
5. 升级ODL到Boron-SR3版本
Boron-SR2存在针对RHEL集群环境的Shard创建bug,升级到Boron-SR3可以修复该问题:
下载Boron-SR3的安装包替换现有版本,或者通过Karaf的feature repo升级(如果配置了正确的repo)。
验证步骤
- 重启ODL集群节点
- 通过JMX控制台检查"Shards"是否正常显示
- 尝试在Config tree中写入测试数据,验证是否能正常持久化
- 查看
$ODL_HOME/data/log/karaf.log,确认无Circuit Breaker Timed Out和Config Shard创建失败的日志
内容的提问来源于stack exchange,提问作者satlearner
相关产品推荐
相关产品推荐

