MongoDB分片群集(實現分片服務啟用、分片服務管理、單點故障模擬)
1、什麽是分片
- 高數據量和吞吐量的數據庫應用會對單機的性能造成較大壓力,大的查詢量會將單機的CPU耗盡,大的數據量對單機的存儲壓力較大,最終會耗盡系統的內存而將壓力轉移到磁盤IO上。
- MongoDB分片是使用多個服務器存儲數據的方法,以支持巨大的數據存儲和對數據進行操作。分片技術可以滿足MongoDB數據量大量增長的需求,當一臺服務器存儲量不夠時,可以通過再外接一臺分片服務器,使得數據庫系統能夠存儲更多的數據
2、MongoDB分片優勢
- 使用分片減少了每個分片需要處理的請求數,因此,通過水平擴展,群集可以提高自己的存儲容量和吞吐量,比如,當插入一條數據時,應用只需要訪問存儲這條數據的分片。
- 使用分片減少了每個分片存儲的數據。
- 優勢在於提供類似線性增長的架構,提高數據可用性,提高大數據庫查詢服務器的性能,當MongoDB單點數據庫服務器存儲成為瓶頸、單點數據庫服務器的性能成為瓶頸或者需要部署大型應用以充分利用內存時,可以使用分片技術。
3、MongoDB分片群集的構成
- shard:分片服務器,用於存儲實際的數據塊,實際生產環境中一個shard server角色可由幾臺服務器組成一個replica set承擔,防止主機單點故障。
- config server:配置服務器,存儲了整個分片群集的配置信息,其中包括chunk信息。
- routers:前端路由,客戶端由此接入,且讓整個群集看上去像單一數據庫,前端應用可以透明使用。
MongoDB分片群集部署
群集環境
分片服務器 | 對應配置文件 | 服務端口設定 |
---|---|---|
配置服務器 | mongod1.conf | 37017 |
分片服務器1 | mongod2.conf | 47017 |
分片服務器2 | mongod3.conf | 47018 |
分片服務器3 | mongod4.conf | 47019 |
路由服務器 | mongod.conf | 27017 |
安裝MongoDB3.2
- 註:此處選擇MongoDB3.2版本是由於在MongoDB3.4版本以後安全性增加,針對分片管理時需要設置下面分片服務器在一個復制集當中,此處為了簡化操作選擇MongoDB2.3版本,最新版本分片群集管理相關內容後續將會補充。
-
MongoDB2.3版本可在MongoDB官方網站下載:https://www.mongodb.com/
- 安裝環境包
yum install openssl-devel -y
- 解壓軟件包,創建工作目錄及日誌文件
tar zxvf mongdb-linux-x86_64-3.2.1.tgz -C /opt
mv mongodb-linux-x86_64-3.2.1/ /usr/local/mongodb
mkdir -p /data/mongodb/mongodb{1,2,3,4,5}
mkdir /data/mongodb/logs
touch /data/mongodb/logs/mongodb{1,2,3,4,5}.log
chmod -R 777 /data/mongodb/logs/*.log
- 進行系統內存和文件優化
ulimit -n 25000
ulimit -u 25000
-
創建每個節點配置文件
- 配置服務器
vim /etc/mongod1.conf
port=37017 //服務端口號
dbpath=/data/mongodb/mongodb1 //工作目錄
logpath=/data/mongodb/logs/mongodb1.log //日誌文件位置
logappend=true
fork=true
maxConns=5000
storageEngine=mmapv1
configsvr=true //設置為配置服務器
- 某節點內存不足時,從其他節點分配內存
sysctl -w vm.zone_reclaim_mode=0
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
- 創建MongoDB常用命令軟連接,方便系統識別,可直接使用
ln -s /usr/local/mongodb/bin/mongo /usr/bin/mongo
ln -s /usr/local/mongodb/bin/mongod /usr/bin/mongod
- 創建分片服務器的配置文件,包含mongodb3.conf和mongodb4.conf
vim /etc/mongodb2.conf
port=47017 //其他兩個分片服務器端口分別為47018和47019
dbpath=/data/mongodb/mongodb2 //工作目錄也要更換
logpath=/data/mongodb/logs/mongodb2.log //日誌文件也要更改
logappend=true
fork=true
maxConns=5000
storageEngine=mmapv1
shardsvr=true //設置為分片服務器功能
- 啟動服務器
mongod -f mongodb1.conf
mongod -f mongodb2.conf
mongod -f mongodb3.conf
mongod -f mongodb4.conf
- 啟動路由服務器
- 路由服務器不需要創建工作目錄與日誌文件,在啟動時可通過命令指定即可
./mongos --port 27017 --fork --logpath=/usr/local/mongodb/bin/route.log --configdb 192.168.144.113:37017 --chunkSize 1
//客戶端通過27017端口訪問,工作模式為fork,日誌文件位置及配置文件位置,交給配置服務器的37017去處理調度分片服務器
- 當啟用路由服務器出現如下內容表示啟動成功
2018-07-16T21:54:55.081+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: 3058
child process started successfully, parent exiting
路由服務器添加分片服務器
- 為了能夠讓路由服務器通過配置服務器找到分片服務器,需要在路由服務器中添加分片服務器信息
- 進入路由服務器
mongo
mongos> show dbs
mongos> sh.status() //此時查看shards下為空,沒有分片服務器
mongos> sh.addShard("192.168.144.113:47017") //添加分片服務器
mongos> sh.addShard("192.168.144.113:47018")
mongos> sh.status() //再次查看shards下有了分片服務器
啟用分片存儲功能
-
當路由服務器可以找到分片服務器後,並不能將數據存儲在不同的分片服務器中,需要開啟此功能才可以。
- 首先查看分片存儲功能有沒有打開。
mongos> use kgc //創建數據庫
mongos> for(var i=1;i<=10000;i++)db.users.insert({"id":i,"name":"jack"+i}) //創建一萬條數據
mongos> sh.status() //查看數據庫分片信息
databases:
{ "_id" : "kgc", "primary" : "shard0000", "partitioned" : false } //當看到false時表示分片存儲功能未開啟
- 想要對數據庫中某一集合采取數據分片存儲,首先需要對集合裏面的數控建立一個索引,然後指定將數據庫中的集合分片即可。操作如下:
mongos> db.users.createIndex({"id":1}) //對users集合創建索引
mongos> sh.shardCollection("kgc.users",{"id":1}) //集合分片
mongos> sh.status()
- 當查看到如圖狀態時,表示分片存儲已經完成。
分片服務管理
- 為了方便看清與記憶,我們可以將不同分片服務器添加標記。
- 當數據量不斷增大時,MongoDB的分片存儲功能可實現在線擴容,也就是增加分片服務器,使得數據可自動平均分片存儲,避免了單點故障與免停機維護。
添加標簽
- 在進行完分片服務器啟動與分片存儲功能後
mongos> sh.addShardTag("shard0000","first")
mongos> sh.addShardTag("shard0001","second") //添加標簽
mongos> sh.removeShardTag("shard0000","sales01") //刪除標簽
- 當看到如下圖所示,表示標簽添加成功。
鏈接配置服務器
- 由於所有通過路由服務器對分片服務器的操作都是通過配置服務器完成的,所以,可以進入配置服務器查看。
mongo --port 37017
configsvr> use config //配置數據庫
configsvr> show collections
....
collections //集合信息
chunks //分片節點信息
databases //數據庫信息
....
configsvr> db.chunks.findOne()
configsvr> db.collections.find()
configsvr> db.databases.find()
添加分片服務器
-
動態添加分片服務器,自動可以平均分片存儲
- 首先啟動需要添加的分片服務器
mongod -f mongodb4.conf
mongo //進入路由服務器
mongos> sh.addShard("192.168.144.113:47019") //添加分片服務器
mongos> sh.status() //查看狀態
chunks:
shard0000 4
shard0001 5
shard0002 2
如圖:
刪除分片服務器
- 當刪除一個分片服務器時,也就是模擬單點故障時,配置服務器會將數據庫中的數據重新分配,平均存儲到其他分片服務器上,也不會丟失數據。
mongos> use admin
mongos> db.runCommand({"removeshard":"192.168.144.113:47019"})
- 模擬單點故障,如圖結果
MongoDB分片群集(實現分片服務啟用、分片服務管理、單點故障模擬)