1. 程式人生 > >部署MongoDB分片群集及分片管理

部署MongoDB分片群集及分片管理

usr config pen log 利用 不足 text 擴展 err

  • MongoDB分片
    • 在Mongodb裏面存在另一種集群,就是分片技術,可以滿足MongoDB數據量大量增長的需求。
    • 當MongoDB存儲海量的數據時,一臺機器可能不足以存儲數據,也可能不足以提供可接受的讀寫吞吐量。這時,我們就可以通過在多臺機器上分割數據,使得數據庫系統能存儲和處理更多的數據。
    • 分片的優勢

    分片為應對高吞吐量與大數據量提供了方法。

    • 使用分片減少了每個分片需要處理的請求數,因此,通過水平擴展,集群可以提高自己的存儲容量和吞吐量。舉例來說,當插入一條數據時,應用只需要訪問存儲這條數據的分片.使用分片減少了每個分片存儲的數據。
    • 分片的優勢在於提供類似線性增長的架構,提高數據可用性,提高大型數據庫查詢服務器的性能,當MongoDB的單點數據庫服務器存儲成為瓶頸,單點數據庫服務器的性能成為瓶頸或者需要部署大型應用以充分利用內存時,可以使用分片技術。
    • MongoDB分片群集的組成:
    • Shard:分片服務器,用於存儲實際的數據塊,實際生產環境中一個shard server角色可由幾臺機器組個一個replica set承擔,防止主機單點故障
    • Config Server:配置服務器,mongod實例,存儲了整個 ClusterMetadata,其中包括 chunk信息。
    • Query Routers:前端路由,客戶端由此接入,且讓整個集群看上去像單一數據庫,前端應用可以透明使用。
    • 部署MongoDB分片群集
    • 安裝mongodb3.2
    • 創建多實例的數據目錄和日誌文件
    • 修改ulimit -n 和ulimit -u 的值為25000

      # yum install openssl-devel -y
      # tar zxvf mongodb-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}
      # mkdir /data/mongodb/logs
      # touch /data/mongodb/logs/mongodb{1,2,3,4}.log
      # chmod -R 777 /data/mongodb/logs/*.log
      # ulimit -n 25000
      # ulimit -u 25000

    配置服務器

    # 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
      
      # ln -s /usr/local/mongodb/bin/mongo /usr/bin/mongo
      # ln -s /usr/local/mongodb/bin/mongod /usr/bin/mongod
    • 啟動登錄第一個實例確認無誤

      # mongod -f /usr/local/mongodb/bin/mongodb1.conf 
      # mongo --port 37017
    • 分片服務器

      # 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
      
      # cp -p mongodb1.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
      
      # mongod -f mongodb2.conf
      # mongod -f mongodb3.conf
      # mongo --port 47017
      # mongo --port 47018
      # ./mongos --help   //查看參數選項
    • 啟動路由服務器
    • --port指定對方連接入口27017
    • --fork後臺運行
    • --logpath指定日誌文件存儲路徑
    • --configdb指定給誰處理

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

      技術分享圖片

    • 啟用分片服務器

      > mongo
      > mongos> show dbs
      > mongos> sh.status()    #shards下為空,沒有分片服務器
      > mongos> sh.addShard("192.168.86.129 :47017")    //添加分片服務器
      > mongos> sh.addShard("192.168.86.129 :47018")
      > mongos> sh.status()       // 查看數據庫分片信息

    技術分享圖片

    • 分片功能管理

      > use kgc
      > for(var i=1;i<=10000;i++) db.users.insert({"id":i,"name":"tom"+i})
      mongos> show dbs
      mongos> use kgc
      mongos> show collections    //查看集合
      mongos> db.users.find().limit(5)
      mongos> sh.status()          //查看數據庫分片信息

      技術分享圖片
      技術分享圖片

    ?
    ?

    • 啟用數據庫分片

      mongos> sh.enableSharding("kgc")   //啟用數據庫分片
      mongos> sh.status()     //再查看數據庫分片信息

      技術分享圖片

    • 此時數據庫分片開啟了,但是你的集合沒有開發分片
    • 下面要開啟集合的分片
    • 先對users集合創建索引
    • 然後對集合的索引進行分片

      mongos> use kgc  
      mongos> db.users.createIndex({"id":1})       //對users表創建索引
      mongos> sh.shardCollection("kgc.users",{"id":1})    //表分片
      mongos> sh.status()

    技術分享圖片
    技術分享圖片

      • MongoDB分片管理
    • 片鍵的選擇、查看片鍵的狀態信息、添加多個分片、查看配置服務器信息以及添加刪除分片服務器。

      mongos> mongo
      mongos> use kgc
      mongos> for(var i=1;i<=50000;i++)db.users2.insert({"id":i,"name":"jerry"+i})
      mongos> db.users2.createIndex({"id":1})
      mongos> sh.shardCollection("kgc.users2",{"id":1})
      mongos> db.users2.stats()
    • 添加標簽

      mongos> sh.addShardTag("shard0000","sales00")
      mongos> sh.addShardTag("shard0001","sales01")
    • 連接配置服務器

      # mongo --port 37017
      configsvr> use config              //打開配置數據庫
      configsvr> show collections        //查看集合

      技術分享圖片

      configsvr> db.chunks.findOne()     //記錄所有塊的信息
      configsvr> db.collections.find()    //分片集合信息
      configsvr> db.databases.find()     //分片中所有數據庫信息

      技術分享圖片

    • 添加分片服務器

      # cd /usr/local/mongodb/bin/
      # cp -p mongodb2.conf mongodb4.conf
      # vim mongodb4.conf
              port=47019
              dbpath=/data/mongodb/mongodb4
              logpath=/data/mongodb/logs/mongodb4.log
              logappend=true
              fork=true
              maxConns=5000
              storageEngine=mmapv1
              shardsvr=true
      # mongod -f mongodb4.conf
      # mongo
    • 添加分片節點
      mongos> sh.addShard("192.168.86.129:47019") //添加分片服務器
      mongos> sh.status()
      技術分享圖片技術分享圖片

    • 刪除分片節點

      mongos> use admin
      mongos> db.runCommand({"removeshard":"192.168.86.129:47019"})    //刪除節點

    技術分享圖片

    部署MongoDB分片群集及分片管理