Mongo副本集client讀寫分離和故障遷移

原文地址

前言:

用pymongo連接mongo副本集(Replica Set) 實現讀寫分離和主備切換從而解決主節點故障遷移。

副本集實例 Connection String URI 連接示例

  1. 獲取副本集實例的 Connection String URI 連接信息,詳情請參考Connection String URI
    ConnectionString主要內容:

    mongodb://username:[email protected]:27017,mongodb1.example.com:27017,mongodb2.example.com:27017/admin?replicaSet=myRepl&authSource=admin
    • replicaSet : 指定的名稱副本集
    • authSource: 指定與用戶憑據關聯的數據庫名稱。authSource 默認爲連接字符串中指定的數據庫。
  2. 讀寫分離:
    要實現讀寫分離,需要在 Connection String URI 的options裏添加readPreference=secondaryPreferred,設置讀請求爲Secondary節點優先。更多讀選項請參考Read preferences

示例
mongodb://username:password@dds-xxxxxxxxxxxx:3007,xxxxxxxxxxxx:3007/admin?replicaSet=mgset-xxxxxx&readPreference=secondaryPreferred

通過以上Connection String 來連接MongoDB副本集實例,讀請求將優先發給Secondary節點實現讀寫分離。同時客戶端會自動檢測節點的主備關係,當主備關係發生變化時,自動將寫操作切換到新的Primary節點上,以保證服務的高可用。

代碼實現:

def get_mongo_conn_url_replicaset(ip_port_list, user=None, pwd=None, set_name=None,set_authSource=None):
    url = 'mongodb://'
    if user is not None:
        if pwd is None:
            pwd = user
        url += '%s:%s@' % (user, pwd)
    url += ','.join(ip_port_list)
    if set_name is not None:
        url += '/?replicaSet=%s&authSource=%s&readPreference=secondaryPreferred' % (set_name,set_authSource)
    return url

ip_port_list = ['m3007.test.mongodb.m.com:3777', 's3007.test1.mongodb.m.com:3777', 's3007.test2.mongodb.m.com:3777']
conn_url = get_mongo_conn_url_replicaset(ip_port_list, "username", "password", "rs_3777","admin")
cli = MongoClient(conn_url)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章