OceanBase数据库连接路由管理组件ODP(OceanBase Database Proxy)是OceanBase数据库专用的连接路由管理集群。OceanBase数据库用户的数据会以多副本的形式存放在各个OBServer节点上,ODP接收用户发出的SQL请求,并将SQL请求转发至最佳目标OBServer节点,最后将执行结果返回给用户。
一、 ODP简介
OceanBase数据库与传统单机数据库不同,OceanBase数据库是分布式数据库,每个表甚至每个表的不同分区都可能存放在不同的机器上。想要对表进行读写,必须先要定位到数据所属的表或是分区的主副本位置,然后才能执行相应的SQL语句,这在应用层面而言是几乎不可能做到的。ODP作为OceanBase数据库专用的反向代理软件,其核心功能是路由,将客户端发起的数据访问请求转发到正确的OBServer节点上,并将OBServer节点的响应结果转发给客户端。视频讲解如下:
作为OceanBase数据库的关键组件,ODP具有以下特性:
- 连接管理:针对一个客户端的物理连接,ODP维持自身到后端多个OBServer节点的连接,并维持了每个OBServer节点连接的会话状态,保证了客户端高效访问各个OBServer节点。
- 最佳路由:ODP充分考虑用户请求涉及的副本位置、用户配置的读写分离路由策略、OceanBase多地部署的最优链路,以及OceanBase各机器的状态及负载情况,将用户的请求路由到最佳的OBServer节点,最大程度地保证了OceanBase整体的高性能运转。
- 高性能转发:ODP完整兼容MySQL协议,并支持OceanBase自研协议,采用多线程异步框架和透明流式转发的设计,保证了数据的高性能转发,同时确保了自身对机器资源的最小消耗。
- 易运维:ODP本身无状态,支持无限水平扩展,支持同时访问多个OceanBase集群。可通过丰富的内部命令对ODP状态进行实时监控,这使得运维简单便利。
- 高可用:ODP高可用分为两部分:一方面保证自身高可用,持续提供代理服务;另一方面ODP是OceanBase高可用体系的主要组成部分,可以对用户屏蔽宕机、升级等情况,保证OceanBase数据库服务的稳定和快速恢复。
- 专有协议:ODP与OBServer节点默认采用了OceanBase专有协议,如增加报文的CRC校验保证与OBServer节点链路的正确性,增强传输协议以支持Oracle兼容性的数据类型和交互模型。
客户端通过ODP访问OceanBase数据库的数据链路如下图所示。
二、 使用ODP连接数据库集群
部署好ODP集群后,便可以通过OBProxy连接OceanBase数据库集群了,下面是具体的操作步骤。
(1)在中控机上执行命令查看集群的节点信息。
obd cluster display myob-cluster # 输出的信息如下: ...... Connect to obproxy ok +-------------------------------------------------------------------+ | obproxy-ce | +---------------+------+-----------------+-----------------+--------+ | ip | port | prometheus_port | rpc_listen_port | status | +---------------+------+-----------------+-----------------+--------+ | 192.168.79.11 | 2883 | 2884 | 2885 | active | | 192.168.79.13 | 2883 | 2884 | 2885 | active | +---------------+------+-----------------+-----------------+--------+ obclient -h192.168.79.11 -P2883 -uroot@proxysys -p'Welcome_1' -Doceanbase -A ...... # 提示:从输出的信息可以看出,ODP集群中包含两台OBProxy, # 它们分别运行在:192.168.79.11和192.168.79.13主机上。
(2)登录192.168.79.11主机,查看OBProxy的目录结构。
tree /root/obproxy/ -L 1 # 输出的信息如下: /root/obproxy/ ├── bin 保存ODP的可执行二进制文件 ├── control-config ├── etc 保存配置信息的目录 ├── lib ├── log 保存日志文件的目录 ├── obproxyd.sh OBProxy的守护进程 ├── run 保存OBProxy启动的进程号信息 └── sharding-config 保存Sharding(分片)相关的配置文件 # 提示:如果OBProxy进程不存在,或者异常宕机。 # obproxyd.sh脚本负责重新启动OBProxy进程。
(3)通过操作的的ps命令可以查看到OBProxy的进程信息。
ps -ef | grep obproxy # 输出的信息如下: root 4895 ... bash /root/obproxy/obproxyd.sh /root/obproxy 192.168.79.11 2883 daemon root 4904 ... /root/obproxy/bin/obproxy --listen_port 2883 root 10892 ... grep obproxy # 提示:这里的进程号4895与4904与run目录下的进程号文件保持一致,如下所示: [root@node11 obproxy]# ls run/ obproxy-192.168.79.11-2883.pid obproxyd-192.168.79.11-2883.pid [root@node11 obproxy]# cat run/* 4904 4895
(4)通过OBProxy连接OceanBase数据库集群。
obclient -h192.168.79.11 -P2883 -uroot@sys#myob-cluster -pWelcome_1 -Doceanbase -A # 提示:该命令也可以简写成下面的形式: obclient -h192.168.79.11 -P2883 -uroot -pWelcome_1 -Doceanbase -A # 此时如果出现下面的错误: ERROR 2013 (HY000): Lost connection to MySQL server at 'reading authorization packet', system error: 11 # 这是由于集群配置信息中的proxyro_password不一致造成。
(5)在中控机上执行下面的命令编辑集群的配置信息。
obd cluster edit-config myob-cluster
(6)将global下的proxyro_password修改为正确的密码,保存并退出。
global: ...... root_password: Welcome_1 appname: myob-cluster ocp_agent_monitor_password: ztkrtULS7u proxyro_password: YqNSd87E3K ...... 修改为: global: ...... root_password: Welcome_1 appname: myob-cluster ocp_agent_monitor_password: ztkrtULS7u proxyro_password: Welcome_1 ......
(7)重新加载配置信息。
obd cluster reload myob-cluster
(8)通过OBProxy连接OceanBase数据库集群
obclient -h192.168.79.11 -P2883 -uroot@sys#myob-cluster -pWelcome_1 -Doceanbase -A ob> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | LBACSYS | | mysql | | oceanbase | | ocs | | ORAAUDITOR | | scott | | SYS | | sys_external_tbs | | test | +--------------------+ 10 rows in set (0.011 sec)
三、 查看ODP配置属性
通过使用root@sys用户通过ODP代理登录OceanBase数据库,或使用root@proxysys用户登录ODP均可以查看ODP的配置参数。下面是具体的操作步骤:
(1)执行命令登录OceanBase数据库或者ODP。
# 登录OceanBase数据库 obclient -h192.168.79.11 -P2883 -uroot@sys#myob-cluster -pWelcome_1 -Doceanbase -A # 登录ODP obclient -h192.168.79.11 -P2883 -uroot@proxysys -p'Welcome_1' -Doceanbase -A
(2)查看ODP的参数配置。
ob> show proxyconfig \G; # 输出的信息如下: ...... *************************** 326. row *************************** name: json_config_cluster_count value: 1 info: ob cluster count, meta db cluster not included need_reboot: false visible_level: virtual range: NULL config_level: NULL *************************** 327. row *************************** name: json_config_modified_time value: 2025-04-15 14:12:20.271644 info: json config modified time need_reboot: false visible_level: virtual range: NULL config_level: NULL 327 rows in set (0.012 sec)
(3)使用like关键字查看ODP的参数配置。
ob> show proxyconfig like '%full%'\G; # 输出的信息如下: *************************** 1. row *************************** name: enable_full_username value: False info: used for non-cloud user, if set true, username must have tenant and cluster need_reboot: false visible_level: SYS range: config_level: LEVEL_GLOBAL *************************** 2. row *************************** name: enable_cloud_full_username value: False info: used for cloud user, if set false, treat all login user as username need_reboot: false visible_level: SYS range: config_level: LEVEL_VIP *************************** 3. row *************************** name: enable_full_link_trace value: False info: if enable proxy will use full link trace to trace query execution need_reboot: false visible_level: USER range: config_level: LEVEL_GLOBAL 3 rows in set (0.009 sec)
(4)执行select * from proxy_config命令查看配置参数。
ob> select * from proxy_config; # 输出信息如下: +---------------------------------+-----------------+--------------+ ...... | server_state_refresh_interval | 20s | LEVEL_GLOBAL | | cache_cleaner_clean_interval | 20s | LEVEL_GLOBAL | | proxy_hot_upgrade_check_interval| 5s | LEVEL_GLOBAL | | proxy_info_check_interval | 60s | LEVEL_GLOBAL | | refresh_config | False | LEVEL_GLOBAL | | refresh_idc_list | False | LEVEL_GLOBAL | | refresh_rslist | False | LEVEL_GLOBAL | | refresh_json_config | False | LEVEL_GLOBAL | | enable_xa_route | True | LEVEL_GLOBAL | | observer_sys_password | d809d427528be882| LEVEL_GLOBAL | +---------------------------------+-----------------+--------------+ 319 rows in set (0.056 sec) # 提示:该命令仅在使用root@proxysys用户登录ODP时可执行,其他用户下执行会报错。
四、 修改ODP配置属性
修改ODP配置属性的值可以通过以下两种方式实现:
- 在ODP运行时,使用root@proxysys用户登录ODP后,执行alter proxyconfig命令修改ODP配置项。
- 在ODP启动时,启动命令中添加-o选项修改配置项。
这里以配置属性enable_cluster_checkout为例来进行演示。该属性用于控制是否进行集群名称校验,默认值是False。如果启用集群校验,在登录时ODP会发送集群名称,服务器会对其进行检查。下面是具体的操作步骤。
方式一:通过alter proxyconfig命令
(1)登录ODP。
obclient -h192.168.79.11 -P2883 -uroot@proxysys -pWelcome_1
(2)查看配置属性enable_cluster_checkout的值。
ob> show proxyconfig like 'enable_cluster_checkout' \G; # 输出信息如下: *************************** 1. row *************************** name: enable_cluster_checkout value: False info: if enable cluster checkout, proxy will send cluster name when login and server will check it need_reboot: false visible_level: USER range: config_level: LEVEL_GLOBAL 1 row in set (0.002 sec)
(3)通过alter proxyconfig命令修改属性。
ob> alter proxyconfig set enable_cluster_checkout=True;
(4)重新查看配置属性enable_cluster_checkout的值。
ob> show proxyconfig like 'enable_cluster_checkout' \G; # 输出信息如下: *************************** 1. row *************************** name: enable_cluster_checkout value: True info: if enable cluster checkout, proxy will send cluster name when login and server will check it need_reboot: false visible_level: USER range: config_level: LEVEL_GLOBAL 1 row in set (0.002 sec)
方式二:通过启动命令的-o选项
(1)在中控机上执行命令查看集群的节点信息。
obd cluster display myob-cluster # 输出的信息如下: ...... Connect to obproxy ok +-------------------------------------------------------------------+ | obproxy-ce | +---------------+------+-----------------+-----------------+--------+ | ip | port | prometheus_port | rpc_listen_port | status | +---------------+------+-----------------+-----------------+--------+ | 192.168.79.11 | 2883 | 2884 | 2885 | active | | 192.168.79.13 | 2883 | 2884 | 2885 | active | +---------------+------+-----------------+-----------------+--------+ obclient -h192.168.79.11 -P2883 -uroot@proxysys -p'Welcome_1' -Doceanbase -A ......
(2)以192.168.79.11主机上的OBProxy为例,查看OBProxy进程信息并停止OBProxy。
ps -ef|grep obproxy # 输出信息如下: Root 7574 1 ... bash /root/obproxy/obproxyd.sh /root/obproxy 192.168.79.11 2883 daemon root 7583 1 ... /root/obproxy/bin/obproxy --listen_port 2883 root 11441 5714 ... grep obproxy # 停止obproxy 进程和obproxyd进程 kill -9 7574 kill -9 7583 # 提示:obproxyd进程也需要停止。 # 否则当obproxy进程停止后,obproxyd会自动重启obproxy进程。
(3)重启OBProxy,并通过-o选项修改配置参数的值。
cd /root/obproxy/ bin/obproxy -p 2883 -r'192.168.79.11:2881;192.168.79.12:2881;192.168.79.13:2881' \ -o enable_cluster_checkout=True -c myob-cluster
(4)连接OBProxy确认配置参数已修改。
obclient -h192.168.79.11 -P2883 -uroot@proxysys -pWelcome_1 ob> show proxyconfig like 'enable_cluster_checkout' \G; # 输出的信息如下: *************************** 1. row *************************** name: enable_cluster_checkout value: True info: if enable cluster checkout, proxy will send cluster name when login and server will check it need_reboot: false visible_level: USER range: config_level: LEVEL_GLOBAL 1 row in set (0.009 sec)