1. 程式人生 > >MongoDB分片叢集與複製集

MongoDB分片叢集與複製集

分片叢集 
1.1、概念 
分片叢集是將資料儲存在多臺機器上的操作,主要由查詢路由mongos、分片、配置伺服器組成。 
●查詢路由根據配置伺服器上的元資料將請求分發到相應的分片上,本身不儲存叢集的元資料,只是快取在記憶體中。 
●分片用來儲存資料塊。資料集根據分片鍵將集合分割為資料塊,儲存在不同的分片上。在生產環境下,通常一個分片由一個複製集組成。 
●配置伺服器儲存叢集的元資料,包括資料與分片的對映關係,配置伺服器一旦掛掉,叢集將無法工作。 
注意: 
●當mongos重啟時,會從配置伺服器讀取元資料更新自己快取的元資料 
●當分割資料時或者在分片間移動資料時會寫配置伺服器。 
●在分片叢集中,配置伺服器可以採用複製集的

架構,但複製集中不允許有仲裁節點和延時節點,且buildindexes必須設為true。 
●集合的資料分佈在多個分片上,如果某個分片失效,查詢會返回錯誤,可以通過為查詢指定partial選項,允許接受不完整的資料 
作用 
單臺機器無法滿足儲存需求,記憶體、磁碟空間不夠,讀寫吞吐量不夠。 
1.2、如何維護資料均衡分佈 
叢集使用分割器和平衡器兩個後臺程序維護資料均勻分佈。 
分割器 
●分割器的作用是防止資料塊變大,資料塊大小預設是64MB,當超過64MB時,分割器會將其一分為二。 
●分割的物件不是實際的資料,而是元資料,只是在邏輯上進行邏輯塊的劃分,不會影響到實際資料的分佈 
●資料塊太小會產生大量塊,容易使叢集不平衡,導致資料塊頻繁移動,降低叢集效能,元資料增加,降低查詢效率 
●資料塊太大,會減小移動頻率,元資料少,有利於資料查詢,但一旦移動,會花費很長時間 
●並不是所有的集合都會分片,沒有被分片的集合都儲存在同一個主分片上 
●只有對
資料庫
和集合開啟分片後,資料才會在不同分片上分佈,否則只儲存在主分片上 
●插入和更新操作都有可能引發分割 
平衡器 
●平衡器的作用是管理資料塊的移動。 
●當叢集中資料塊的分佈達到移動閾值時,平衡器會移動資料塊。 
●增加或減少分片或增刪資料也會使平衡器移動資料塊 
1.3資料塊如何儲存在相應分片上 
每個需要被分片的集合都需要指定索引欄位作為分片鍵,MongoDB使用區間分割槽或雜湊分割槽演算法根據分片鍵將資料分割為資料塊。 
●區間分割槽 
資料塊覆蓋一段子區間,任何分片鍵都會被某一段覆蓋 
優缺點 
區間分割槽支援更好的range查詢,通過分片鍵查詢,查詢路由可以很容易的判斷出哪些資料塊含有查詢需要資料,並將請求分配到的分片上。 
區間分割槽使資料分佈不均勻 
●雜湊分割槽 
根據分片鍵的雜湊值進行資料的分配。 
優缺點 
資料隨機分配到不同的資料塊 
在進行range查詢時,由於相鄰資料分佈在不同分片上,導致訪問很多分片 
注意 
●分片鍵不能是多鍵索引,即索引欄位的值不能是陣列 
●分片鍵一旦被指定,不能被修改為其他欄位,同時分片鍵的欄位值也不能被修改 
●如果叢集的寫操作比較多,可以使用雜湊分割槽,將資料均勻分配到節點上,將寫操作均勻應用與叢集, 
如果叢集讀操作比較多,可以使用區間分割槽,將相鄰資料分到同一節點上,便於查詢 
●如果查詢時沒有指定索引欄位,查詢路由會將請求分發到所有節點上,等待返回結果,查詢效率低 
如果查詢時指定了索引欄位,查詢路由會將請求分發到少數節點上,查詢效率高 
1.4、資料遷移過程
 
●平衡器向源節點發送movechunk指令 
●源節點移動指定資料塊,在遷移期間,資料塊的讀寫操作仍路由到源節點 
●目的節點如果沒有需要的索引,此時會構建索引 
●目的節點開始請求資料塊中的資料,儲存在本地 
●在遷移期間,源節點上的資料如果發生變化,在遷移完之後,目的節點會同步源節點上變更的資料 
●同步結束後,目的節點會與配置伺服器建立連線,配置伺服器更新元資料,此期間源節點阻塞寫操作 
●源節點上的舊資料被刪除 
1.5、備份資料 
mongodump -h dbhost -d dbname -o directory 命令格式 
mongodump -h 127.0.0.1:28002 -d test -o /home/backup 
將本機資料庫test中資料備份到/home/backup下 
恢復資料 
mongorestore -h dbhost -d dbname –directoryperdb dbdirectory dbdirectory為備份資料所在位置

