行行速速
#1
【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】ob、obproxy、ob-configserver
【 使用版本 】4.5.0
【问题描述】
obproxy获取rs_list的方式有两个:
- 部署时手动获取rs_list,然后配置rs_list到obproxy的yaml文件。
- 配置configserver的地址,ob部署时配置configserver地址,ob启动后就会将自身地址注册给configserver,然后obproxy会定期向configserver拉取对应集群的rs_list。
因此存在几个问题:
- 在k8s中通过ob-operator部署的ob集群,如果pod ip出现变化或者ip被其它组件抢占,上面部署方式1就会出现proxy连不到ob集群的情况。
- k8s中是必须通过configserver获取rs_list么,但configserver本身又是单点服务,没有高可用,如果多点部署则需要将其接入第三个数据库用来存储收到的ob地址信息,不想引入。
- obproxy不支持以域名方式指定rs_list配置。
- 当前ob部署时,ob-operator会控制它固定ip,如果出现了ip被占用,是否会出现集群无法恢复。
上述问题是否存在?
如何处理k8s中部署ob、obproxy在pod ip变化或pod ip被占用后,obproxy同步rs_list问题?
4 个赞
论坛小助手
#4
针对您的问题,以下是一些关键点和解决方案:
-
关于rs_list更新
- 在K8s环境中,如果使用
ob-operator部署OceanBase集群,推荐使用ob-configserver来管理rs_list。这样,即使Pod的IP发生变化,obproxy也能通过ob-configserver动态获取最新的rs_list。
- 使用
ob-configserver时,虽然它本身是单点服务,但可以通过将其部署为高可用模式来解决单点问题。可以使用MySQL或SQLite3作为元数据存储,确保ob-configserver的高可用性。
-
关于Pod IP变化或被抢占
-
ob-operator会尝试控制Pod的固定IP,但有时仍然可能出现IP被抢占的情况。如果IP被抢占,obproxy可能无法连接到正确的OceanBase集群。
- 解决方案是在
ob-operator的配置中使用StatefulSet来确保Pod的IP地址稳定。StatefulSet可以为每个Pod分配一个稳定的网络身份,即使Pod被重建,其IP地址也不会改变。
-
关于obproxy不支持域名方式指定rs_list
- 目前,
obproxy确实不支持以域名方式指定rs_list。但是,可以通过DNS服务将域名解析为IP地址,从而间接实现这一功能。
-
关于ob-operator控制固定IP
- 如果
ob-operator控制的IP被占用,集群可能会出现无法恢复的情况。为了防止这种情况,建议使用StatefulSet来确保Pod的IP地址稳定。
具体操作步骤:
-
部署ob-configserver
kubectl apply -f https://raw.githubusercontent.com/oceanbase/ob-operator/2.3.0_release/example/webapp/configserver.yaml
kubectl get pods -n oceanbase | grep ob-configserver
kubectl get svc svc-ob-configserver -n oceanbase
-
部署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
-
配置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。
-
使用StatefulSet确保Pod IP稳定
- 在
ob-operator的配置中,使用StatefulSet来部署OceanBase集群,确保每个Pod的IP地址稳定。
以上步骤可以有效解决K8s中部署OceanBase和obproxy时的rs_list同步问题。
具体信息可参考以下文档:
- OceanBase 以及应用在 K8s 中部署的示例
- ODP 服务高可用
- ODP 线程满
- 启动 OBProxy
- ODP 配置管理
1 个赞
行行速速
#7
1 个赞
甘霖
#8
2 个赞
行行速速
#11
部署service模式后,可以解决ob节点ip变化的问题,而且在不能固定 pod ip 的环境中,节点重启恢复的更快。
不过部署proxy时还有以下几点问题,麻烦解答一下。
- 节点扩容,1->3,如果直接配置 RS_LISTG 初始可能只会配 1个,会出现proxy只能通过单个ob节点发现集群,同样存在单点故障。这种场景必须使用ob-configserver ,是否?
- 保证ob-configserver 高可用性,那就必须依赖mysql模式。 是否?
- ob-configserver跟ob一对一,ob-configserver直接将配置存储到对应的ob中,是否可行?
- 云场景下,已有部署方式都比较麻烦,不好集成(oceanbase-dashboard并不通用,很多场景没法使用),是否有更方面的部署方式。没有的话,能否考虑ob-operator中直接集成部署obproxy,管控obproxy的deployment的方式管理rs_list;或者operator支持部署ob-configserver?
1 个赞
甘霖
#15
哈喽,请问您的企业和使用场景是什么呢,如果确有需要的话我们会安排迭代带上这个功能。