標籤:c4c com 自己 版本 資源 後台 海量資料 lse oca
什麼是分區?
高資料量和輸送量的資料庫應用會對單機的效能造成較大壓力,大的查詢量會將單機的CPU耗盡,大的資料量對單機的儲存壓力較大,最終會耗盡系統的記憶體而將壓力轉移到磁碟IO上。
MongoDB分區是使用多個伺服器儲存資料的方法,以支援巨大的資料存放區和對資料進行操作。分區技術可以滿足MongoDB資料量大量增長的需求,當一台MongoDB伺服器不足以儲存海量資料或不足以提供可接受的讀寫輸送量時,我們就可以通過在多台伺服器上分割資料,使得資料庫系統能儲存和處理更多的資料。
MongoDB分區優勢
分區為應對高輸送量與大資料量提供了方法。
- 使用分區減少了每個分區需要處理的請求數,因此,通過水平擴充,群集可以提高自己的儲存容量和輸送量。比如,當插入一條資料時,應用只需要訪問儲存這條資料的分區。
- 使用分區減少了每個分區儲存的資料。
分區的優勢在於提供類似線性增長的架構,提高資料可用性,提高大型資料庫查詢服務器的效能。當MongoDB單點資料庫伺服器儲存成為瓶頸、單點資料庫伺服器的效能成為瓶頸或者需要部署大型應用以充分利用記憶體時,可以使用分區技術。
MongoDB分區結構如所示:
MongoDB分區群集組成
MongoDB分區群集主要有如下三個主要組件:
- Shard:分區伺服器,用於儲存實際的資料區塊,實際生產環境中一個shard server角色可由幾台伺服器組成一個Replica Set承擔,防止主機單點故障。
- Config Server:設定管理員,儲存了整個分區群集的配置資訊,其中包括chunk資訊。
- Routers:前端路由,用戶端由此接入,且讓整個群集看上去像單一資料庫,
前端應用可以透明使用。
MongoDB分區群集的組成如所示:
部署MongoDB分區群集
下面介紹如何在一台物理伺服器上部署一個簡單結構的MongoDB分區群集。
物理伺服器IP地址:192.168.10.154/24MongoDB軟體包:mongodb-linux-x86_64-3.2.1.tgz具體配置如下:- 1台路由執行個體(連接埠27017)- 1台配置執行個體(連接埠37017)- 2台Shard執行個體(連接埠47017,47018)
部署簡單結構的MongoDB分區群集如所示:
一、安裝MongoDB 3.21、安裝支援軟體包
yum install openssl-devel -y
2、解壓MongoDB軟體包
tar zxvf mongodb-linux-x86_64-3.2.1.tgz -C /opt/
3、移動MongoDB解壓後的檔案夾到/usr/local/目錄下並重新命名為mongodb
cd /opt/mv mongodb-linux-x86_64-3.2.1/ /usr/local/mongodb
4、建立資料存放區目錄及日誌存放位置
mkdir -p /data/mongodb/mongodb{1,2,3,4} //建立資料存放區目錄mkdir /data/mongodb/logs //建立日誌存放位置touch /data/mongodb/logs/mongodb{1,2,3,4}.log //記錄檔chmod -R 777 /data/mongodb/logs/*.log //給記錄檔加許可權才可往裡面寫入
5、調整shell資源的設定,防止過多訪問MongoDB出現錯誤而無法串連MongoDB執行個體
ulimit -n 25000 //同一時刻最多開啟檔案數ulimit -u 25000 //同一時刻最多開啟程式數
二、部署設定管理員1、建立mongodb1.conf設定檔
cd /usr/local/mongodb/bin/vim mongodb1.conf
port=37017 //連接埠號碼dbpath=/data/mongodb/mongodb1 //資料存放位置logpath=/data/mongodb/logs/mongodb1.log //日誌存放位置logappend=true //使用追加方式寫日誌fork=true //後台運行maxConns=5000 //最大同時串連數,預設2000storageEngine=mmapv1 //指定儲存引擎為記憶體對應檔configsvr=true //指定為設定管理員
2、啟動設定管理員
mongod -f /usr/local/mongodb/bin/mongodb1.conf
三、部署分區伺服器1、複製設定管理員的設定檔並編輯修改
cd /usr/local/mongodb/bin/cp -p mongodb1.conf mongodb2.confcp -p mongodb1.conf mongodb3.confvim mongodb2.conf
port=47017 //連接埠號碼dbpath=/data/mongodb/mongodb2 //資料存放位置logpath=/data/mongodb/logs/mongodb2.log //日誌存放位置logappend=truefork=truemaxConns=5000storageEngine=mmapv1shardsvr=true //指定為分區伺服器
vim mongodb3.conf
port=47018 //連接埠號碼dbpath=/data/mongodb/mongodb3 //資料存放位置logpath=/data/mongodb/logs/mongodb3.log //日誌存放位置logappend=truefork=truemaxConns=5000storageEngine=mmapv1shardsvr=true //指定為分區伺服器
2、啟動兩個分區伺服器
mongod -f mongodb2.confmongod -f mongodb3.conf
四、啟動路由伺服器
通過./mongos --help命令可以查看啟動路由相關參數資訊。chunkSize為資料區塊大小,預設為200MB,為了便於測試這裡將值設定為1。
./mongos --port 27017 --fork --logpath=/usr/local/mongodb/bin/route.log --configdb 192.168.10.154:37017 --chunkSize 1
五、啟用分區伺服器
串連到路由執行個體後,可以通過sh.status()命令查看分區狀態資訊
mongo //進入路由執行個體
mongos> sh.status() //shards下為空白,沒有分區伺服器
mongos> sh.addShard("192.168.10.154:47017") //添加分區伺服器mongos> sh.addShard("192.168.10.154:47018") //添加分區伺服器mongos> sh.status() //再次查看便有分區伺服器
六、實現分區功能
添加了兩個分區伺服器後,資料庫和集合還未啟用分區,這裡我先建立一個xxy資料庫,並建立集合
mongos> use xxymongos> db.users.insert({"id":1,"name":"zhangsan"})mongos> show dbs
可利用迴圈語句寫入多條資訊
mongos> for(var i=2;i<=10000;i++)db.users.insert({"id":2,"name":"zhangsan"+i})mongos> show collections mongos> db.users.find().limit(5) //查看users集合裡的前五條資料
使用sh.status()命令查看分區狀態資訊。"partitioned"值為false表示資料庫尚未分區。
mongos> sh.status() //查看資料庫分區資訊
使用sh.enableSharding("xxy")命令啟用xxy資料庫分區。再次查看發現"partitioned"值為true
mongos> sh.enableSharding("xxy") //啟用資料庫分區
針對users表建立索引,然後使用sh.shardCollection("xxy.users",{"id":1})命令對users集合進行分區
mongos> db.users.createIndex({"id":1}) //對users表建立索引mongos> sh.shardCollection("kgc.users",{"id":1}) //表分區mongos> sh.status()
此時可以看到chunks均勻分布到兩個分區上
CentOS 7上部署MongoDB分區群集(MongoDB 3.2.1版本)