中國聯通軟件研究院(簡稱聯通軟研院)在全面評估與廣泛調研后,在 2021年底決定采用OceanBase? 作為基礎,自研分布式數據庫產品CUDB(即China Unicom Database,中國聯通數據庫)。目前,該分布式CUDB已在中國聯通的338多個項目中順利實施,助力完成了85TB的應用數據遷移,使慢SQL查詢數量減少了43%,同時數據庫運維效率的人均提升達到了20%。
為完善產品能力,支撐中國聯通個性化的業務需求,聯通軟研院與OceanBase社區在數據庫的內核和外圍工具層面展開共建,比如事務日志解析LogMiner、敏捷診斷工具obdiag 等功能的深度共建,以及實現多個核心功能的研發,修復多個OceanBase內核BUG。其中,對于LogMiner的共建歷程與經驗已發文分享,本文主要分享obdiag共建的技術背景、設計思路、實現細節及其帶來的價值。
一、分布式CUDB演進歷程?
四年前,中國聯通基于內部數據庫系統的痛點與外部100%自研要求的背景,啟動全棧分布式數據庫建設。從替代高危 MySQL、降低商用依賴,以及提升中國聯通軟研院軟實力等多方面考慮,選定基于國內開源分布式數據庫產品OceanBase打造自研數據庫產品分布式CUDB(詳情見生產系統穩定上線600天 ——中國聯通分布式 CUDB 的開源共建和規模化應用)。
對于分布式 CUDB 的演進歷程,簡言之,聯通軟研院在引進OceanBase的第一年著重于產品化建設。實現產品的一鍵開通、彈性擴縮、高效遷移,并且開始試點推廣應用。2023年開始對接監控運維體系,并且開始大規模推廣使用。重點聚焦數據庫產品生態工具方面的補齊和人員能力的提升,為替代 MySQL 和新上應用提供全棧國產的數據庫資源及服務能力。?
雖然聯通軟研院做了很多產品能力建設,如高效的數據遷移、異地容災高可用、完善的數據庫自治服務、智能預測與診斷自愈,形成了相對完善的產品體系。但仍面臨諸多挑戰,比如現有功能不完全滿足聯通的個性化需求,再比如運維人員對數據庫內核和源碼的掌控不足,導致處理集群問題時非常棘手。
因此,在2024年,聯通軟研院推動智能化運維,著手智能運維建設。其中,為進一步提高自動化運維診斷效率,聯通軟研院與OceanBase攜手合作,在OceanBase敏捷診斷工具obdiag的基礎上進行深度共建,并深入內核研究,共同研發了一項全新的功能——建索引報錯的根因分析功能。
二、敏捷診斷工具obdiag共建背景
OceanBase是原生分布式數據庫系統,故障根因分析通常是比較繁瑣的,涉及的因素可能有很多,如機器環境、配置參數、運行負載等。專家在排查問題的時候需要獲取大量的信息來分析故障。
那么,如何高效地獲取故障場景下分散在各個節點的信息,挖掘其中的關聯性,幫助用戶自助診斷問題呢?
在引入obdiag前,每當遇到OceanBase數據庫系統的復雜故障時,用戶往往求助于原廠的專業團隊。這不僅是因為故障排查涉及大量分布在不同節點上的信息,而且收集和整理這些信息缺乏統一的工具,再加上與專家反復溝通確認細節的過程,使整個故障解決周期變得漫長且充滿變數。
擁有obdiag這一敏捷診斷工具后,通過obdiag的一鍵集群巡檢、一鍵診斷分析、一鍵信息收集及一鍵根因分析功能,大大簡化了故障排查的交互過程。即便是經驗相對不足的技術人員也能夠快速地識別出潛在問題,并根據診斷結果采取相應的措施,提升了故障排查工作的效率。?
然而,obdiag現有的功能并不能滿足聯通軟研院的故障排查需求。眾所周知,在數據庫運維中,DDL(Data Definition Language)操作是常見且重要的組成部分,其中包括創建、刪除或修改數據庫對象,比如表、索引等。但在實際生產環境中,DDL操作可能會因為各種原因失敗,比如資源不足、并發沖突等,這會給業務帶來不必要的中斷和損失。為了解決這個問題,聯通軟研院基于obdiag框架進行了擴展,設計并實現了新的根因分析功能——建索引報錯的根因分析。該功能能夠在建索引失敗時,像專家一樣分析建索引失敗的原因,給出分析報告。
三、建索引報錯的根因分析
建索引報錯的日志分析的基本思路是根據建索引的基本步驟,判斷建索引失敗在哪一步,然后決策收集哪些機器的日志。排查思路如下圖所示。
排查共8個步驟。
第1步:租戶名、數據庫名、表名、創建索引失敗的索引名字,作為輸入參數。
第2步:根據入參,獲取對應的tenant_id、database_id、table_id。
# 獲取租戶idselect tenant_id from __all_tenant where tenant_name = '租戶名';# 獲取數據庫idselect database_id from __all_database where database_name='數據庫名';# 獲取表idselect table_id from __all_virtual_table where table_name = '表名' and tenant_id = '租戶id' and database_id='數據庫id';
第3步:根據索引名,獲取索引表id。
# 獲取索引表idselect table_id from __all_virtual_table_history where tenant_id = '租戶id' and data_table_id = '數據庫id' and table_name like '%索引名%';
第4步:根據索引表ID,查詢__all_virtual_ddl_error_message表格中是否有記錄。
# 獲取task_id、trace_idselect task_id ,trace_id from __all_virtual_ddl_error_message where tenant_id = '租戶id' and object_id = '索引表id';
如果無記錄,那說明失敗在發送RPC,打印出信息,提示此時需要人工接入排查,否則進入步驟5
第5步:根據task_id,查詢__all_rootservice_event_history表。
# 查詢__all_rootservice_event_history表select event, value6,rs_svr_ip, rs_svr_port from __all_rootservice_event_history where value4 = 'task_id' and value2 != 0 and event != 'switch_state' and event not like 'index build task process fail' order by gmt_create desc limit 1;
如果event字段的值為是ddl wait trans end ctx try_wait,那么進入第6步,如果是 index sstable build task finish,那么進入第7步,如果是其他的步驟,那么進入第8步。
第6步:event的名字為ddl wait trans end ctx try_wait,那么根據trace_id,去撈主表所有的tablet所在leader節點的日志。
第7步:event的名字為 index sstable build task finish,根據trace_id去撈取observer的日志。
第8步:event既不是ddl wait trans end ctx try_wait,也不是index sstable build task finish,此時需要根據trace_id去撈取rootservice.log.。
目前obdiag支持了增加索引時報錯診斷場景,該支持適用于OceanBase 4.2.3 版本及OceanBase 4.3版本以上。
obdiag rca run --scene=index_ddl_error --input_parameters='{"tenant_name":"cudb_test","table_name":"test1245","database_name":"test","index_name":"idx_name"}' -c obce423config.yml
input_patameters是一個用于輸入不同根因分析場景下需要引入的變量賦值,輸入對象的應該為一個json格式的字符串用于解析。
tenant_name:租戶名table_name:表名database_name:庫名index_name:索引名
示例:如下為一次調用的結果record的展示。
總結
聯通軟研院與OceanBase的合作不僅是技術上的交流,更是對未來發展趨勢的一種探索。通過共建obdiag的新功能,雙方旨在達成四個目標。
· ? ? ??提升運維效率:通過自動化的故障診斷,減少人工介入的時間成本,提升整體運維效率。
· ? ? ??增強系統穩定性:及時發現并解決問題,提高數據庫系統的穩定性和可靠性。
· ? ? ??促進技術創新:借助雙方的技術積累,共同探索數據庫領域的前沿技術,推動技術創新。
· ? ? ??增強用戶體驗:為用戶提供更可靠、更高效的數據庫服務,提高用戶滿意度。
在此過程中,特別感謝OceanBase謝振江(花名:倉氐)提供的排查思路及流程,以及中國聯通軟件研究院靖永棟提供根因分析場景編碼實現。
附錄
OceanBase GitHub倉庫:?GitHub - oceanbase/oceanbase: OceanBase is an enterprise distributed relational database with high availability, high performance, horizontal scalability, and compatibility with SQL standards.
感興趣的DBA和開發者可以加入obdiag SIG進行共建開發。
?obdiag 下載地址:?https://www.oceanbase.com/softwarecenter
?obdiag 官方文檔:?https://www.oceanbase.com/docs/obdiag-cn
?obdiag github地址:?GitHub - oceanbase/obdiag: obdiag (OceanBase Diagnostic Tool) is designed to help OceanBase users quickly gather necessary information and analyze the root cause of the problem.
?obdiag SIG 營地:?[obdiag SIG] 診斷工具組 · OceanBase 技術交流