摘要:按照任意一個(gè)或者域名查找該數(shù)據(jù)庫實(shí)例所在集群架構(gòu)是否是主庫或者從庫,是運(yùn)維中非常常見和必不可少的功能。回溯主庫回溯主庫使用賬號(hào)登錄執(zhí)行命令,查找當(dāng)前庫的主庫信息進(jìn)行整理。
按照任意一個(gè)IP或者域名查找該數(shù)據(jù)庫實(shí)例所在集群架構(gòu)、是否是主庫或者從庫,是DBA運(yùn)維中非常常見和必不可少的功能。本文描述的功能實(shí)現(xiàn)已經(jīng)實(shí)際應(yīng)用于某互聯(lián)網(wǎng)公司內(nèi)部,目前運(yùn)行穩(wěn)定,持續(xù)提供服務(wù)。這里和大家分享實(shí)現(xiàn)方式,和大家一起學(xué)習(xí)。
1. 前提條件
? ? ? ? 為了能夠統(tǒng)一查找所有集群架構(gòu),這些機(jī)器需要有一個(gè)統(tǒng)一的能夠訪問所有機(jī)器的賬號(hào)和密碼,這里使用db_admin;另外做主從同步的時(shí)候,需要使用統(tǒng)一的賬號(hào)和密碼,這里使用repl。
? ? ? ? 作為示例,這里使用如下的集群結(jié)構(gòu):
? ? ? ? 這里A、B、C是主庫的從庫,是一級(jí)從庫,D、E是從庫C的從庫,是二級(jí)從庫,如果實(shí)際有其他更復(fù)雜的結(jié)構(gòu),以此類推即可。
2. 搜索查找
? ? ? ? 平時(shí)查找,任意給一個(gè)IP或者域名進(jìn)行查找,由于集群中是無法標(biāo)示域名的,因此需要將域名轉(zhuǎn)化為IP進(jìn)行查找。按照任意IP查找,不會(huì)知道它在集群所處的位置,為了得到整個(gè)集群的結(jié)構(gòu)需要先回溯到整個(gè)集群的主庫。
3. 回溯主庫
? ? ? ?回溯主庫使用db_admin賬號(hào)登錄MySQL執(zhí)行"SHOW SLAVE STATUS"命令,查找當(dāng)前庫的主庫信息進(jìn)行整理。
針對(duì)之前的集群結(jié)構(gòu)常見的回溯類型如下圖的三種:
最終要獲得的都是主庫實(shí)例,python的實(shí)現(xiàn)代碼如下:
# curr_node 當(dāng)前搜索節(jié)點(diǎn) # lisense 統(tǒng)一訪問的賬號(hào),密碼 # sub_node 子節(jié)點(diǎn) def traceback_root(curr_node, lisense, sub_node): query_process = "SHOW SLAVE STATUS" master_row = None conn = None try: # 連接當(dāng)前數(shù)據(jù)庫,查找主庫信息 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", "") # 檢查主庫狀態(tài),狀態(tài)不對(duì)返回當(dāng)前節(jié)點(diǎn) 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 # 檢查父節(jié)點(diǎn)實(shí)例信息是否和子節(jié)點(diǎn)一樣, # 用來避免雙主庫回溯陷入無線循環(huán)的情況 if sub_node and sub_node.get("ip", "") == master_ip and sub_node.get("port", "") == master_port: return None # 由于考慮了雙主的情況,當(dāng)前庫的父節(jié)點(diǎn)只是可能主庫, # 使用父節(jié)點(diǎn)繼續(xù)回溯主庫實(shí)例 master_node = traceback_root( may_master_node, lisense, curr_node) # 如果回溯到主庫,返回;否則返回當(dāng)前節(jié)點(diǎn) if master_node: return master_node else: return curr_node else: return curr_node
4. 遍歷從庫
? ? ? ?找到主庫之后,從主庫開始,查找主庫下的所有從庫。查找從庫使用db_admin登錄MySQL執(zhí)行"SHOW PROCESSLIST"命令,然后從結(jié)果里,按照User是否是repl進(jìn)行篩選,對(duì)于用戶是repl的從庫,連接上去使用回溯主庫使用的查看主庫的方法,驗(yàn)證從庫的主庫是否是當(dāng)前查詢的數(shù)據(jù)庫實(shí)例,是的話,加入集群;否則放棄。對(duì)于查找出來的從庫,繼續(xù)使用上述方式查找從庫,知道找到所有從庫。
5. 返回集群結(jié)構(gòu)
? ? ? ?查找出來的集群結(jié)構(gòu),按照json格式組織,可以返回給需要的服務(wù),也可以整理之后顯示在頁面,下圖是對(duì)查找出來的整個(gè)集群結(jié)構(gòu)的簡(jiǎn)單顯示:
6. 結(jié)束語
? ? ? ?整個(gè)查詢的大致過程如此,這里沒有說太多的編碼細(xì)節(jié)。在實(shí)際使用的過程中,可以根據(jù)需要自行進(jìn)行調(diào)整,如添加多線程提高查詢速度等。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/17576.html
摘要:按照任意一個(gè)或者域名查找該數(shù)據(jù)庫實(shí)例所在集群架構(gòu)是否是主庫或者從庫,是運(yùn)維中非常常見和必不可少的功能。回溯主庫回溯主庫使用賬號(hào)登錄執(zhí)行命令,查找當(dāng)前庫的主庫信息進(jìn)行整理。 按照任意一個(gè)IP或者域名查找該數(shù)據(jù)庫實(shí)例所在集群架構(gòu)、是否是主庫或者從庫,是DBA運(yùn)維中非常常見和必不可少的功能。本文描述的功能實(shí)現(xiàn)已經(jīng)實(shí)際應(yīng)用于某互聯(lián)網(wǎng)公司內(nèi)部,目前運(yùn)行穩(wěn)定,持續(xù)提供服務(wù)。這里和大家分享實(shí)現(xiàn)方式,...
摘要:一雙機(jī)高可用主備方式主機(jī)和備機(jī)雙方只需要進(jìn)行數(shù)據(jù)復(fù)制即可,無須進(jìn)行狀態(tài)判斷和主備切換這類復(fù)雜的操作應(yīng)用場(chǎng)景內(nèi)部的后臺(tái)管理系統(tǒng)主從復(fù)制從機(jī)需要提供讀操作,需要考慮主從復(fù)制延遲客戶端感知主從關(guān)系等問題應(yīng)用場(chǎng)景寫少讀多的新聞網(wǎng)站雙機(jī)切換設(shè)計(jì)要點(diǎn)主 showImg(https://segmentfault.com/img/bVbtpqk?w=648&h=174);? 一、雙機(jī)高可用 1、主備方...
摘要:這里有一份面試題相關(guān)總結(jié),涉及高并發(fā)分布式高可用相關(guān)知識(shí)點(diǎn),在此分享給大家,希望大家能拿到一份理想的知識(shí)點(diǎn)會(huì)陸續(xù)更新在上,覺得還算湊和的話可以關(guān)注一下噢高并發(fā)架構(gòu)消息隊(duì)列為什么使用消息隊(duì)列消息隊(duì)列有什么優(yōu)點(diǎn)和缺點(diǎn)都有什么優(yōu)點(diǎn)和缺點(diǎn)如何保證消 這里有一份面試題相關(guān)總結(jié),涉及高并發(fā)、分布式、高可用相關(guān)知識(shí)點(diǎn),在此分享給大家,希望大家能拿到一份理想的 Offer! 知識(shí)點(diǎn)會(huì)陸續(xù)更新在 Git...
閱讀 485·2023-04-25 17:26
閱讀 1504·2021-08-05 09:58
閱讀 1970·2019-08-30 13:17
閱讀 953·2019-08-28 17:52
閱讀 1069·2019-08-26 18:27
閱讀 1424·2019-08-26 14:05
閱讀 3622·2019-08-26 14:05
閱讀 1597·2019-08-26 10:45