MongoDB分片羣集(實現分片服務啓用、分片服務管理、單點故障模擬)

MongoDB分片概述

1、什麼是分片

  • 高數據量和吞吐量的數據庫應用會對單機的性能造成較大壓力,大的查詢量會將單機的CPU耗盡,大的數據量對單機的存儲壓力較大,最終會耗盡系統的內存而將壓力轉移到磁盤IO上。
  • MongoDB分片是使用多個服務器存儲數據的方法,以支持巨大的數據存儲和對數據進行操作。分片技術可以滿足MongoDB數據量大量增長的需求,當一臺服務器存儲量不夠時,可以通過再外接一臺分片服務器,使得數據庫系統能夠存儲更多的數據

2、MongoDB分片優勢

  • 使用分片減少了每個分片需要處理的請求數,因此,通過水平擴展,羣集可以提高自己的存儲容量和吞吐量,比如,當插入一條數據時,應用只需要訪問存儲這條數據的分片。
  • 使用分片減少了每個分片存儲的數據。
  • 優勢在於提供類似線性增長的架構,提高數據可用性,提高大數據庫查詢服務器的性能,當MongoDB單點數據庫服務器存儲成爲瓶頸、單點數據庫服務器的性能成爲瓶頸或者需要部署大型應用以充分利用內存時,可以使用分片技術。

3、MongoDB分片羣集的構成

  • shard:分片服務器,用於存儲實際的數據塊,實際生產環境中一個shard server角色可由幾臺服務器組成一個replica set承擔,防止主機單點故障。
  • config server:配置服務器,存儲了整個分片羣集的配置信息,其中包括chunk信息。
  • routers:前端路由,客戶端由此接入,且讓整個羣集看上去像單一數據庫,前端應用可以透明使用。

MongoDB分片羣集(實現分片服務啓用、分片服務管理、單點故障模擬)

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分片羣集(實現分片服務啓用、分片服務管理、單點故障模擬)

分片服務管理

  • 爲了方便看清與記憶,我們可以將不同分片服務器添加標記。
  • 當數據量不斷增大時,MongoDB的分片存儲功能可實現在線擴容,也就是增加分片服務器,使得數據可自動平均分片存儲,避免了單點故障與免停機維護。

添加標籤

  • 在進行完分片服務器啓動與分片存儲功能後
mongos> sh.addShardTag("shard0000","first")
mongos> sh.addShardTag("shard0001","second")  //添加標籤

mongos> sh.removeShardTag("shard0000","sales01")     //刪除標籤
  • 當看到如下圖所示,表示標籤添加成功。

MongoDB分片羣集(實現分片服務啓用、分片服務管理、單點故障模擬)

鏈接配置服務器

  • 由於所有通過路由服務器對分片服務器的操作都是通過配置服務器完成的,所以,可以進入配置服務器查看。

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

如圖:

MongoDB分片羣集(實現分片服務啓用、分片服務管理、單點故障模擬)

刪除分片服務器

  • 當刪除一個分片服務器時,也就是模擬單點故障時,配置服務器會將數據庫中的數據重新分配,平均存儲到其他分片服務器上,也不會丟失數據。
mongos> use admin

mongos> db.runCommand({"removeshard":"192.168.144.113:47019"})
  • 模擬單點故障,如圖結果

MongoDB分片羣集(實現分片服務啓用、分片服務管理、單點故障模擬)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章