oceanbase集群无法实现高可用

【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】
【 使用版本 】
【问题描述】清晰明确描述问题
【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):

【SOP系列 22 】——故障诊断第一步(自助诊断和诊断信息收集)

【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!
使用 OceanBase社区版4.5.3,参考https://open.oceanbase.com/blog/2235967744#%E9%83%A8%E7%BD%B2%E5%90%AF%E5%8A%A8%20OceanBase部署集群模式,三个zone部署在不同机器上,obproxy在部署集群的机器上面,经测试验证obproxy所在机器挂掉,会导致整个服务不可用。请问这是什么原因啊?我想要实现高可用应该怎么做配置?

2 个赞

日志采集场景: 集群无法连接
日志采集命令: obdiag gather scene run --scene=observer.cluster_down

另外,为了确定具体的问题,在此需要您提供一些信息:(下面提出几个问题)

  1. 当 obproxy 所在机器挂掉后,集群中的其他节点是否仍然正常运行?是否有任何错误日志或警告信息?
  2. 您的 OceanBase 集群当前的部署架构是怎样的?例如,是否使用了 OCP 或 OBD 进行管理?
  3. 您是否已经配置了多副本(如三副本)来确保高可用性?如果已配置,请提供具体的分区和副本分布情况。
  4. 您是否对 obproxy 进行了负载均衡或冗余配置?例如,是否有多台 obproxy 实例运行以避免单点故障?
  5. 您期望的高可用方案具体是什么?例如,是否需要自动切换主从或快速恢复服务的能力?

建议您使用上述 obdiag 命令采集日志并提供给我们,以便进一步分析问题的根本原因。同时,根据您的回答,我们可以为您设计更合适的高可用配置方案。

附上敏捷诊断工具 obdiag 使用帮助链接

2 个赞
  1. 其他节点不能做正常运行,没有错误日志,数据库连接超时
  2. 没有使用OCP和OBD进行管理


4. 目前只有一台obproxy实例。也可以告诉我一下怎么添加obproxy示例
5. 需要自动切换主从

2 个赞

根据您提供的信息和问题描述,以下是针对您的 OceanBase 集群无法实现高可用的问题分析及解决方案:


问题分析

  1. 其他节点不能正常运行,数据库连接超时
    根据您提供的截图,_all_tenant 表显示了租户的 tenant_nameprimary zone。如果其他节点在 obproxy 所在机器挂掉后也无法正常工作,可能是以下原因之一:

    • 网络分区问题:obproxy 所在机器挂掉后,可能影响了集群内部的网络通信,导致其他节点无法正常提供服务。
    • 主副本不可用:如果主副本所在的 zone 或者 observer 节点不可用,OceanBase 数据库会进入只读模式或完全不可用状态。
  2. 没有使用 OCP 或 OBD 进行管理
    OCP 和 OBD 是 OceanBase 的管理和部署工具,能够帮助您更方便地监控和维护集群健康状态。未使用这些工具可能导致您无法快速发现和解决潜在问题。

  3. 目前只有一台 obproxy 实例
    单一的 obproxy 实例是单点故障的主要原因。当 obproxy 所在机器挂掉时,所有客户端请求都无法通过代理访问到 OceanBase 数据库。

  4. 需要自动切换主从
    OceanBase 社区版支持多副本架构(如三副本),并通过 Paxos 协议实现高可用性。但要实现自动切换主从,需要正确配置分区和副本分布,并确保网络和硬件环境的稳定性。


解决方案

1. 增加 obproxy 实例以避免单点故障

