MongoDB4.0構建分布式分片群集
阿新 • • 發佈:2018-08-09
操作 router 數據庫服務 chmod ble etc 定義 storage 日誌管理 MongoDB分片簡述
- 高數據量和吞吐量的數據庫應用會對單機的性能造成較大壓力,大的查詢量會將單機的 CPU 耗盡,大的數據量對單機的存儲壓力較大,最終會耗盡系統的內存而將壓力轉移到磁盤 IO 上。
- MongoDB 分片是使用多個服務器存儲數據的方法,以支持巨大的數據存儲和對數據進行操作。分片技術可以滿足 MongoDB 數據量大量增長的需求,當一臺 MongoDB 服務器不足以存儲海量數據或不足以提供可接受的讀寫吞吐量時,我們就可以通過在多臺服務器上分割數據,使得數據庫系統能存儲和處理更多的數據。
MongoDB分片優勢
- 分片為應對高吞吐量與大數據量提供了方法:
- 使用分片減少了每個分片需要處理的請求數,因此,通過水平擴展,群集可以提高自己的存儲容量。比如,當插入一條數據時,應用只需要訪問存儲這條數據的分片。
- 使用分片減少了每個分片村存儲的數據。
分片的優勢在於提供類似線性增長的架構,提高數據可用性,提高大型數據庫查詢服務器的性能。當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 |
部署分片群集
三臺物理服務器安裝及配置
- 下載解壓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
- 創建路由、配置、分片服務器的數據存放目錄及日誌管理
路由服務器不存儲數據,因此不需要創建數據存儲目錄,日誌文件創建完成還需給予權限。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
- 創建管理用戶,修改目錄權限
useradd -M -s /sbin/nologin mongo chown -R mongo:mongo /usr/local/mongodb chown -R mongo:mongo /data/mongodb
- 添加環境變量,便於使用
echo ‘export MONGODB_HOME=/usr/local/mongodb‘ >> /etc/profile echo ‘export PATH=$PATH:$MONGODB_HOME/bin‘ >> /etc/profile source /etc/profile
- 系統參數優化
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 //*註意*這些優化都是臨時的,重啟失效
部署配置服務器(三臺物理服務器配置步驟相同)
- 寫入配置文件,我們可以用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
- 配置復制集(任意一臺物理機上操作即可)
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() # 查看分片相關的命令
MongoDB4.0構建分布式分片群集