故障分析 | OceanBase Proxy 无法连接 OBserver 集群
作者:賁紹華
愛可生研發中心工程師,負責項目的需求與維護工作。其他身份:柯基鏟屎官。
本文來源:原創投稿
*愛可生開源社區出品,原創內容未經授權不得隨意使用,轉載請聯系小編并注明來源。
一、問題現象:
使用RPM的方式部署proxy實例,部署之后使用OBclient進行連接,報錯提示:
ERROR 2013 (HY000): Lost connection to MySQL server at ‘reading authorization packet’, system error: 11
二、介紹:
2.1 OceanBase介紹:
OceanBase是企業級開源分布式 HTAP(Hybrid Transaction/Analytical Processing)數據庫,具有原生分布式架構,支持金融級高可用、透明水平擴展、分布式事務、多租戶和語法兼容等企業級特性。
OceanBase 數據庫采用 Shared-Nothing 架構,各個節點之間完全對等,每個節點都有自己的 SQL 引擎、存儲引擎,運行在普通PC服務器組成的集群之上,具備可擴展、高可用、高性能、低成本、云原生等核心特性。
2.2 OBproxy介紹:
OceanBase Database Proxy(簡稱 ODP)是 OceanBase 數據庫專用的代理服務器。OceanBase 數據庫的用戶數據以多副本的形式存放在各個 OBServer 上,ODP 接收用戶發出的 SQL 請求,并將 SQL 請求轉發至最佳目標 OBServer,最后將執行結果返回給用戶。
三、相關說明:
3.1 版本與架構:
OceanBase:3.1.4
OceanBase proxy:3.2.3.5
OceanBase實例數:1 臺(10.186.60.96)
OceanBase proxy實例數:1臺 (172.20.134.5)
3.2 OBproxy的兩種啟動模式:
OBproxy配置代理的數據庫集群是通過啟動參數來設置的,目前支持如下兩種形式進行指定數據庫集群:
-
ConfigURL(代理多個數據庫集群):
多集群啟動方式,即該 OBProxy 集群可訪問多個 OceanBase 集群。OCP管理平臺自身已集成該服務,
如果是開源版的可以參考該倉庫進行ConfigURL服務的部署:https://github.com/oceanbase/oceanbase/tree/master/tools/ob-configserver
-
RSList(僅代理單個數據庫集群):
單集群啟動方式,即該 OBProxy 集群僅可訪問創建 OBProxy 集群時指定的那個 OceanBase 集群,OBProxy 實例啟動成功后不可動態追加可連接的 OceabBase 數據庫集群。配置形式為,OceanBase數據庫集群的root service列表:192.168.0.1:2881,192.168.0.2:2881
四、操作流程:
以下操作均使用開源版本RPM手動部署部署的方式進行,未使用OBD與OCP。
1.登錄OceanBase數據庫內,新建proxyro用戶并設置密碼為123456,添加授權:
$ obclient -h10.186.60.96 -uroot@sys -P2881 -p -c -A Enter password: obclient> CREATE USER proxyro IDENTIFIED BY '123456'; Query OK, 0 rows affectedobclient> GRANT SELECT ON *.* TO proxyro; Query OK, 0 rows affectedobclient> SHOW GRANTS FOR proxyro; +----------------------------------+ | Grants for proxyro@% | +----------------------------------+ | GRANT SELECT ON *.* TO 'proxyro' | +----------------------------------+ 1 row in set2.使用RPM安裝proxy:
SUDO rpm -ivh --force /tmp/obproxy-ce-3.2.3.5-2.el7.x86_64.rpm3.啟動proxy實例:
cd /home/admin/obproxy-3.2.3.5 && ./bin/obproxy -p 2883 -l 2884 -n test-proxy -o observer_sys_password=7c4a8d09ca3762af61e59520943dc26494f8941b -c ‘ob_xxxxxxxx’ -r “10.186.60.96:2882”4.啟動OBproxy進程,并為其增加守護進程:
# 返回當前proxy實例的進程數,如果為1則代表已啟動 [root@localhost]# pgrep -c obproxy | xargs --no-run-if-empty # 啟動proxy守護進程shell,使用RPM的形式進行安裝時。會在bin目錄提供管理用的shell文件 [root@localhost]# bin/obproxyd.sh -c checkalive -r -n test-proxy -p 2883 -t 10.186.60.96:2882 -s ob_xxxxxxxx & # 再次檢測proxy實例進程數,如果為2則代表符合預期:實例進程 + checkealive守護進程 [root@localhost]# pgrep -c obproxy | xargs --no-run-if-empty5.登入OBproxy查看配置是否正確,嘗試通過proxy實例連接數據庫集群,連接失敗:
五、診斷過程:
5.1 檢查實例進程:
進程運行正常,符合預期。且運行用戶為admin(根據官方手冊說明,如果在非部署目錄或使用非admin用戶運行會導致一些奇怪的問題出現)
5.2 root service list參數檢查:
proxy要代理那臺數據庫實例是通過RSlist參數決定的,登入proxy實例,查看proxy內的root service list參數,存在10.186.90.63
5.3 日志檢查
觀察obproxy.log發現兩條警告信息,意思為無法通過RSlist找到集群名為XXXX的數據庫集群
5.4 確認數據庫集群名稱
登入OceanBase數據庫集群,查看集群名稱,確認與啟動參數中指定的名稱一致
SELECT * FROM `v$ob_cluster`5.5 檢查proxy連接賬號:
檢查OceanBase數據庫集群內是否存在proxyro的連接賬號(用戶名必須為這個),且密碼是否符合預期;
六、結論:
最后經過官方大佬——序風遠程支持,定位到問題原因:
啟動參數中root service list的IP:Port中的端口,應為OceanBase數據庫的SQL port端口2881,而不是2882(RPC端口)
這次的問題引起的原因其實很好理解,但是排查起來比較費勁兒(進程能正常啟動運行、日志只有找不到數據庫集群名的錯誤、各項數據源確認也都符合預期),回頭來看排查過程中遺漏了一個確認點,就是沒有在數據庫集群上驗證RSlist參數的正確性。
七、其他:
使用過程中發現了兩處缺陷,分別是:
a. obproxyd.sh腳本的啟動參數說明有誤
b. obproxyd.sh腳本結束符存在錯誤導致無法運行
已向官方提交了PR,感興趣的可以關注一下:https://github.com/oceanbase/obproxy/pull/28
另外提一點建議:
在RSlist模式下,當啟動參數出現錯誤時可以嘗試在啟動實例進程時嘗試與數據庫實例建立連接并校驗參數正確性。如不符合預期可以退出進程將錯誤輸出至STD上?;蛘咴赿etail日志內增加一些描述,如:為什么找不到集群的cluster_name。這樣會更方便定位問題。
最后祝OceanBase開源社區越辦越紅火,給你們的響應速度點贊!(社區工單有專人輪值,一般三小時內都有回復)
總結
以上是生活随笔為你收集整理的故障分析 | OceanBase Proxy 无法连接 OBserver 集群的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 部署asp.net mvc_在ASP.N
- 下一篇: Cadence Allegro学习之铜皮