成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

數(shù)據(jù)庫集群主從架構(gòu)查詢功能設(shè)計(jì)

shevy / 1482人閱讀

摘要:按照任意一個(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

相關(guān)文章

  • 數(shù)據(jù)庫集群主從架構(gòu)查詢功能設(shè)計(jì)

    摘要:按照任意一個(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)方式,...

    oysun 評(píng)論0 收藏0
  • 儲(chǔ)存高可用架構(gòu)

    摘要:一雙機(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、主備方...

    Lin_YT 評(píng)論0 收藏0
  • 【最全】Java 進(jìn)階面試總結(jié)

    摘要:這里有一份面試題相關(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...

    nifhlheimr 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

shevy

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<