GCP上多Ejabberd Pod调用get_user_rooms接口返回结果不一致
Ejabberd集群Pod调用get_user_rooms接口返回结果不一致问题
问题详情
- 运行环境:GCP上部署3个Ejabberd Pod
- 数据库相关配置模板:
{%- if env["DEFAULT_DB"] is defined %} default_db: {{ env["DEFAULT_DB"] }} {%- endif %}
- 异常现象:调用
get_user_rooms接口时,仅一个Pod能返回正确的房间列表,其余Pod均返回空数组 - 已执行操作:重载配置、重启Pod、删除重建Pod;所有操作后启动日志显示配置加载成功、无报错,且Pod均成功加入集群
- 相关启动日志:
2025-01-31 14:28:07.432 GET 2025-01-31 10:28:07.431631+00:00 [info] Loading configuration from /home/ejabberd/conf/ejabberd.yml 2025-01-31 14:28:07.437 GET 2025-01-31 10:28:07.435907+00:00 [warning] Option 'commands_admin_access' is deprecated and has no effect anymore. Use option 'api_permissions' instead. 2025-01-31 14:28:07.613 GET 2025-01-31 10:28:07.612765+00:00 [info] Configuration loaded successfully ... 2025-01-31 14:28:11.378 GET [entrypoint_script] ejabberd did join cluster successfully
排查与解决建议
- 确认所有Pod的数据库配置一致性
- 检查每个Pod的
DEFAULT_DB环境变量值是否完全一致,包括数据库地址、端口、名称的拼写和大小写 - 进入每个Pod内部,查看最终生成的
/home/ejabberd/conf/ejabberd.yml文件,确认default_db配置完全相同,避免模板渲染时出现差异
- 检查每个Pod的
- 验证集群节点状态与数据同步
- 在每个Pod执行
ejabberdctl status,确认节点处于running状态 - 执行
ejabberdctl get_cluster_nodes,检查所有3个节点都在集群列表中且连通正常 - 若使用Mnesia存储,执行
ejabberdctl mnesia info,检查muc_room、muc_user等MUC相关表是否在所有节点上配置了复制;若未复制,可在主节点执行命令强制同步:ejabberdctl mnesia_change_table_copy_type muc_room disc_copies [节点1,节点2,节点3] ejabberdctl mnesia_change_table_copy_type muc_user disc_copies [节点1,节点2,节点3]
- 在每个Pod执行
- 测试接口本地执行结果
- 直接在每个Pod内部执行
ejabberdctl get_user_rooms [目标用户名] [域名],验证本地命令返回结果是否正确,排除负载均衡或API网关的路由问题
- 直接在每个Pod内部执行
- 检查负载均衡配置
- 确认GCP负载均衡是否开启了会话粘性,如果开启,可能导致请求一直路由到同一个Pod;可临时关闭粘性,测试请求分发到不同Pod的结果
- 开启Debug日志排查细节
- 在每个Pod的配置中添加
loglevel: debug,重启后调用接口,查看日志中关于数据库查询、集群数据同步的细节,定位是否存在查询失败或同步异常的报错
- 在每个Pod的配置中添加
内容的提问来源于stack exchange,提问作者Ojs
相关产品推荐
相关产品推荐

