k8s环境部署ob,obproxy,如何保障obproxy中的rs_list更新

【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】ob、obproxy、ob-configserver
【 使用版本 】4.5.0
【问题描述】
obproxy获取rs_list的方式有两个:

  1. 部署时手动获取rs_list,然后配置rs_list到obproxy的yaml文件。
  2. 配置configserver的地址,ob部署时配置configserver地址,ob启动后就会将自身地址注册给configserver,然后obproxy会定期向configserver拉取对应集群的rs_list。

因此存在几个问题:

  1. 在k8s中通过ob-operator部署的ob集群,如果pod ip出现变化或者ip被其它组件抢占,上面部署方式1就会出现proxy连不到ob集群的情况。
  2. k8s中是必须通过configserver获取rs_list么,但configserver本身又是单点服务,没有高可用,如果多点部署则需要将其接入第三个数据库用来存储收到的ob地址信息,不想引入。
  3. obproxy不支持以域名方式指定rs_list配置。
  4. 当前ob部署时,ob-operator会控制它固定ip,如果出现了ip被占用,是否会出现集群无法恢复。

上述问题是否存在?

如何处理k8s中部署ob、obproxy在pod ip变化或pod ip被占用后,obproxy同步rs_list问题?

4 个赞

@论坛小助手

1 个赞

针对您的问题,以下是一些关键点和解决方案:

  1. 关于rs_list更新

    • 在K8s环境中,如果使用ob-operator部署OceanBase集群,推荐使用ob-configserver来管理rs_list。这样,即使Pod的IP发生变化,obproxy也能通过ob-configserver动态获取最新的rs_list。
    • 使用ob-configserver时,虽然它本身是单点服务,但可以通过将其部署为高可用模式来解决单点问题。可以使用MySQL或SQLite3作为元数据存储,确保ob-configserver的高可用性。
  2. 关于Pod IP变化或被抢占

    • ob-operator会尝试控制Pod的固定IP,但有时仍然可能出现IP被抢占的情况。如果IP被抢占,obproxy可能无法连接到正确的OceanBase集群。
    • 解决方案是在ob-operator的配置中使用StatefulSet来确保Pod的IP地址稳定。StatefulSet可以为每个Pod分配一个稳定的网络身份,即使Pod被重建,其IP地址也不会改变。
  3. 关于obproxy不支持域名方式指定rs_list

    • 目前,obproxy确实不支持以域名方式指定rs_list。但是,可以通过DNS服务将域名解析为IP地址,从而间接实现这一功能。
  4. 关于ob-operator控制固定IP

    • 如果ob-operator控制的IP被占用,集群可能会出现无法恢复的情况。为了防止这种情况,建议使用StatefulSet来确保Pod的IP地址稳定。

具体操作步骤

  1. 部署ob-configserver

    • 使用以下命令部署ob-configserver
    kubectl apply -f https://raw.githubusercontent.com/oceanbase/ob-operator/2.3.0_release/example/webapp/configserver.yaml
    
    • 检查ob-configserver的状态:
    kubectl get pods -n oceanbase | grep ob-configserver
    
    • 检查service状态:
    kubectl get svc svc-ob-configserver -n oceanbase
    
  2. 部署OceanBase集群

    • 在部署OceanBase集群时,增加环境变量,使用ob-configserver的服务地址作为系统参数obconfig_url的值:
    kubectl apply -f https://raw.githubusercontent.com/oceanbase/ob-operator/2.3.0_release/example/webapp/obcluster.yaml
    
    • 轮询检查obcluster状态,直到集群变成running状态:
    kubectl get obclusters.oceanbase.oceanbase.com metadb -n oceanbase
    
  3. 配置obproxy

    • 在启动obproxy时,指定obproxy_config_server_url参数项来查询获取OceanBase集群的RootServer信息。例如:
    [admin@test obproxy]$ ./bin/obproxy -p2883 -s 3885 -e -n test -o obproxy_config_server_url='<YOUR_CONFIG_URL>',syslog_level=INFO
    
    • 其中<YOUR_CONFIG_URL>应替换为ob-configserver的URL。
  4. 使用StatefulSet确保Pod IP稳定

    • ob-operator的配置中,使用StatefulSet来部署OceanBase集群,确保每个Pod的IP地址稳定。

以上步骤可以有效解决K8s中部署OceanBase和obproxy时的rs_list同步问题。

具体信息可参考以下文档:

  1. OceanBase 以及应用在 K8s 中部署的示例
  2. ODP 服务高可用
  3. ODP 线程满
  4. 启动 OBProxy
  5. ODP 配置管理
1 个赞

@淇铭 请问小助手回答的准确么?

  1. 关于rs_list更新,其中提到的高可用需要引入其它组件存储元数据,引入其它组件是比较重的。当前是只能用ob-configserver,没有别的办法对么?
  2. 关于Pod IP变化或被抢占,其中提到使用StatefulSet,这个好像做不到ip不被抢占吧;还有ob-operator能以StatefulSet部署ob么。
  3. 关于obproxy不支持域名方式指定rs_list,这个是proxy本身没有使用通过域名获取的地址的接口对么。
  4. 关于ob的ip被占用了,被占用后,服务是否可用?能否自愈,或者ob-operator能否帮他自愈?
1 个赞

还没在k8s中部署过OB,如何部署呢?

1 个赞

部署operator:
https://www.oceanbase.com/docs/community-ob-operator-doc-1000000005169774
部署组件:
https://www.oceanbase.com/docs/community-ob-operator-doc-1000000005169782

1 个赞

推荐使用 oceanbsae-dashboard 部署 ob 集群,可以参考文档:https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004475535
在部署集群时,集群模式可以选择 service 模式。

2 个赞

小助手的回答比较靠谱啊

1 个赞

好的,我尝试一下

1 个赞

部署service模式后,可以解决ob节点ip变化的问题,而且在不能固定 pod ip 的环境中,节点重启恢复的更快。

不过部署proxy时还有以下几点问题,麻烦解答一下。

  1. 节点扩容,1->3,如果直接配置 RS_LISTG 初始可能只会配 1个,会出现proxy只能通过单个ob节点发现集群,同样存在单点故障。这种场景必须使用ob-configserver ,是否?
  2. 保证ob-configserver 高可用性,那就必须依赖mysql模式。 是否?
  3. ob-configserver跟ob一对一,ob-configserver直接将配置存储到对应的ob中,是否可行?
  4. 云场景下,已有部署方式都比较麻烦,不好集成(oceanbase-dashboard并不通用,很多场景没法使用),是否有更方面的部署方式。没有的话,能否考虑ob-operator中直接集成部署obproxy,管控obproxy的deployment的方式管理rs_list;或者operator支持部署ob-configserver?
1 个赞

点赞

k8s 怎么用

  1. 是的。
  2. 是的。
  3. 不太行,会产生循环依赖的问题。
  4. ob-operator 没有集成部署 obproxy 的计划,工作量较大。不过后续 operator 有计划在 dashboard 中实现一套和 ob-configserver 提供的一致的 API:https://github.com/oceanbase/ob-operator/issues/512
    当然也欢迎您在 github 上建立对应的 issue:GitHub - oceanbase/ob-operator: Kubernetes operator for OceanBase · GitHub

哈喽,请问您的企业和使用场景是什么呢,如果确有需要的话我们会安排迭代带上这个功能。