複製集 
2.1、概念與特性 
概念 
複製集是一組具有相同資料的mongod例項,包含主節點以及從節點。叢集中任何時候只有一個主節點,主節點將資料變更操作寫到oplog(封頂表)中,從節點讀取oplog,並將oplog中的操作應用的本地資料,從而實現資料同步。

特性 
●非同步複製 
從節點並不是實時複製主節點中的資料 
●自動容災 
主節點宕機,主動發起選舉 
●讀操作 
從從節點上讀到的資料可能並不是最新的 
2.2、複製整合員 
複製集最多包含50個節點,最多隻能有7個可以投票。包含以下節點型別 
●主節點primary 
可以執行讀寫操作,所有節點均可以執行讀操作。預設情況下,讀請求只會傳送給主節點,可以通過read preference設定。主節點的優先順序priority至少為1。 
●從節點secondary 
只可以執行讀操作。從節點通過與主節點同步,實現備份資料的功能,複製集至少有一個從節點。通過配置複製集的配置檔案可以設定從節點是否參與選舉(vote=0)以及是否可以被選舉為主節點(priority=0)優先順序priority為0的節點不能發起選舉,不能被選舉為主節點,但可以投票。 
●隱藏節點 
通過設定從節點的hidden屬性,可以對客戶端隱藏節點,不接受讀寫請求,無法被選舉為主節點(priority=0),只能投票,主要用於備份資料。 
●延時節點 
通過設定隱藏節點的slaveDelay屬性可以使節點延時一定時間從主節點複製資料,可以起到保護資料的作用。延時節點是在隱藏節點的基礎上,多了一個延時屬性。 
●仲裁節點Arbiter 
本身不儲存資料,不能被選舉為主節點,只能投票,仲裁節點主要用於使複製集中節點個數為奇數,從而容易達到多數派。仲裁節點只消耗極少的資源,但不要與主節點、從節點部署在同一個物理節點上。 
●非投票節點 
不參與投票,但儲存資料,可以接受讀操作 
2.3、複製集管理 
●use admin切換到admin資料庫 
●config={_id:”myset”,members:[{“_id”:0,”host”:”127.0.0.1:28001”,”priority”:2},{“_id”:1,”host”:”127.0.0.1:28002”,”priority”:1}]} 
●rs.initiate(config) 
修改複製集配置 
●cfg=rs.conf() 
●cfg.members[0].priority=1 
●rs.reconfig(cfg) 
複製集維護 
將配置檔案中的replset註釋掉,從而以單機模式啟動複製集,維護完畢後再加入複製集。 
2.4、大多數原則 
概念 
如果複製集中的節點個數為N,則大多數為N/2+1(N/2向下取整),當複製集中存活節點數小於大多數時,不存在主節點,無法提供寫服務。

作用 
大多數原則保證了,在任何時刻複製集中的主節點個數不會超過一個。比如複製集部署在兩個機房,兩個機房通訊發生故障,不含有主節點的機房會選舉出一個主節點,等到故障恢復,複製集就會存在兩個主節點,無法保證資料的一致性。 
2.5、選舉 
選舉的前提條件 
複製集滿足大多數原則。在選舉的過程中,複製集無法進行寫操作。

何時會引發選舉 
●複製集初始化時或被重新配置後 
●主節點宕機或主節點網路不可達,即大多數節點無法連線主節點 
●人為將主節點降為從節點,執行rs.stepDown(n)命令 
●有更高優先順序的節點加入複製集

選舉特點 
●優先順序高的節點優先被選為主節點 
●具有最高optime的節點被選為主節點 
●如果優先順序高的節點不具有最新的optime,那麼首先會同步主節點的oplog 
●優先順序為0的節點無法發起選舉,且無法成為主節點,只能投票。 
●所有成員都可以否決選舉,包括不投票的節點Non-voting

何時否決選舉 
●發起選舉的節點不包含最新資料 
●發起選舉的節點優先順序比其他節點低 
●發起選舉的節點沒有持有最高的optime 
2.6、資料回滾 
概念:在主節點失效之前,從節點並未全部複製主節點上的資料,原先的主節點在選舉出新的主節點後重新加入複製集,會導致舊主節點與新主節點資料不一致,舊主節點會將不一致的資料回滾,從而與主節點資料保持一致。

避免資料回滾 
預設情況下,在主節點上寫入成功後,就會向客戶端返回結果,可能造成回滾,客戶端可以修改寫策略writeconcern為向大多數節點寫入成功後才返回結果。 
2.7、讀寫策略 
writeconcern:不等待主節點寫入成功,客戶端就返回結果;等待主節點寫入成功,就返回結果;等到大多數節點寫入成功,才返回結果 
readconcern:只讀主節點、只讀從節點、優先主節點、優先從節點、讀網路延遲最小的節點 
2.8、複製集優缺點 
優點 
●自動容災。主節點宕機,通過投票選舉主節點,保證資料安全 
●自動備份資料,無需人工干預 
●易於擴充套件 
●資料可靠性高 
缺點 
●消耗資源高 
●不能解決負載均衡的問題 
●客戶端讀到的資料可能並未持久化 ,比如:客戶端可以讀到最新寫入的資料,但資料有可能存在磁碟寫入失敗的可能;客戶端讀到的資料可能發生rolled back