前言:
用pymongo連接mongo副本集(Replica Set) 實現讀寫分離和主備切換從而解決主節點故障遷移。
副本集實例 Connection String URI 連接示例
-
獲取副本集實例的 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
默認爲連接字符串中指定的數據庫。
- 讀寫分離:
要實現讀寫分離,需要在 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)