標籤:method 而且 route 欄位 for 分區叢集 bin 訪問 環境
一、概述
分區是一種在多台機器上分配資料的方法。MongoDB使用分區來支援具有非常大的資料集和高輸送量操作。有兩種解決系統增長的方法:垂直擴充和水平擴充。
垂直擴充涉及增加單個伺服器的容量,例如使用更強大的CPU,增加更多RAM或增加儲存空間量等。介於硬體成本和硬體效能單機器能支援的並發訪問和儲存容量是有限的。因此,垂直擴充是存在最大上限的。
水平擴充包括將系統資料集和負載分配到多個伺服器上,添加額外的伺服器以根據需要增加容量。儘管單台機器的整體速度或容量可能並不高,但每台機器可處理整個工作負載的一部分,效率可能會高於單台高速大容量伺服器。而且很多時候可以選擇成本很低的普通PC電腦;與單台機器的高端硬體相比,總成本可能會更低,但是增加了維護的複雜性。
MongoDB版本:3.6
二、分區叢集架構1).分區
分區的含義是指將資料拆分,將其分散存放在不同的機器上的過程,MongoDB的分區機制允許你建立一個包含許多台機器的叢集,將資料子集分散在叢集中,每一個分區維護著一個資料集合的子集。與單機伺服器和複本集相比,使用分區叢集架構可以使應用程式具有更大的資料處理能力。
備忘:每一個分區都是由一個複本集組成。從MongoDB 3.6版本之後,分區必須是複本集。
2).設定管理員
設定管理員是整個叢集的大腦,儲存著叢集和分區的中繼資料庫,比如:分區資訊、群集資料庫資訊、分區集合資訊、塊資訊、平衡器資訊、版本資訊、群集動作記錄、相關設定資訊等。因此設定管理員資料必須儲存在非易失性磁碟機上。每個設定管理員都應該位於單獨的物理機器上,最好是異地分布,同時還需要啟用日誌功能。
備忘:在Mongos3.4版本之後,設定管理員也必須是複本集。
3).Mongos進程
Mongos提供用戶端應用程式和分區群集之間的介面。
部署多個mongos支援高可用性和延展性;常見的模式是mongos在每個應用程式伺服器上部署一個 ,在每個應用程式伺服器上部署一個 可減少應用程式和之間的網路延遲。或者您可以專用的伺服器上部署mongos。大型部署一般使用此方法,因為它將用戶端應用程式服務器與mongos分離 這可以更好地控制mongod執行個體的串連數量。
可以在主分區上部署mongos,mongos不會與mongod執行個體共用記憶體。需要注意記憶體爭用可能導致的問題。
理論上可以部署無數個mongos路由。但是由於mongos路由經常與設定管理員進行通訊,所以在增加mongos數量時應該密切監視設定管理員的效能。如果您看到效能下降,應該現在mongos的數量
三、部署分區 1).環境
192.168.137.10:rs-a-1:27010;rs-a-2:27011;rs-a-3:27012
192.168.137.20:rs-b-1:28010;rs-b-2:28011;rs-b-3:28012
192.168.137.30:config-1:29010,config-2:29011;config-3:29012;mongos:30000
rs-a分區複本集配置
--------------rs-a-1配置-------------------------pidfilepath = /rs-a-1/mongod.pidlogpath = /rs-a-1/data/log/mongod.logdbpath = /rs-a-1/data/dblogappend = truebind_ip = 192.168.137.10,127.0.0.1port = 27010fork = trueauth = truereplSet = rs-ashardsvr = truekeyFile = /rs-a-1/autokey--------------rs-a-2配置-------------------------pidfilepath = /rs-a-2/mongod.pidlogpath = /rs-a-2/data/log/mongod.logdbpath = /rs-a-2/data/dblogappend = truebind_ip = 192.168.137.10,127.0.0.1port = 27011fork = trueauth = truereplSet = rs-ashardsvr = truekeyFile = /rs-a-2/autokey--------------rs-a-3配置-------------------------logpath = /rs-a-3/data/log/mongod.logdbpath = /rs-a-3/data/dblogappend = truebind_ip = 192.168.137.10,127.0.0.1port = 27012fork = trueauth = truereplSet = rs-ashardsvr = truekeyFile = /rs-a-3/autokey
rs-b分區複本集配置
--------------rs-b-1配置-------------------------pidfilepath = /rs-b-1/mongod.pidlogpath = /rs-b-1/data/log/mongod.logdbpath = /rs-b-1/data/dblogappend = truebind_ip = 192.168.137.20,127.0.0.1port = 28010fork = trueauth = truereplSet = rs-bshardsvr = truekeyFile = /rs-b-1/autokey--------------rs-b-2配置-------------------------pidfilepath = /rs-b-2/mongod.pidlogpath = /rs-b-2/data/log/mongod.logdbpath = /rs-b-2/data/dblogappend = truebind_ip = 192.168.137.20,127.0.0.1port = 28011fork = trueauth = truereplSet = rs-bshardsvr = truekeyFile = /rs-b-2/autokey--------------rs-b-3配置-------------------------pidfilepath = /rs-b-3/mongod.pidlogpath = /rs-b-3/data/log/mongod.logdbpath = /rs-b-3/data/dblogappend = truebind_ip = 192.168.137.20,127.0.0.1port = 28012fork = trueauth = truereplSet = rs-bshardsvr = truekeyFile = /rs-b-3/autokey
config設定管理員配置
--------------config-1配置-------------------------pidfilepath = /config-1/mongod.pidlogpath = /config-1/data/log/mongod.logdbpath = /config-1/data/dblogappend = truebind_ip = 192.168.137.30,127.0.0.1port = 29010fork = trueauth = trueconfigsvr = truereplSet = configkeyFile = /config-1/autokey--------------config-2配置-------------------------pidfilepath = /config-2/mongod.pidlogpath = /config-2/data/log/mongod.logdbpath = /config-2/data/dblogappend = truebind_ip = 192.168.137.30,127.0.0.1port = 29011fork = trueauth = trueconfigsvr = truereplSet = configkeyFile = /config-2/autokey--------------config-3配置-------------------------logpath = /config-3/data/log/mongod.logdbpath = /config-3/data/dblogappend = truebind_ip = 192.168.137.30,127.0.0.1port = 29012fork = trueauth = trueconfigsvr = truereplSet = configkeyFile = /config-3/autokey
Mongos路由配置
configdb = config/192.168.137.30:29010,192.168.137.30:29011,192.168.137.30:29012port = 30000logpath = /mongos/log/route.logbind_ip = 192.168.137.30,127.0.0.1logappend = truefork = truekeyFile = /mongos/autokeymaxConns=20000
備忘:當前為了便於理解所以節點的分布不合理,如果是真實的產生環境每個資料節點都應該分開。
2).分區配置
1.啟動所有分區複本集(rs-a,rs-b)和設定管理員(config)
具體方法可以參考我前面寫的搭建複本集的文章。
MongoDB 搭建可複製群集:http://www.cnblogs.com/chenmh/p/8484049.html
2.啟動mongos路由
mongos --config /mongos/mongos.conf
3.分區配置
登入驗證
mongo --port 30000use admindb.auth("dba","dba")
添加分區
sh.addShard("rs-a/192.168.137.10:27010,192.168.137.10:27011,192.168.137.10:27012");sh.addShard("rs-b/192.168.137.20:28010,192.168.137.20:28011,192.168.137.20:28012");
文檔分區
use adminsh.enableSharding("test");sh.shardCollection("test.person",{_id:1});
sh.enableSharding("news");sh.shardCollection("news.person",{"username":"hashed"});
備忘:這裡的分區方式有1,-1,hashed三種;
1.如果分區集合是空集合那麼可以不需要提前建立索引,對集合分區預設會對分區欄位建立索引。
2.如果分區集合是非空集合那麼需要手動建立索引。
3.如果分區集合存在唯一索引,那麼分區必須是唯一索引上的鍵。
具體參考:https://docs.mongodb.com/manual/reference/method/sh.shardCollection/index.html
插入測試資料
use test;for(var i=0;i<100000;i++){ db.person.insert({"_id":i,"username":"user"+i,"createdate":new Date()})}
use news;for(var i=0;i<100000;i++){ db.person.insert({"_id":i,"username":"user"+i,"createdate":new Date()})}3).查詢
sh.status();
備忘:可以看到rs-a;rs-b兩個分區上的資料庫塊都是一樣的,分布的很均勻,接下來看一下增加一個新分區之後資料庫塊的分布情況。
4).添加新分區
備忘:添加新的分區之後,mongos再一次移動了資料區塊,保證資料區塊在每一個分區上都均勻的分布。資料庫的移動是非同步。
四、總結
Mongos採取非同步方式將資料區塊移動到其它的分區,資料區塊不能設的太小否則對於密集寫的系統所有的寫操作會集中到一個分區上,最後非同步移動資料區塊到其它的分區。
備忘: pursuer.chen 部落格:http://www.cnblogs.com/chenmh 本網站所有隨筆都是原創,歡迎大家轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明連結,否則保留追究責任的權利。 《歡迎交流討論》 |
MongoDB 分區叢集搭建