目錄
1 集群架構(概念篇)
1.1 MongoDB核心組件
1.2?主從復制
1.3 副本集
1.4 分片集
2 集群搭建
2.1 部署副本集(偽分布式)
2.2 分片集部署(偽分布式)
2.3 副本集與分片集區別
1 集群架構(概念篇)
????????MongoDB有三種集群部署模式,分別是主從復制(Master-Slave)、副本集(ReplicaSet)、分片集(Sharding)。采用集群架構復制的目的:保證數據生產部署時的冗余和可靠性,采用不同的機器來保存副本,數據不會因為單點故障而丟失。讀寫分離,提高數據的讀取能力。故障轉移、故障恢復。
1.1 MongoDB核心組件
💥Mongod:?處理所有的數據請求、管理數據的增刪改查操作。默認的數據目錄/data/db,默認端口27017,默認主機地址localhost。
💥Mongo:MongoDB提供的一個Mongo shell客戶端,便于用戶與MongoDB之間的交互。啟動Mongo默認連接到localhost:270127的test數據庫。
💥Mongos: 用于MongoDB分片集的路由選擇,對來自于應用層的查詢請求進行處理,平判斷所請求的數據位于分片集的哪個位置。
1.2?主從復制
? ? ? ? 1??主從復制模式的集群只能有一個主節點,主節點提供所有的增刪改查服務,從節點不提供服務,但是可以通過設置從節點提供查詢服務,這樣可以減少主節點的壓力。2??此外,每個從節點都要知道主節點的地址以及主節點的各個操作,從節點定期輪詢主節點獲取操作,并對自己的數據副本進行這些操作,從而保證主從節點數據的一致性。3??主節點出現故障,只能人工介入指定新的主節點,在此期間整個集群數據只能被讀而無法修改。
1.3 副本集
Primary主節點:與主從復制一樣,副本集中也只能有一個主節點,向外對客戶端提供數據讀寫的服務,執行的寫操作信息保存在oplog中。不同的是,副本集中的主節點發生故障時,仲裁節點觸發選舉,在所有的從節點中選出一個作為新的主節點,即使后續舊的主節點恢復正常,也會以從節點的身份加入到集群。
Secondary從節點:從節點只提供讀數據的服務,并且從節點定期輪詢oplog日志文件,根據日志內容同步更新自身的數據,使之保持與主節點一致。
Arbiter仲裁節點:仲裁節點不存儲任何數據,只記錄集群的節點數以及主節點發生故障時觸發選舉機制進行仲裁。仲裁節點和其他節點之間的唯一通信就是選舉期間的投票、心跳信息。
1.4 分片集
????????副本集可以解決主節點發生故障所導致的數據丟失或不可用的問題,但遇到需要存儲海量數據的情況,副本集就無法解決了。此時就用到了MongoDB的分片集操作,所謂分片就是將數據拆分并分散存儲在不同機器上的過程。
? ? ? ? 什么時間進行分片操作:1.單個節點的磁盤空間不足時。2.單個mongod已經不能滿足寫數據的性能要求,通過分片讓寫壓力分散到各個分片服務器上。3.把大量數據放到內存里提高性能,通過分片利用多臺分片服務器的內存資源。
Shard Server分片服務器:每一個分片服務器都是一個mongod進程,用于存儲實際的數據塊。實際生產中,一個分片服務器往往有多臺機器組成一個副本集來共同承擔,防止因主節點的單點故障而崩潰整個系統。
Config Server配置服務器:同樣是一個mongod進程,用來保存集群和分片的元數據,在集群啟動的最開始時建立。
Route Server路由服務器:是一個獨立的mongos進程(即不儲存數據的mongod進程),啟動時要從配置服務器加載集群信息到緩存中(分片集群要首先啟動配置服務器的原因),并將客戶端的請求路由給每個分片服務器,在各分片服務器返回結果后進行聚合并返回客戶端。
2 集群搭建
2.1 部署副本集(偽分布式)
建議開三個終端界面,分別操作三個節點,這樣操作比較直觀。
1??首先需要有三個節點或者說三個mongod進程
localhost:27017
localhost:27018
localhost:27019
2??創建并配置三個配置文件來開啟三個節點
/user/local/mongodb4.4.1/conf/rs_mongod1.conf
/user/local/mongodb4.4.1/conf/rs_mongod2.conf
/user/local/mongodb4.4.1/conf/rs_mongod3.conf
配置文件內容如下:
三個配置文件中的port端口為對應節點的端口,必須更改成
涉及到路徑的配置項path、dbpath里面的路徑目錄文件都必須創建,帶后綴的是文件不帶后綴的是目錄,別創建錯了
replSetName是副本集的名字,一個副本集里的三個節點的三個配置文件里都必須一樣。
systemLog:destination: filepath: /var/log/mongodb/rs_mongod1.loglogAppend: true
storage:dbPath: /usr/local/mongodb4.4.1/data/rs_mongod1journal:enabled: true
processManagement:fork: true
net:bindIp: localhostport: 27017
replication:oplogSizeMB: 100replSetName: my_repl enableMajorityReadConcern: true
3??使用配置文件開啟節點服務
開啟節點服務需要先進入配置文件所在目錄,開啟服務成功后才能連接節點
#開啟節點服務
sudo mongod --config rs_mongod1.conf#連接節點,進入shell操作界面
#mongo后面的是連接節點的ip和端口
mongo localhost:27017
4??主節點初始化
剛剛創建的三個節點默認都是從節點,從節點在未設置可讀之前無法讀取數據,故此時show dbs會報錯,這就需要初始化主節點,使其中的一個從節點成為主節點。
var rsconf={_id:"my_repl",members:[{_id:1,host:“localhost:27017"},{_id:2,host:“localhost:27018"},{_id:3,host:“localhost:27019"}]}rs.initiate(rsconf) #初始化Primary
rs.status( ) #查看副本集狀態
此時,進行初始化操作的節點就會成為主節點。
5??從節點、仲裁節點設置
下面的三個操作都是在主節點的shell里完成的,主節點才有權對其他節點進行設置
#將該節點作為從節點加入集群中
rs.add("localhost:27019")#將節點設置成仲裁節點
rs.addArb("localhost:27019")#從集群中刪除節點
rs.remove("localhost:27019")
從節點設置為可讀
rs.slaveOK()
對哪個節點的操作就要在哪個節點的shell界面進行設置
💥💥💥副本集操作完成后不能直接關閉終端,必須必須必須使用兩次exit先退出shell再退出節點服務最后關閉虛擬機,否則下次再開啟節點服務時,會因為直接關閉終端或者虛擬機而導致服務異常關閉,從而無法正常開啟服務,處理起來會很麻煩。
2.2 分片集部署(偽分布式)
建議開三個終端界面,分別操作三個服務器副本集,這樣操作比較直觀。
?1??首先需要有三個服務器節點或者說兩個mongod、一個mongos進程
localhost:27017? ? ? ? 配置服務器(mongod)
localhost:27018? ? ? ? 路由服務器(mongos)
localhost:27019? ? ? ? 分片服務器(mongod)
2??創建并配置三個配置文件來完成分片集的主要架構
????????這里為了減少計算機部署分片集群的壓力,采用配置服務器單成員副本集,路由服務器,分片服務器單成員副本集。單成員模式的副本集,即只用一個節點作為主節點加入到副本集中,完成一個最簡單的副本集。若想要搭建更加完善的分片集群,只需多創建幾個節點并加入到副本集中即可。
💥配置服務器(Config Server)副本集
1.配置文件及其內容:
/user/local/mongodb4.4.1/conf/shard/configsvr.conf
配置文件中的port端口為對應節點的端口,必須更改
涉及到路徑的配置項path、dbpath里面的路徑目錄文件都必須創建,帶后綴的是文件不帶后綴的是目錄,別創建錯了
storage:dbPath: /usr/local/mongodb4.4.1/data/configsvr journal:enabled: true
systemLog:destination: filepath: /var/log/mongodb/shard/configsvr.loglogAppend: true
net:bindIp: localhost port: 27017
processManagement:fork: true
sharding:clusterRole: configsvr
replication:replSetName: configsvr_rs
2.初始化主節點:
開啟節點服務需要先進入配置文件所在目錄,開啟服務成功后才能連接節點
#開啟節點服務
sudo mongod --config configsvr.conf#連接節點,進入shell操作界面
mongo localhost:27017#主節點初始化
rs.initiate({_id: "configsvr_rs",configsvr: true,members: [{ _id : 0, host : “localhost:27017" },]})
💥路由服務器(Route Server)
1.配置文件及其內容
/user/local/mongodb4.4.1/conf/shard/mongos.conf
配置文件中的port端口為對應節點的端口,必須更改
涉及到路徑的文件都要創建有后綴是文件,無后綴是目錄
路由服務器不存儲數據故不需要dbPath(與其他兩個結點的區別)
systemLog:destination: filepath: /var/log/mongodb/shard/mongos.loglogAppend: true
net:bindIp: localhost port: 27018
processManagement:fork: true
sharding:configDB: configsvr_rs/localhost:27017
開啟節點服務需要先進入配置文件所在目錄,開啟服務成功后才能連接節點
sudo mongos --config mongos.config
💥分片服務器(Shard Server)副本集
1.配置文件及內容
/user/local/mongodb4.4.1/conf/shard/shardsvr.conf
storage:dbPath: /usr/local/mongodb4.4.1/data/shardsvr journal:enabled: true
systemLog:destination: filepath: /var/log/mongodb/shard/shardsvr.loglogAppend: true
net:bindIp: localhostport: 27019
processManagement:fork: true
sharding:clusterRole: shardsvr
replication:replSetName: shardsvr_rs1
2.初始化主節點
#開啟節點服務
sudo mongod --config shardsvr.conf#連接節點,進入shell操作界面
mongo localhost:27019#主節點初始化
rs.initiate({_id : "shardsvr_rs1",members: [{ _id : 0, host : “localhost:27019" },]})
3??進入mongos shell界面操作整個分片集
進入mongos shell界面
mongo localhost:27018
添加分片服務器副本集到分片集群中
sh.addShard("shardsvr_rs1/localhost:27019,")
再創建一個分片服務器副本集并加入到分片集群
參照上文分片服務器副本集,先創建并配置一個節點的配置文件,使用配置文件開啟服務,進入shell界面初始化主節點,進入mongos的shell界面使用sh.addShard()將其添加入集群。
4??數據庫、集合分片操作?
💥💥💥分片集操作完成后同樣不能直接關閉終端,必須必須必須使用兩次exit先退出shell再退出節點服務最后關閉虛擬機,否則下次再開啟節點服務時,會因為直接關閉終端或者虛擬機而導致服務異常關閉,從而無法正常開啟服務,處理起來會很麻煩。
2.3 副本集與分片集區別
副本集是讓多臺服務器都擁有同樣的數據副本,每一臺服務器都是其他服務器的鏡像。然而分片集中的每一個分片都和其他分片擁有不同的數據子集,相當于分布式存儲。