MongoDB4.0構建分散式分片群集

  • 2019 年 10 月 5 日
  • 筆記

MongoDB4.0構建分散式分片群集

你講多次關注0人評論2087人閱讀2018-08-09 20:48:43

MongoDB分片簡述

  • 高數據量和吞吐量的資料庫應用會對單機的性能造成較大壓力,大的查詢量會將單機的 CPU 耗盡,大的數據量對單機的存儲壓力較大,最終會耗盡系統的記憶體而將壓力轉移到磁碟 IO 上。
  • MongoDB 分片是使用多個伺服器存儲數據的方法,以支援巨大的數據存儲和對數據進行操作。分片技術可以滿足 MongoDB 數據量大量增長的需求,當一台 MongoDB 伺服器不足以存儲海量數據或不足以提供可接受的讀寫吞吐量時,我們就可以通過在多台伺服器上分割數據,使得資料庫系統能存儲和處理更多的數據。

MongoDB分片優勢

  • 分片為應對高吞吐量與大數據量提供了方法:
  1. 使用分片減少了每個分片需要處理的請求數,因此,通過水平擴展,群集可以提高自己的存儲容量。比如,當插入一條數據時,應用只需要訪問存儲這條數據的分片。
  2. 使用分片減少了每個分片村存儲的數據。

分片的優勢在於提供類似線性增長的架構,提高數據可用性,提高大型資料庫查詢伺服器的性能。當MongoDB單點資料庫伺服器存儲成為瓶頸、單點資料庫伺服器的性能成為瓶頸或需要部署大型應用以充分利用記憶體時,可以使用分片技術。

MongoDB分片群集的組成

MongoDB分片群集主要有如下三個組件:

  • 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 [email protected]:/usr/local/mongodb/bin scp /usr/local/mongodb/bin/config.conf [email protected]:/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) //初始化複製集
  • 其餘兩台分片伺服器shard2、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() # 查看分片相關的命令

(adsbygoogle = window.adsbygoogle || []).push({});