MongoDB之分片集群與復制集


原文作者: xingguang
原文鏈接:https://www.tiance.club/post/3134727742.html

分片集群

1.1、概念

分片集群是將數據存儲在多台機器上的操作,主要由查詢路由mongos、分片、配置服務器組成。
●查詢路由根據配置服務器上的元數據將請求分發到相應的分片上,本身不存儲集群的元數據,只是緩存在內存中。
●分片用來存儲數據塊。數據集根據分片鍵將集合分割為數據塊,存儲在不同的分片上。在生產環境下,通常一個分片由一個復制集組成。
●配置服務器存儲集群的元數據,包括數據與分片的映射關系,配置服務器一旦掛掉,集群將無法工作。
注意:
●當mongos重啟時,會從配置服務器讀取元數據更新自己緩存的元數據
●當分割數據時或者在分片間移動數據時會寫配置服務器。
●在分片集群中,配置服務器可以采用復制集的架構,但復制集中不允許有仲裁節點和延時節點,且buildindexes必須設為true。
●集合的數據分布在多個分片上,如果某個分片失效,查詢會返回錯誤,可以通過為查詢指定partial選項,允許接受不完整的數據
作用
單台機器無法滿足存儲需求,內存、磁盤空間不夠,讀寫吞吐量不夠。

1.2、如何維護數據均衡分布

集群使用分割器和平衡器兩個后台進程維護數據均勻分布。

原文作者: xingguang
原文鏈接:https://www.tiance.club/post/3134727742.html

分割器

●分割器的作用是防止數據塊變大,數據塊大小默認是64MB,當超過64MB時,分割器會將其一分為二。
●分割的對象不是實際的數據,而是元數據,只是在邏輯上進行邏輯塊的划分,不會影響到實際數據的分布
●數據塊太小會產生大量塊,容易使集群不平衡,導致數據塊頻繁移動,降低集群性能,元數據增加,降低查詢效率
●數據塊太大,會減小移動頻率,元數據少,有利於數據查詢,但一旦移動,會花費很長時間
●並不是所有的集合都會分片,沒有被分片的集合都存儲在同一個主分片上
●只有對數據庫和集合開啟分片后,數據才會在不同分片上分布,否則只存儲在主分片上
●插入和更新操作都有可能引發分割

平衡器

●平衡器的作用是管理數據塊的移動。
●當集群中數據塊的分布達到移動閾值時,平衡器會移動數據塊。
●增加或減少分片或增刪數據也會使平衡器移動數據塊

1.3數據塊如何存儲在相應分片上

每個需要被分片的集合都需要指定索引字段作為分片鍵,mongodb使用區間分區哈希分區算法根據分片鍵將數據分割為數據塊。

區間分區

數據塊覆蓋一段子區間,任何分片鍵都會被某一段覆蓋
優缺點
區間分區支持更好的range查詢,通過分片鍵查詢,查詢路由可以很容易的判斷出哪些數據塊含有查詢需要數據,並將請求分配到的分片上。
區間分區使數據分布不均勻

哈希分區

根據分片鍵的哈希值進行數據的分配。
優缺點
數據隨機分配到不同的數據塊
在進行range查詢時,由於相鄰數據分布在不同分片上,導致訪問很多分片

注意
●分片鍵不能是多鍵索引,即索引字段的值不能是數組
●分片鍵一旦被指定,不能被修改為其他字段,同時分片鍵的字段值也不能被修改
●如果集群的寫操作比較多,可以使用哈希分區,將數據均勻分配到節點上,將寫操作均勻應用與集群,
如果集群讀操作比較多,可以使用區間分區,將相鄰數據分到同一節點上,便於查詢
●如果查詢時沒有指定索引字段,查詢路由會將請求分發到所有節點上,等待返回結果,查詢效率低
如果查詢時指定了索引字段,查詢路由會將請求分發到少數節點上,查詢效率高

1.4、數據遷移過程

●平衡器向源節點發送movechunk指令
●源節點移動指定數據塊,在遷移期間,數據塊的讀寫操作仍路由到源節點
●目的節點如果沒有需要的索引,此時會構建索引
●目的節點開始請求數據塊中的數據,保存在本地
●在遷移期間,源節點上的數據如果發生變化,在遷移完之后,目的節點會同步源節點上變更的數據
●同步結束后,目的節點會與配置服務器建立連接,配置服務器更新元數據,此期間源節點阻塞寫操作
●源節點上的舊數據被刪除

原文作者: xingguang
原文鏈接:https://www.tiance.club/post/3134727742.html

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

原文作者: xingguang
原文鏈接:https://www.tiance.club/post/3134727742.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM