MongoDB4.0構建分佈式分片羣集

MongoDB4.0構建分佈式分片羣集

MongoDB分片簡述

  • 高數據量和吞吐量的數據庫應用會對單機的性能形成較大壓力,大的查詢量會將單機的 CPU 耗盡,大的數據量對單機的存儲壓力較大,最終會耗盡系統的內存而將壓力轉移到磁盤 IO 上。
  • MongoDB 分片是使用多個服務器存儲數據的方法,以支持巨大的數據存儲和對數據進行操做。分片技術能夠知足 MongoDB 數據量大量增加的需求,當一臺 MongoDB 服務器不足以存儲海量數據或不足以提供可接受的讀寫吞吐量時,咱們就能夠經過在多臺服務器上分割數據,使得數據庫系統能存儲和處理更多的數據。

MongoDB分片優點

  • 分片爲應對高吞吐量與大數據量提供了方法:
  1. 使用分片減小了每一個分片須要處理的請求數,所以,經過水平擴展,羣集能夠提升本身的存儲容量。好比,當插入一條數據時,應用只須要訪問存儲這條數據的分片。
  2. 使用分片減小了每一個分片村存儲的數據。

分片的優點在於提供相似線性增加的架構,提升數據可用性,提升大型數據庫查詢服務器的性能。當MongoDB單點數據庫服務器存儲成爲瓶頸、單點數據庫服務器的性能成爲瓶頸或須要部署大型應用以充分利用內存時,可使用分片技術。前端

MongoDB分片羣集的組成

MongoDB分片羣集主要有以下三個組件:linux

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

系統環境

  • 系統:CentOS 7.4 x86_64
  • 軟件版本:4.0
  • 關閉防火牆及selinux
IP地址 路由服務器(Routers) 配置服務器(Config Server) Shard1 Shard2 Shard3
192.168.125.119 27017 27018 27001 27002 27003
192.168.125.120 27017 27018 27001 27002 27003
192.168.125.121 27017 27018 27001 27002 27003

部署分片羣集

 

