溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MongoDB報表實例 -- 標簽成員方案

發(fā)布時間:2020-08-05 21:56:26 來源:網(wǎng)絡(luò) 閱讀:2439 作者:UltraSQL 欄目:MongoDB數(shù)據(jù)庫

更加復雜,但是靈活的方法,用于路由報表查詢到一個專屬節(jié)點去使用標簽和讀偏好。


因為使用隱藏成員,設(shè)置一個成員為priority: 0,但是不設(shè)置它為隱藏。然而,分配一個標簽use: reporting:

PRIMARY> conf = rs.config()    
{ "_id" : "test", "version" : 21, "members" : [ { "_id" : 0, "host" : "xucy.local:27017", }, { "_id" : 1, "host" : "xucy.local:28017", }, { "_id" : 2, "host" : "xucy.local:29017", } ] } // we'll use members[1], the instance on port 28017     
PRIMARY> conf.members[1].priority = 0     
PRIMARY> conf.members[1].tags = { "use": "reporting" }     
PRIMARY> conf.version += 1     
PRIMARY> rs.reconfig(conf)    
[...]


像之前一樣,xucy.local:28017絕不會成為主;然而,在這種情況下其他兩個機器變得不可達,你的應用將能處理讀到報表服務器。它會繼續(xù)不用說你的報表應該在這樣一個事件期間暫停。


你的報表代碼將會像這樣(用Python,這次):

from pymongo import MongoReplicaSetClient    
from pymongo.read_preferences import ReadPreference     
rep_set = MongoReplicaSetClient( 'xucy.local:27017,xucy.local:28017,xucy.local:29017', replicaSet = 'test', read_preference = ReadPreference.SECONDARY, tag_sets = [{'use':'reporting'}] ) # check to ensure we're not running reporting against the sole remaining secondary if rep_set.primary is not None: rep_set.my_application.users.aggregate(...)


以上只發(fā)送報表查詢到副本標記有use: reporting,并且如果沒有可用的主,它根本上避免運行。在實踐中,你會拋出異常并在你的擴展代碼中處理它們,如果你發(fā)現(xiàn)沒有主!更好的還是,你的監(jiān)控可以設(shè)置運行時可用的值,你可以轉(zhuǎn)移,例如,reporting_system.ok()。


益處和考慮


使用標簽和讀偏好允許一些級別的靈活性,而那在隱藏成員中是不可能的。


報表實例可以容易添加


因為你的連接代碼是可定義的,而不是指定到一個專門的主機,添加更多節(jié)點為報表作業(yè),只添加他們并標記他們,像這樣:

PRIMARY> rs.add({_id:3, host:"xucy.local:30017", priority:0, tags:{'use':'reporting'}})


你存在的代碼將會利用新的容量,并且復制集將繼續(xù)運行,不用觸發(fā)選舉和從客戶端斷開連接。


報表實例可以被跳過或刪除


報表標記可以被移動,或者甚至移除,如果你需要提供讀帶寬給其他作業(yè)在必要時。像這樣的一個重新配置將會觸發(fā)選舉,并重連所有客戶端,但是這不會比其他選項更糟糕。注意:這是一個反模式的通過發(fā)布生產(chǎn)讀到副本成員來增加常用容量。這只是一個緊急方式。


一些驅(qū)動需要手工同步


Ruby驅(qū)動(像1.9.2),例如,不會刷新副本集的視圖除非客戶端像這樣顯式初始化,使用refresh_mode: :sync。檢查你的驅(qū)動文檔。


結(jié)論


簡單的復制配置已經(jīng)成為我喜歡MongoDB原因之一,它使得MySQL復制看起來像出自石器時代。它有些粗糙,但是已經(jīng)在不斷提升性能。無論你使用標記集合或者隱藏成員,構(gòu)建一個報表架構(gòu)在MongoDB的復制屬性上,簡化操作,讓你專注于構(gòu)建一個偉大的應用。


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI