標籤:this 其他 linux ted ase 意思 就會 節點 engine
部署MongoDB分區群集分區概述
高資料量和輸送量的資料庫應用會對單機的效能造成較大的壓力,大的查詢量會將單機的CPU耗盡,大的資料量對單機的儲存壓力較大,最終會耗盡系統的記憶體而將壓力轉移到磁碟IO上。
MongoDB分區是使用多個伺服器儲存資料的方法,以支援巨大的資料存放區和對資料進行操作。分區技術可以滿足MongoDB資料量大量增長的需求,當一台MongoDB伺服器不足以儲存海量資料或者不足以能提供可接受打讀寫輸送量時,我們可以通過在多台伺服器上分割資料,使得資料庫系統能儲存和處理更多的資料。
MongoDB分區優勢
分區為應對輸送量和大資料量提供了方法。
1、使得分區減少了每個分區需要處理的請求數,因此,通過水平擴充,群集可以提高自己的儲存容量和輸送量。比如,當插入一條資料時,應用只需要訪問儲存這條資料的分區。
2、使用分區減少了每個分區儲存的資料。
如所示,假設一個collection中有1TB的資料,通過分區可以將1TB資料分區到四個shard中,當查詢對應資料時,就會去對應的分區伺服器查詢,可以提高資料可用性。
MongoDB分區群集組成
MongoDB分區叢集主要有三個主要組件:
1、Shard:分區伺服器,用於儲存實際的資料區塊,實際生產環境中一個shard server角色可以由幾台伺服器組成一個複製集(Replica Set)承擔,防止主機單點故障。
2、Config Server:設定管理員,儲存了整個分區群集的配置資訊,其中包括chunk資訊。
3、Routers:前端路由,用戶端由此接入,且讓整個群集看上去像單一資料庫,前端應用可以透明使用。
實驗環境
這裡實驗是在同一台伺服器上搭建MongoDB分區,但是MongoDB3.4以後Shard預設都是要搭建MongoDB服務集,為了方便起見,我們使用的MongoDB版本是3.2的。
| 組件 |
連接埠號碼 |
| 路由執行個體 |
27017 |
| 配置執行個體 |
37017 |
| Shard1執行個體 |
47017 |
| Shard2執行個體 |
47018 |
分區群集部署1、部署設定管理員
安裝相關依賴包和解壓軟體到指定目錄中。
[[email protected] ~]# yum install openssl-devel -y #安裝依賴包[[email protected] ~]# tar xfvz mongodb-linux-x86_64-3.2.1.tgz -C /opt/[[email protected] ~]# cd /opt/[[email protected] opt]# mv mongodb-linux-x86_64-3.2.1/ /usr/local/mongodb#將軟體包重新命名,方便下面使用
將即將建立的執行個體所需要的資料目錄,日誌目錄和記錄檔先建立好。
[[email protected] opt]# mkdir -p /data/mongodb/mongodb{1,2,3,4}#建立執行個體的資料存放區目錄[[email protected] opt]# mkdir /data/mongodb/logs#建立執行個體的日誌目錄[[email protected] opt]# touch /data/mongodb/logs/mongodb{1,2,3,4}.log#建立執行個體的記錄檔[[email protected] opt]# chmod -R 777 /data/mongodb/logs/*.log#修改日誌許可權[[email protected] opt]# ulimit -n 25000#將可以開啟的最大進程數修改為25000[[email protected] opt]# ulimit -u 25000#將可以開啟的最大檔案數修改為25000[[email protected] opt]# sysctl -w vm.zone_reclaim_mode=0#當某個節點可用記憶體不足時,如果為0的話,那麼系統會傾向於從其他節點分配記憶體。如果為1的話,那麼系統會傾向於從本地節點回收Cache記憶體多數時候。[[email protected] opt]# echo never > /sys/kernel/mm/transparent_hugepage/enabled[[email protected] opt]# echo never > /sys/kernel/mm/transparent_hugepage/defrag#當節點可用記憶體不足時,選擇關閉占記憶體多的大頁面[[email protected] opt]# export PATH=$PATH:/usr/local/mongodb/bin/#將MongoDB路徑添加到環境變數中[[email protected] bin]# vim mongodb1.conf#建立設定管理員的設定檔port=37017dbpath=/data/mongodb/mongodb1logpath=/data/mongodb/logs/mongodb1.loglogappend=truefork=truemaxConns=5000storageEngine=mmapv1configsvr=true #設定為設定管理員[[email protected] mongodb]# mongod -f /usr/local/mongodb/bin/mongodb1.conf #啟動設定管理員進程
2、配置分區伺服器
編輯mongodb2.conf設定檔,連接埠為47017,設定為shardsvr=true,同樣編輯mongodb3.conf,連接埠為47018,shardsvr=true,然後同時啟動。
[[email protected] mongodb]# cd /usr/local/mongodb/bin/[[email protected] bin]# cp -p mongodb1.conf mongodb2.conf [[email protected] bin]# vim mongodb2.conf port=47017 #設定連接埠dbpath=/data/mongodb/mongodb2 #資料存放區目錄要修改logpath=/data/mongodb/logs/mongodb2.log #記錄檔也要修改logappend=truefork=truemaxConns=5000storageEngine=mmapv1shardsvr=true #設定為分區伺服器[[email protected] bin]# cp -p mongodb2.conf mongodb3.conf [[email protected] bin]# vim mongodb3.conf port=47018 #設定連接埠dbpath=/data/mongodb/mongodb3 #資料存放區目錄要修改logpath=/data/mongodb/logs/mongodb3.log #記錄檔也要修改logappend=truefork=truemaxConns=5000storageEngine=mmapv1shardsvr=true
都修改完後,將兩個分區伺服器啟動。
3、啟動路由伺服器
[[email protected] bin]# ./mongos --port 27017 --fork --logpath=/usr/local/mongodb/bin/route.log --configdb 192.168.58.131:37017 --chunkSize 1#這條命令意思就是凡事訪問mongodb 27017連接埠的,都會轉到 192.168.58.131:37017上面[[email protected] bin]# ./mongos --port 27017 --fork --logpath=/usr/local/mongodb/bin/route.log --configdb 192.168.58.131:37017 --chunkSize 12018-07-17T17:20:58.990+0800 W SHARDING [main] Running a sharded cluster with fewer than 3 config servers should only be done for testing purposes and is not recommended for production.about to fork child process, waiting until server is ready for connections.forked process: 6430child process started successfully, parent exiting
[[email protected] ~]# mongoMongoDB shell version: 3.2.1connecting to: testServer has startup warnings: 2018-07-17T17:20:59.120+0800 I CONTROL [main] ** WARNING: You are running this process as the root user, which is not recommended.2018-07-17T17:20:59.120+0800 I CONTROL [main] mongos> sh.status()--- Sharding Status --- sharding version: { "_id" : 1, "minCompatibleVersion" : 5, "currentVersion" : 6, "clusterId" : ObjectId("5b4db4fdf19287c74d1a4081")} shards: active mongoses: "3.2.1" : 1 balancer: Currently enabled: yes Currently running: no Failed balancer rounds in last 5 attempts: 0 Migration Results for the last 24 hours: No recent migrations databases:#可以看到shards下面為空白,所以我們需要將兩個分區伺服器添加進去
mongos> sh.addShard("192.168.58.131:47017")#將47017連接埠的分區伺服器添加進去{ "shardAdded" : "shard0000", "ok" : 1 }mongos> sh.addShard("192.168.58.131:47018")#將47018連接埠的分區伺服器添加進去{ "shardAdded" : "shard0001", "ok" : 1 }
進行測試,查看是否能夠進行分區功能,我們建立一個collection,在裡面插入50000條資料。
mongos> use testswitched to db testmongos> for(var i=1;i<=50000;i++) db.users.insert({"id":i,"name":"tom"+i})#利用for迴圈往collection中插入50000條資料mongos> db.users.find().limit(10)#查看collection中的前10條資料,表示插入成功。
mongos> sh.status()--- Sharding Status --- sharding version: { "_id" : 1, "minCompatibleVersion" : 5, "currentVersion" : 6, "clusterId" : ObjectId("5b4db4fdf19287c74d1a4081")} shards: { "_id" : "shard0000", "host" : "192.168.58.131:47017" } { "_id" : "shard0001", "host" : "192.168.58.131:47018" } active mongoses: "3.2.1" : 1 balancer: Currently enabled: yes Currently running: no Failed balancer rounds in last 5 attempts: 0 Migration Results for the last 24 hours: No recent migrations databases: { "_id" : "test", "primary" : "shard0000", "partitioned" : false }#可以看到partitioned:false,說明並沒有進行分區。mongos> sh.enableSharding("test"){ "ok" : 1 }#啟用分區功能mongos> sh.status(){ "_id" : "test", "primary" : "shard0000", "partitioned" : true }mongos> db.users.createIndex({"id":1}){ "raw" : { "192.168.58.131:47017" : { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 } }, "ok" : 1}#建立索引,方便分區mongos> sh.shardCollection("test.users",{"id":1}){ "collectionsharded" : "test.users", "ok" : 1 }#執行分區,可以看到分區成功1-20165,寫入到shard0001中,20166-50000寫入到shard0000中
部署MongoDB分區群集