摘要:按照任意一個或者域名查找該數據庫實例所在集群架構是否是主庫或者從庫,是運維中非常常見和必不可少的功能?;厮葜鲙旎厮葜鲙焓褂觅~號登錄執行命令,查找當前庫的主庫信息進行整理。
按照任意一個IP或者域名查找該數據庫實例所在集群架構、是否是主庫或者從庫,是DBA運維中非常常見和必不可少的功能。本文描述的功能實現已經實際應用于某互聯網公司內部,目前運行穩定,持續提供服務。這里和大家分享實現方式,和大家一起學習。
1. 前提條件
? ? ? ? 為了能夠統一查找所有集群架構,這些機器需要有一個統一的能夠訪問所有機器的賬號和密碼,這里使用db_admin;另外做主從同步的時候,需要使用統一的賬號和密碼,這里使用repl。
? ? ? ? 作為示例,這里使用如下的集群結構:
? ? ? ? 這里A、B、C是主庫的從庫,是一級從庫,D、E是從庫C的從庫,是二級從庫,如果實際有其他更復雜的結構,以此類推即可。
2. 搜索查找
? ? ? ? 平時查找,任意給一個IP或者域名進行查找,由于集群中是無法標示域名的,因此需要將域名轉化為IP進行查找。按照任意IP查找,不會知道它在集群所處的位置,為了得到整個集群的結構需要先回溯到整個集群的主庫。
3. 回溯主庫
? ? ? ?回溯主庫使用db_admin賬號登錄MySQL執行"SHOW SLAVE STATUS"命令,查找當前庫的主庫信息進行整理。
針對之前的集群結構常見的回溯類型如下圖的三種:
最終要獲得的都是主庫實例,python的實現代碼如下:
# curr_node 當前搜索節點 # lisense 統一訪問的賬號,密碼 # sub_node 子節點 def traceback_root(curr_node, lisense, sub_node): query_process = "SHOW SLAVE STATUS" master_row = None conn = None try: # 連接當前數據庫,查找主庫信息 conn = get_connection( curr_node.get("ip"), curr_node.get("port"), lisense.get("account"), lisense.get("passwd")) with open_cursor(conn) as cursor: cursor.execute(query_process) master_row = cursor.fetchone() except Exception as e: return None if master_row: return curr_node # 讀取主庫信息 io_run = master_row.get("Slave_IO_Running", "") sql_run = master_row.get("Slave_SQL_Running", "") master_ip = master_row.get("Master_Host", "") master_port = master_row.get("Master_Port", "") # 檢查主庫狀態,狀態不對返回當前節點 if io_run.lower() == "yes" and sql_run.lower() == "yes": may_master_node = dict() may_master_node["ip"] = master_ip may_master_node["port"] = master_port # 檢查父節點實例信息是否和子節點一樣, # 用來避免雙主庫回溯陷入無線循環的情況 if sub_node and sub_node.get("ip", "") == master_ip and sub_node.get("port", "") == master_port: return None # 由于考慮了雙主的情況,當前庫的父節點只是可能主庫, # 使用父節點繼續回溯主庫實例 master_node = traceback_root( may_master_node, lisense, curr_node) # 如果回溯到主庫,返回;否則返回當前節點 if master_node: return master_node else: return curr_node else: return curr_node
4. 遍歷從庫
? ? ? ?找到主庫之后,從主庫開始,查找主庫下的所有從庫。查找從庫使用db_admin登錄MySQL執行"SHOW PROCESSLIST"命令,然后從結果里,按照User是否是repl進行篩選,對于用戶是repl的從庫,連接上去使用回溯主庫使用的查看主庫的方法,驗證從庫的主庫是否是當前查詢的數據庫實例,是的話,加入集群;否則放棄。對于查找出來的從庫,繼續使用上述方式查找從庫,知道找到所有從庫。
5. 返回集群結構
? ? ? ?查找出來的集群結構,按照json格式組織,可以返回給需要的服務,也可以整理之后顯示在頁面,下圖是對查找出來的整個集群結構的簡單顯示:
6. 結束語
? ? ? ?整個查詢的大致過程如此,這里沒有說太多的編碼細節。在實際使用的過程中,可以根據需要自行進行調整,如添加多線程提高查詢速度等。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38474.html
摘要:按照任意一個或者域名查找該數據庫實例所在集群架構是否是主庫或者從庫,是運維中非常常見和必不可少的功能。回溯主庫回溯主庫使用賬號登錄執行命令,查找當前庫的主庫信息進行整理。 按照任意一個IP或者域名查找該數據庫實例所在集群架構、是否是主庫或者從庫,是DBA運維中非常常見和必不可少的功能。本文描述的功能實現已經實際應用于某互聯網公司內部,目前運行穩定,持續提供服務。這里和大家分享實現方式,...
摘要:這里有一份面試題相關總結,涉及高并發分布式高可用相關知識點,在此分享給大家,希望大家能拿到一份理想的知識點會陸續更新在上,覺得還算湊和的話可以關注一下噢高并發架構消息隊列為什么使用消息隊列消息隊列有什么優點和缺點都有什么優點和缺點如何保證消 這里有一份面試題相關總結,涉及高并發、分布式、高可用相關知識點,在此分享給大家,希望大家能拿到一份理想的 Offer! 知識點會陸續更新在 Git...
閱讀 731·2023-04-25 19:28
閱讀 1392·2021-09-10 10:51
閱讀 2390·2019-08-30 15:55
閱讀 3408·2019-08-26 13:55
閱讀 2996·2019-08-26 13:24
閱讀 3325·2019-08-26 11:46
閱讀 2751·2019-08-23 17:10
閱讀 1415·2019-08-23 16:57