三臺物理服務器安裝及配置

  1. 下載解壓MongoDB
    wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.0.tgz tar zxvf mongodb-linux-x86_64-4.0.0.tgz -C /opt mv /opt/mongodb-linux-x86_64-4.0.0/ /usr/local/mongodb
  2. 建立路由、配置、分片服務器的數據存放目錄及日誌管理
    路由服務器不存儲數據,所以不須要建立數據存儲目錄,日誌文件建立完成還需給予權限。
    mkdir -p /data/mongodb/config mkdir -p /data/mongodb/shard{1,2,3} mkdir -p /data/mongodb/logs touch /data/mongodb/logs/shard{1,2,3}.log touch /data/mongodb/logs/mongos.log touch /data/mongodb/logs/config.log chmod 777 /data/mongodb/logs/*.log
  3. 建立管理用戶,修改目錄權限
    useradd -M -s /sbin/nologin mongo chown -R mongo:mongo /usr/local/mongodb chown -R mongo:mongo /data/mongodb
  4. 添加環境變量,便於使用
    echo 'export MONGODB_HOME=/usr/local/mongodb' >> /etc/profile echo 'export PATH=$PATH:$MONGODB_HOME/bin' >> /etc/profile source /etc/profile
  5. 系統參數優化
    ulimit -n 25000 //能夠打開的最大文件數量 ulimit -u 25000 //用戶最大可用的進程數 sysctl -w vm.zone_reclaim_mode=0 //內存不足時,從其餘節點分配內存 # 從CentOS7開始,MongoDB會建議關閉系統的THP特性,不然可能會致使性能降低 echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag //*注意*這些優化都是臨時的,重啓失效

部署配置服務器(三臺物理服務器配置步驟相同)

  1. 寫入配置文件,咱們能夠用scp命令把配置文件發到其餘兩臺物理服務器
    # vim config.conf dbpath=/data/mongodb/config //數據文件存放位置 logpath=/data/logs/config.log //日誌文件 port=27018 //端口號 logappend=true fork=true maxConns=5000 storageEngine=mmapv1 replSet=configs //複製集名稱 configsvr=true //設置參數爲true # mongod -f config.conf //啓動config實例 scp /usr/local/mongodb/bin/config.conf root@192.168.125.120:/usr/local/mongodb/bin scp /usr/local/mongodb/bin/config.conf root@192.168.125.121:/usr/local/mongodb/bin
  2. 配置複製集(任意一臺物理機上操做便可)
    mongo --port 27018 config={_id:"configs",members:[{_id:0,host:"192.168.125.119:27018"},{_id:1,host:"192.168.125.120:27018"},{_id:2,host:"192.168.125.121:27018"}]} //建立複製集 rs.initiate(config) //初始化複製集

部署分片服務器

  • 編輯shard{1,2,3}.conf配置文件,端口分別爲27001,27002,27003,設置shardsvr=true,啓動分片服務器
    # vim shard1.conf dbpath=/data/mongodb/shard1 logpath=/data/logs/shard1.log port=27001 logappend=true fork=true maxConns=5000 storageEngine=mmapv1 shardsvr=true # mongod -f shard1.conf # 與另外兩臺配置實例配置文件相同,僅端口、數據文件存放及日誌文件要改,只需配置完成後啓動便可
  • 將shard1配置爲複製集(這裏須要注意的是,預先被設爲仲裁節點的服務器上建立複製集會報錯。)
    mongo --port 27001 use admin config={_id:"shard1",members:[{_id:0,host:"192.168.125.119:27001"},{_id:1,host:"192.168.125.120:27001"},{_id:2,host:"192.168.125.121:27001"}]} //建立複製集 rs.initiate(config) //初始化複製集
  • 其他兩臺分片服務器shard二、shard3設置相同,注意端口及仲裁節點的問題便可

    部署路由服務器

  • 建立配置文件,將配置文件發送到其餘物理服務器。注意,路由服務器不須要存儲數據目錄
    # vim mongos.conf logpath=/data/mongodb/logs/mongos.log logappend = true port = 27017 fork = true configdb = configs/192.168.125.119:27018,192.168.125.120:27018,192.168.125.121:27018 maxConns=20000
  • 啓動mongos實例
    mongs -f /usr/local/mongodb/bin/mongos.conf # 注意,這邊啓動mongos實例用的是mongos命令

啓動分片功能

mongo //默認進入27017端口 mongos> use admin mongos> sh.addShard("shard1/192.168.125.119:27001,192.168.125.120:27001,172.16.10.29:27001") mongos> sh.addShard("shard2/192.168.125.119:27002,192.168.125.120:27002,172.16.10.29:27002") mongos> sh.status() //查看羣集狀態 # 此處爲添加兩臺分片服務器,後續添加的也會均勻分配分片數據

實現分片功能

  • 設置分片chunk大小
    mongos> use config mongos> db.settings.save({"_id":"chunksize","value":1}) # 設置塊大小爲1M是方便實驗,否則須要插入海量數據
  • 模擬寫入數據
    mongos> use school mongos> show collections mongos> for(i=1;i<=50000;i++){db.user.insert({"id":i,"name":"jack"+i})} # 在school庫的user表中循環寫入五萬條數據
  • 啓動數據庫分片
    mongos>sh.enableSharding("school") # 咱們能夠自定義須要分片的庫或表
  • 爲school庫中的user集合建立索引,而後對錶進行分片
    mongos> db.user.createIndex({"id":1}) #"id"做爲索引 mongos> sh.shardCollection("school.user",{"id":1}) # 根據"id"對user表進行分片 mongos> sh.status() # 查看分片狀況 mongos> sh.help() # 查看分片相關的命令
相關文章
相關標籤/搜索