在CentOS7上部署MongoDB分片羣集

MongoDB分片概述

        在Mongodb裏面存在另一種集羣,就是分片技術,可以滿足MongoDB數據量大量增長的需求。

        當MongoDB存儲海量的數據時,一臺機器可能不足以存儲數據,也可能不足以提供可接受的讀寫吞吐量。這時,我們就可以通過在多臺機器上分割數據,使得數據庫系統能存儲和處理更多的數據。



爲什麼使用分片

  • 複製所有的寫入操作到主節點

  • 延遲的敏感數據會在主節點查詢

  • 單個副本集限制在12個節點

  • 當請求量巨大時會出現內存不足。

  • 本地磁盤不足

  • 垂直擴展價格昂貴


MongoDB原理圖示:

image

上圖中主要有如下所述三個主要組件:

  • Shard:

    用於存儲實際的數據塊,實際生產環境中一個shard server角色可由幾臺機器組個一個replica set承擔,防止主機單點故障

  • Config Server:

    mongod實例,存儲了整個 ClusterMetadata,其中包括 chunk信息。

  • Query Routers:

    前端路由,客戶端由此接入,且讓整個集羣看上去像單一數據庫,前端應用可以透明使用。


MongoDB分片實驗步驟演示:

安裝配置MongoDB

yum install openssl-devel -y

tar zxvf mongodb-linux-x86_64-3.2.1.tgz -C /opt/

mv /opt/mongodb-linux-x86_64-3.2.1/ /usr/local/mongodb

優化命令

ln -s /usr/local/mongodb/bin/mongo /usr/bin/mongo                

ln -s /usr/local/mongodb/bin/mongod /usr/bin/mongod

建立四臺分片羣集日誌文件和數據存儲路徑

mkdir -p /data/mongodb/mongodb{1,2,3,4}

mkdir -p /data/mongodb/logs

touch /data/mongodb/logs/mongodb{1,2,3,4}.log

chmod 777 /data/mongodb/logs/*.log

進程優化

ulimit -u 25000          #用戶最大進程數

ulimit -n 25000           #用戶可打開最大文件數量

配置三個主要組件

-----------------------配置config server------------------

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

       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

--------------------------配置shard server----------------------

配置shard1

cp -p mongodb1.conf mongodb2.conf

vim mongodb2.conf

     port=47017

     dbpath=/data/mongodb/mongodb2

      logpath=/data/mongodb/logs/mongodb2.log

      logappend=true

      fork=true

      maxConns=5000

      storageEngine=mmapv1

      shardsvr=true     #shard模式

配置shard2

cp -p mongodb2.conf mongodb3.conf

vim mongodb3.conf

      port=47018

      dbpath=/data/mongodb/mongodb3

       logpath=/data/mongodb/logs/mongodb3.log

       logappend=true

       fork=true

       maxConns=5000

       storageEngine=mmapv1

       shardsvr=true

啓動MongoDB

mongod -f mongodb1.conf

mongod -f mongodb2.conf

mongod -f mongodb3.conf

------------------------開啓路由模式-----------------

./mongos --port 27017 --fork --logpath=/usr/local/mongodb/bin/route.log --configdb 192.168.218.130:37017 --chunkSize 1

------------------------------啓動分片-------------------

mongo

sh.addShard("192.168.218.130:47017")          #添加分片服務器

sh.addShard("192.168.218.130:47018")

mongos> use kgc               #建立數據進行測試

mongos> for(var i=1;i<=10000;i++)db.users.insert({"id":i,"name":"tom"+i})

db.users.find().limit(5)

此時查看狀態,分片顯示false

sh.status()

          databases:

                { "_id" : "kgc", "primary" : "shard0000", "partitioned" : false }

mongos> sh.enableSharding("kgc")       #開啓庫分片

          { "ok" : 1 }

此時查看狀態,分片顯示true

sh.status()

          databases:

                  { "_id" : "kgc", "primary" : "shard0000", "partitioned" : true }

db.users.createIndex({"id":1})               #建立分片索引

            "ok" : 1

sh.shardCollection("kgc.users",{"id":1})         #開啓表數據分片

            { "collectionsharded" : "kgc.users", "ok" : 1 }

此時查看狀態,可見詳細分片信息

sh.status()

          { "id" : { "$minKey" : 1 } } -->> { "id" : 4682 } on : shard0001 Timestamp(2, 0)

          { "id" : 4682 } -->> { "id" : 9364 } on : shard0000 Timestamp(2, 1)

          { "id" : 9364 } -->> { "id" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 2)

-------------------------分片管理------------------------

添加標籤

mongos> sh.addShardTag("shard0000","shard00")

mongos> sh.addShardTag("shard0001","shard01")

sh.status()

              { "_id" : "shard0000", "host" : "192.168.218.130:47017", "tags" : [ "shard00" ] }

              { "_id" : "shard0001", "host" : "192.168.218.130:57017", "tags" : [ "shard01" ] }

查看分片信息

[root@localhost bin]# mongo --port 37017

use config

configsvr> show collections

db.databases.find() 查看是否分片

db.collections.find() 查看集合

db.chunks.find() 查看分片信息

刪除分片節點

use admin

db.runcommand({"removeshard":"192.168.218.130:67017")

sh.status()

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