詳解MongoDB4.0構(gòu)建分布式分片群集
MongoDB分片簡(jiǎn)述
高數(shù)據(jù)量和吞吐量的數(shù)據(jù)庫(kù)應(yīng)用會(huì)對(duì)單機(jī)的性能造成較大壓力,大的查詢量會(huì)將單機(jī)的 CPU 耗盡,大的數(shù)據(jù)量對(duì)單機(jī)的存儲(chǔ)壓力較大,最終會(huì)耗盡系統(tǒng)的內(nèi)存而將壓力轉(zhuǎn)移到磁盤 IO 上。
MongoDB 分片是使用多個(gè)服務(wù)器存儲(chǔ)數(shù)據(jù)的方法,以支持巨大的數(shù)據(jù)存儲(chǔ)和對(duì)數(shù)據(jù)進(jìn)行操作。分片技術(shù)可以滿足 MongoDB 數(shù)據(jù)量大量增長(zhǎng)的需求,當(dāng)一臺(tái) MongoDB 服務(wù)器不足以存儲(chǔ)海量數(shù)據(jù)或不足以提供可接受的讀寫吞吐量時(shí),我們就可以通過(guò)在多臺(tái)服務(wù)器上分割數(shù)據(jù),使得數(shù)據(jù)庫(kù)系統(tǒng)能存儲(chǔ)和處理更多的數(shù)據(jù)。
MongoDB分片優(yōu)勢(shì)
分片為應(yīng)對(duì)高吞吐量與大數(shù)據(jù)量提供了方法:
- 使用分片減少了每個(gè)分片需要處理的請(qǐng)求數(shù),因此,通過(guò)水平擴(kuò)展,群集可以提高自己的存儲(chǔ)容量。比如,當(dāng)插入一條數(shù)據(jù)時(shí),應(yīng)用只需要訪問(wèn)存儲(chǔ)這條數(shù)據(jù)的分片。
- 使用分片減少了每個(gè)分片村存儲(chǔ)的數(shù)據(jù)。
分片的優(yōu)勢(shì)在于提供類似線性增長(zhǎng)的架構(gòu),提高數(shù)據(jù)可用性,提高大型數(shù)據(jù)庫(kù)查詢服務(wù)器的性能。當(dāng)MongoDB單點(diǎn)數(shù)據(jù)庫(kù)服務(wù)器存儲(chǔ)成為瓶頸、單點(diǎn)數(shù)據(jù)庫(kù)服務(wù)器的性能成為瓶頸或需要部署大型應(yīng)用以充分利用內(nèi)存時(shí),可以使用分片技術(shù)。
MongoDB分片群集的組成
MongoDB分片群集主要有如下三個(gè)組件:
- Shard:分片服務(wù)器,用于存儲(chǔ)實(shí)際的數(shù)據(jù)塊,實(shí)際生產(chǎn)環(huán)境中一個(gè)shard server 角色可以由幾臺(tái)服務(wù)器組成一個(gè)Peplica Set 承擔(dān),防止主機(jī)單點(diǎn)故障。
- Config Server:配置服務(wù)器,存儲(chǔ)了整個(gè)分片群集的配置信息,其中包括chunk信息。
- Routers:前端路由,客戶端由此接入,且讓整個(gè)群集看上去像單一數(shù)據(jù)庫(kù),前端應(yīng)用可以透明使用。
系統(tǒng)環(huán)境
系統(tǒng):CentOS 7.4 x86_64
軟件版本:4.0
關(guān)閉防火墻及selinux
IP地址 | 路由服務(wù)器(Routers) | 配置服務(wù)器(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 |
部署分片群集
三臺(tái)物理服務(wù)器安裝及配置
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、創(chuàng)建路由、配置、分片服務(wù)器的數(shù)據(jù)存放目錄及日志管理
路由服務(wù)器不存儲(chǔ)數(shù)據(jù),因此不需要?jiǎng)?chuàng)建數(shù)據(jù)存儲(chǔ)目錄,日志文件創(chuàng)建完成還需給予權(quán)限。
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、創(chuàng)建管理用戶,修改目錄權(quán)限
useradd -M -s /sbin/nologin mongo chown -R mongo:mongo /usr/local/mongodb chown -R mongo:mongo /data/mongodb
4、添加環(huán)境變量,便于使用
echo 'export MONGODB_HOME=/usr/local/mongodb' >> /etc/profile echo 'export PATH=$PATH:$MONGODB_HOME/bin' >> /etc/profile source /etc/profile
5、系統(tǒng)參數(shù)優(yōu)化
ulimit -n 25000 //可以打開(kāi)的最大文件數(shù)量 ulimit -u 25000 //用戶最大可用的進(jìn)程數(shù) sysctl -w vm.zone_reclaim_mode=0 //內(nèi)存不足時(shí),從其他節(jié)點(diǎn)分配內(nèi)存 # 從CentOS7開(kāi)始,MongoDB會(huì)建議關(guān)閉系統(tǒng)的THP特性,否則可能會(huì)導(dǎo)致性能下降 echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag //*注意*這些優(yōu)化都是臨時(shí)的,重啟失效
部署配置服務(wù)器(三臺(tái)物理服務(wù)器配置步驟相同)
1、寫入配置文件,我們可以用scp命令把配置文件發(fā)到其他兩臺(tái)物理服務(wù)器
# vim config.conf dbpath=/data/mongodb/config //數(shù)據(jù)文件存放位置 logpath=/data/logs/config.log //日志文件 port=27018 //端口號(hào) logappend=true fork=true maxConns=5000 storageEngine=mmapv1 replSet=configs //復(fù)制集名稱 configsvr=true //設(shè)置參數(shù)為true # mongod -f config.conf //啟動(dòng)config實(shí)例 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、配置復(fù)制集(任意一臺(tái)物理機(jī)上操作即可)
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"}]} //創(chuàng)建復(fù)制集 rs.initiate(config) //初始化復(fù)制集
部署分片服務(wù)器
編輯shard{1,2,3}.conf配置文件,端口分別為27001,27002,27003,設(shè)置shardsvr=true,啟動(dòng)分片服務(wù)器
# 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 # 與另外兩臺(tái)配置實(shí)例配置文件相同,僅端口、數(shù)據(jù)文件存放及日志文件要改,只需配置完成后啟動(dòng)即可
將shard1配置為復(fù)制集(這里需要注意的是,預(yù)先被設(shè)為仲裁節(jié)點(diǎn)的服務(wù)器上創(chuàng)建復(fù)制集會(huì)報(bào)錯(cuò)。)
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"}]} //創(chuàng)建復(fù)制集 rs.initiate(config) //初始化復(fù)制集
其余兩臺(tái)分片服務(wù)器shard2、shard3設(shè)置相同,注意端口及仲裁節(jié)點(diǎn)的問(wèn)題即可
部署路由服務(wù)器
創(chuàng)建配置文件,將配置文件發(fā)送到其他物理服務(wù)器。注意,路由服務(wù)器不需要存儲(chǔ)數(shù)據(jù)目錄
# 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
啟動(dòng)mongos實(shí)例
mongs -f /usr/local/mongodb/bin/mongos.conf # 注意,這邊啟動(dòng)mongos實(shí)例用的是mongos命令
啟動(dòng)分片功能
mongo //默認(rèn)進(jìn)入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() //查看群集狀態(tài) # 此處為添加兩臺(tái)分片服務(wù)器,后續(xù)添加的也會(huì)均勻分配分片數(shù)據(jù)
實(shí)現(xiàn)分片功能
設(shè)置分片chunk大小
mongos> use config mongos> db.settings.save({"_id":"chunksize","value":1}) # 設(shè)置塊大小為1M是方便實(shí)驗(yàn),不然需要插入海量數(shù)據(jù)
模擬寫入數(shù)據(jù)
mongos> use school mongos> show collections mongos> for(i=1;i<=50000;i++){db.user.insert({"id":i,"name":"jack"+i})} # 在school庫(kù)的user表中循環(huán)寫入五萬(wàn)條數(shù)據(jù)
啟動(dòng)數(shù)據(jù)庫(kù)分片
mongos>sh.enableSharding("school") # 我們可以自定義需要分片的庫(kù)或表
為school庫(kù)中的user集合創(chuàng)建索引,然后對(duì)表進(jìn)行分片
mongos> db.user.createIndex({"id":1}) # 以"id"作為索引 mongos> sh.shardCollection("school.user",{"id":1}) # 根據(jù)"id"對(duì)user表進(jìn)行分片 mongos> sh.status() # 查看分片情況 mongos> sh.help() # 查看分片相關(guān)的命令
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 如何為MongoDB添加分片副本集
- 分布式文檔存儲(chǔ)數(shù)據(jù)庫(kù)之MongoDB分片集群的問(wèn)題
- MongoDB搭建高可用集群的完整步驟(3個(gè)分片+3個(gè)副本)
- Mongodb副本集和分片示例詳解
- MongoDB分片集群部署詳解
- MongoDB分片在部署與維護(hù)管理中常見(jiàn)的事項(xiàng)總結(jié)大全
- MongoDB分片鍵的選擇和案例實(shí)例詳解
- MongoDB分片詳解
- mongodb分片技術(shù)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- mongodb3.4集群搭建實(shí)戰(zhàn)之高可用的分片+副本集
- 深入理解MongoDB分片的管理
- Mongodb 刪除添加分片與非分片表維護(hù)
- MongoDB 主分片(primary shard)相關(guān)總結(jié)
相關(guān)文章
MongoDB系列教程(六):java操作mongodb實(shí)例
這篇文章主要介紹了MongoDB系列教程(六):java操作mongodb實(shí)例,本文講解了java中操作mongodb數(shù)據(jù)增加、刪除、修改、查詢數(shù)據(jù)等代碼實(shí)例,需要的朋友可以參考下2015-05-05Mongodb解決不能連接到服務(wù)器的錯(cuò)誤問(wèn)題
這篇文章主要介紹了Mongodb解決不能連接到服務(wù)器的錯(cuò)誤問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01Centos系統(tǒng)搭建MongoDB數(shù)據(jù)庫(kù)
這篇文章介紹了Centos系統(tǒng)搭建MongoDB數(shù)據(jù)庫(kù)的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04如何對(duì) MongoDB 進(jìn)行性能優(yōu)化(五個(gè)簡(jiǎn)單步驟)
MongoDB一直是最流行的NoSQL,而根據(jù)DB-Engines Ranking最新的排行,時(shí)下MongoDB已經(jīng)擊敗PostgreSQL躍居數(shù)據(jù)庫(kù)總排行的第四位,僅次于Oracle、MySQL和Microsoft SQL Server。本文給大家介紹MongoDB性能優(yōu)化的簡(jiǎn)單總結(jié)。2015-10-10Mongodb 啟動(dòng)命令mongod參數(shù)說(shuō)明(中文翻譯)
這篇文章主要介紹了Mongodb 啟動(dòng)命令mongod參數(shù)說(shuō)明(中文翻譯)的相關(guān)資料,需要的朋友可以參考下2016-10-10