b406.png OceanBase數據庫連接路由管理組件ODP(OceanBase Database Proxy)是OceanBase數據庫專用的連接路由管理集羣。OceanBase數據庫用户的數據會以多副本的形式存放在各個OBServer節點上,ODP接收用户發出的SQL請求,並將SQL請求轉發至最佳目標OBServer節點,最後將執行結果返回給用户。

一、 ODP簡介

OceanBase數據庫與傳統單機數據庫不同,OceanBase數據庫是分佈式數據庫,每個表甚至每個表的不同分區都可能存放在不同的機器上。想要對錶進行讀寫,必須先要定位到數據所屬的表或是分區的主副本位置,然後才能執行相應的SQL語句,這在應用層面而言是幾乎不可能做到的。ODP作為OceanBase數據庫專用的反向代理軟件,其核心功能是路由,將客户端發起的數據訪問請求轉發到正確的OBServer節點上,並將OBServer節點的響應結果轉發給客户端。

image.png
點擊這裏查看視頻講解:【趙渝強老師】:OceanBase的連接與路由管理

作為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數據庫的數據鏈路如下圖所示。 image.png

二、 使用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)

image.png

三、 查看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時可執行,其他用户下執行會報錯。

image.png

四、 修改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)

image.png

image.png