您可以通过以下步骤添加多个 obproxy 实例:

  • 安装 obproxy
    在每台需要部署 obproxy 的机器上执行以下命令安装 obproxy:
    wget https://mirrors.oceanbase.com/obproxy/releases/{版本号}/obproxy-{版本号}-linux-x86_64.tar.gz
    tar -xzf obproxy-{版本号}-linux-x86_64.tar.gz
    cd obproxy-{版本号}-linux-x86_64
    
  • 配置 obproxy
    编辑 obproxy 的配置文件 config.conf,指定 OceanBase 集群的连接信息。例如:
    [observer]
    server=192.168.1.1:2881
    user=root
    password=
    tenant=oceanbase
    
  • 启动 obproxy
    启动多个 obproxy 实例并将其注册到负载均衡器中:
    ./bin/obproxy -c config.conf
    

建议:将 obproxy 实例分布在不同的物理机器上,并通过负载均衡器(如 Nginx、HAProxy)分发流量。


2. 检查并优化分区和副本分布

  • 确认分区和副本分布
    使用以下 SQL 查询分区和副本分布情况:

    SELECT partition_id, svr_ip, svr_port, role FROM __all_virtual_clog_stat;
    

    确保每个分区的主副本和备副本分布在不同的 zone 中。

  • 调整副本分布
    如果发现某些 zone 的副本分布不均匀,可以手动调整副本分布。例如,将某个分区的主副本迁移到其他 zone:

    ALTER SYSTEM MOVE UNIT UNIT_NAME TO ZONE zone_name;
    

3. 启用自动切换主从功能

OceanBase 社区版默认支持基于 Paxos 协议的自动切换主从功能。为了确保该功能正常工作,请检查以下配置:

  • Paxos 副本数
    确保每个分区至少有三个副本(一个主副本和两个备副本)。可以通过以下 SQL 查询副本数量:
    SELECT COUNT(*) FROM __all_virtual_clog_stat WHERE partition_id = {partition_id};
    
  • 网络分区检测
    确保集群中的所有节点能够互相通信。如果发生网络分区,OceanBase 会自动选举新的主副本。

4. 引入 OCP 或 OBD 进行管理

  • OCP
    OCP 是 OceanBase 的图形化管理平台,可以帮助您更方便地监控集群状态、管理租户和配置高可用策略。您可以参考官方文档安装和配置 OCP:
    OCP 安装指南

  • OBD
    OBD 是 OceanBase 的命令行管理工具,支持集群部署、扩容和升级等操作。您可以参考以下命令接管现有集群:

    obd cluster takeover {cluster_name}
    

总结

  1. 增加 obproxy 实例并使用负载均衡器分发流量,避免单点故障。
  2. 检查并优化分区和副本分布,确保主副本和备副本分布在不同的 zone 中。
  3. 确保集群配置满足 Paxos 协议要求,启用自动切换主从功能。
  4. 引入 OCP 或 OBD 工具进行集群管理,提升运维效率。

如果您按照上述步骤操作后仍然遇到问题,请使用 obdiag 工具采集日志并提供给我们进一步分析:

obdiag gather scene run --scene=observer.cluster_down

希望以上建议对您有所帮助!

详情请参考:

  1. 数据库应急概述
  2. 遇到问题如何向技术支持同学提问
  3. 分析诊断&决策流程
  4. 使用 obd 进行运维
  5. OceanBase 云平台 Express (OCP Express)
  6. 连接租户
  7. 问题排查思路

(小助手的答复已结束,如未能解决您的问题,请继续提问并等待其他同学的回复,谢谢!)

1 个赞

OBProxy前面挂负载均衡了吗?

1 个赞

单个obproxy 可以实现observer的高可用 。
obproxy的高可用机制使用F5 ,slb 等高可用组件实现

如果通过2883端口进去数据库想实现高可用 , obproxy必须多个节点

1 个赞

高可用可以分为以下几点:
1、obproxy服务实现多个observer(集群)节点的高可用
2、负载+多个obproxy服务实现,程序到数据库的高可用
3、OCP服务上可以部署obproxy集群,添加多个obproxy服务(实例)

1 个赞

学习

业务是通过obproxy进行连接ob的。
一般生产环境都是搭建个负载均衡+obproxy集群

1 个赞