每日一句
Perfection is not just about control. It's also about letting go.
完美不是控制出來的,是爆發(fā)出來的。
概述
MongoDB中的副本集(Replica Set)是一組維護相同數(shù)據(jù)集的mongod服務。副本集可提供冗余和高可用性,是所有生產(chǎn)部署的基礎。
副本集類似于有自動故障恢復功能的主從集群。通俗的講就是用多臺機器進行同一數(shù)據(jù)的異步同步,從而使多臺機器擁有同一數(shù)據(jù)的多個副本,并且當主庫當?shù)魰r在不需要用戶干預的情況下自動切換其他備份服務器做主庫。而且還可以利用副本服務器做只讀服務器,實現(xiàn)讀寫分離,提高負載。
冗余和數(shù)據(jù)可用性
復制提供冗余并提高數(shù)據(jù)可用性。 通過在不同數(shù)據(jù)庫服務器上提供多個數(shù)據(jù)副本,復制可提供一定級別的容錯功能,以防止丟失單個數(shù)據(jù)庫服務器。
在某些情況下,復制可以提供增加的讀取性能,因為客戶端可以將讀取操作發(fā)送到不同的服務上,在不同數(shù)據(jù)中心維護數(shù)據(jù)副本可以增加分布式應用程序的數(shù)據(jù)位置和可用性。
您還可以為專用目的維護其他副本,例如災難恢復,報告或備份。
MongoDB中的復制
副本集是一組維護相同數(shù)據(jù)集的mongod實例。
副本集包含多個數(shù)據(jù)承載節(jié)點和可選的一個仲裁節(jié)點。在承載數(shù)據(jù)的節(jié)點中,一個且僅一個成員被視為主節(jié)點,而其他節(jié)點被視為次要(從)節(jié)點。主節(jié)點接收所有寫操作。
副本集只能有一個主要能夠確認具有{w:“most”}寫入關注的寫入;
雖然在某些情況下,另一個mongod實例可能暫時認為自己也是主要的。主要記錄其操作日志中的數(shù)據(jù)集的所有更改,即oplog。
輔助(副本)節(jié)點復制主節(jié)點的oplog并將操作應用于其數(shù)據(jù)集,以使輔助節(jié)點的數(shù)據(jù)集反映主節(jié)點的數(shù)據(jù)集。 如果主要人員不在,則符合條件的中學將舉行選舉以選出新的主要人員。
主從復制和副本集區(qū)別
主從集群和副本集最大的區(qū)別就是副本集沒有固定的“主節(jié)點”;
整個集群會選出一個“主節(jié)點”,當其掛掉后,又在剩下的從節(jié)點中選中其他節(jié)點為“主節(jié)點”,副本集總有一個活躍點(主、primary)和一個或多個備份節(jié)點(從、secondary)。
副本集的三個角色
副本集有兩種類型三種角色
兩種類型:
- 主節(jié)點(Primary)類型:數(shù)據(jù)操作的主要連接點,可讀寫。
- 次要(輔助、從)節(jié)點(Secondaries)類型:數(shù)據(jù)冗余備份節(jié)點,可以讀或選舉。
三種角色:
- 主要成員(Primary):主要接收所有寫操作。就是主節(jié)點。
- 副本成員(Replicate):從主節(jié)點通過復制操作以維護相同的數(shù)據(jù)集,即備份數(shù)據(jù),不可寫操作,但可以讀操作(但需要配置)。是默認的一種從節(jié)點類型。
- 仲裁者(Arbiter):不保留任何數(shù)據(jù)的副本,只具有投票選舉作用。當然也可以將仲裁服務器維護為副本集的一部分,即副本成員同時也可以是仲裁者。也是一種從節(jié)點類型。
關于仲裁者的額外說明:
您可以將額外的mongod實例添加到副本集作為仲裁者。
仲裁者不維護數(shù)據(jù)集。 仲裁者的目的是通過響應其他副本集成員的心跳和選舉請求來維護副本集中的仲裁。 因為它們不存儲數(shù)據(jù)集,所以仲裁器可以是提供副本集仲裁功能的好方法,其資源成本比具有數(shù)據(jù)集的全功能副本集成員更便宜。
如果您的副本集具有偶數(shù)個成員,請?zhí)砑又俨谜咭垣@得主要選舉中的“大多數(shù)”投票。 仲裁者不需要專用硬件。
仲裁者將永遠是仲裁者,而主要人員可能會退出并成為次要人員,而次要人員可能成為選舉期間的主要人員。
如果你的副本+主節(jié)點的個數(shù)是偶數(shù),建議加一個仲裁者,形成奇數(shù),容易滿足大多數(shù)的投票。如果你的副本+主節(jié)點的個數(shù)是奇數(shù),可以不加仲裁者。
實例:一主三從一仲裁
通過實例來演示這種架構的搭建。
創(chuàng)建主節(jié)點
提示:在創(chuàng)建主節(jié)點之前記得保證沒有mongd進程在運行中。
- 創(chuàng)建目錄:存放數(shù)據(jù)和日志
mkdir -p /usr/yltrcc/mongodb/replica_sets/myrs_27017/data/db
mkdir -p /usr/yltrcc/mongodb/replica_sets/myrs_27017/log
- 新建或修改配置文件
vim /usr/yltrcc/mongodb/replica_sets/myrs_27017/mongod.conf
# 添加如下內(nèi)容
systemLog:
#MongoDB發(fā)送所有日志輸出的目標指定為文件
destination: file
#mongod或mongos應向其發(fā)送所有診斷日志記錄信息的日志文件的路徑
path: "/usr/yltrcc/mongodb/replica_sets/myrs_27017/log/mongod.log"
#當mongos或mongod實例重新啟動時,mongos或mongod會將新條目附加到現(xiàn)有日志文件的末尾。
logAppend: true
storage:
#mongod實例存儲其數(shù)據(jù)的目錄。storage.dbPath設置僅適用于mongod。
dbPath: "/usr/yltrcc/mongodb/replica_sets/myrs_27017/data/db"
journal:
#啟用或禁用持久性日志以確保數(shù)據(jù)文件保持有效和可恢復。
enabled: true
processManagement:
#啟用在后臺運行mongos或mongod進程的守護進程模式。
fork: true
#指定用于保存mongos或mongod進程的進程ID的文件位置,其中mongos或mongod將寫入其PID
pidFilePath: "/usr/yltrcc/mongodb/replica_sets/myrs_27017/log/mongod.pid"
net:
#服務實例綁定所有IP,有副作用,副本集初始化的時候,節(jié)點名字會自動設置為本地域名,而不是ip #bindIp
#All: true
#服務實例綁定的IP
bindIp: localhost,192.168.20.131
#bindIp #綁定的端口
port: 27017
replication:
#副本集的名稱
replSetName: myrs
- 啟動節(jié)點服務
/usr/yltrcc/mongodb/bin/mongod -f /usr/yltrcc/mongodb/replica_sets/myrs_27017/mongod.conf
創(chuàng)建從節(jié)點1
- 創(chuàng)建目錄:存放數(shù)據(jù)和日志
mkdir -p /usr/yltrcc/mongodb/replica_sets/myrs_27018/data/db
mkdir -p /usr/yltrcc/mongodb/replica_sets/myrs_27018/log
- 新建或修改配置文件
vim /usr/yltrcc/mongodb/replica_sets/myrs_27018/mongod.conf
# 添加如下內(nèi)容
systemLog:
#MongoDB發(fā)送所有日志輸出的目標指定為文件
destination: file
#mongod或mongos應向其發(fā)送所有診斷日志記錄信息的日志文件的路徑
path: "/usr/yltrcc/mongodb/replica_sets/myrs_27018/log/mongod.log"
#當mongos或mongod實例重新啟動時,mongos或mongod會將新條目附加到現(xiàn)有日志文件的末尾。
logAppend: true
storage:
#mongod實例存儲其數(shù)據(jù)的目錄。storage.dbPath設置僅適用于mongod。
dbPath: "/usr/yltrcc/mongodb/replica_sets/myrs_27018/data/db"
journal:
#啟用或禁用持久性日志以確保數(shù)據(jù)文件保持有效和可恢復。
enabled: true
processManagement:
#啟用在后臺運行mongos或mongod進程的守護進程模式。
fork: true
#指定用于保存mongos或mongod進程的進程ID的文件位置,其中mongos或mongod將寫入其PID
pidFilePath: "/usr/yltrcc/mongodb/replica_sets/myrs_27018/log/mongod.pid"
net:
#服務實例綁定所有IP,有副作用,副本集初始化的時候,節(jié)點名字會自動設置為本地域名,而不是ip #bindIp
#All: true
#服務實例綁定的IP
bindIp: localhost,192.168.20.131
#bindIp #綁定的端口
port: 27018
replication:
#副本集的名稱
replSetName: myrs
- 啟動節(jié)點服務
/usr/yltrcc/mongodb/bin/mongod -f /usr/yltrcc/mongodb/replica_sets/myrs_27018/mongod.conf
創(chuàng)建從節(jié)點2
- 創(chuàng)建目錄:存放數(shù)據(jù)和日志
mkdir -p /usr/yltrcc/mongodb/replica_sets/myrs_27019/data/db
mkdir -p /usr/yltrcc/mongodb/replica_sets/myrs_27019/log
- 新建或修改配置文件
vim /usr/yltrcc/mongodb/replica_sets/myrs_27019/mongod.conf
# 添加如下內(nèi)容
systemLog:
#MongoDB發(fā)送所有日志輸出的目標指定為文件
destination: file
#mongod或mongos應向其發(fā)送所有診斷日志記錄信息的日志文件的路徑
path: "/usr/yltrcc/mongodb/replica_sets/myrs_27019/log/mongod.log"
#當mongos或mongod實例重新啟動時,mongos或mongod會將新條目附加到現(xiàn)有日志文件的末尾。
logAppend: true
storage:
#mongod實例存儲其數(shù)據(jù)的目錄。storage.dbPath設置僅適用于mongod。
dbPath: "/usr/yltrcc/mongodb/replica_sets/myrs_27019/data/db"
journal:
#啟用或禁用持久性日志以確保數(shù)據(jù)文件保持有效和可恢復。
enabled: true
processManagement:
#啟用在后臺運行mongos或mongod進程的守護進程模式。
fork: true
#指定用于保存mongos或mongod進程的進程ID的文件位置,其中mongos或mongod將寫入其PID
pidFilePath: "/usr/yltrcc/mongodb/replica_sets/myrs_27019/log/mongod.pid"
net:
#服務實例綁定所有IP,有副作用,副本集初始化的時候,節(jié)點名字會自動設置為本地域名,而不是ip #bindIp
#All: true
#服務實例綁定的IP
bindIp: localhost,192.168.20.131
#bindIp #綁定的端口
port: 27019
replication:
#副本集的名稱
replSetName: myrs
- 啟動節(jié)點服務
/usr/yltrcc/mongodb/bin/mongod -f /usr/yltrcc/mongodb/replica_sets/myrs_27019/mongod.conf
創(chuàng)建從節(jié)點3
- 創(chuàng)建目錄:存放數(shù)據(jù)和日志
mkdir -p /usr/yltrcc/mongodb/replica_sets/myrs_27020/data/db
mkdir -p /usr/yltrcc/mongodb/replica_sets/myrs_27020/log
- 新建或修改配置文件
vim /usr/yltrcc/mongodb/replica_sets/myrs_27020/mongod.conf
# 添加如下內(nèi)容
systemLog:
#MongoDB發(fā)送所有日志輸出的目標指定為文件
destination: file
#mongod或mongos應向其發(fā)送所有診斷日志記錄信息的日志文件的路徑
path: "/usr/yltrcc/mongodb/replica_sets/myrs_27020/log/mongod.log"
#當mongos或mongod實例重新啟動時,mongos或mongod會將新條目附加到現(xiàn)有日志文件的末尾。
logAppend: true
storage:
#mongod實例存儲其數(shù)據(jù)的目錄。storage.dbPath設置僅適用于mongod。
dbPath: "/usr/yltrcc/mongodb/replica_sets/myrs_27020/data/db"
journal:
#啟用或禁用持久性日志以確保數(shù)據(jù)文件保持有效和可恢復。
enabled: true
processManagement:
#啟用在后臺運行mongos或mongod進程的守護進程模式。
fork: true
#指定用于保存mongos或mongod進程的進程ID的文件位置,其中mongos或mongod將寫入其PID
pidFilePath: "/usr/yltrcc/mongodb/replica_sets/myrs_27020/log/mongod.pid"
net:
#服務實例綁定所有IP,有副作用,副本集初始化的時候,節(jié)點名字會自動設置為本地域名,而不是ip #bindIp
#All: true
#服務實例綁定的IP
bindIp: localhost,192.168.20.131
#bindIp #綁定的端口
port: 27020
replication:
#副本集的名稱
replSetName: myrs
- 啟動節(jié)點服務
/usr/yltrcc/mongodb/bin/mongod -f /usr/yltrcc/mongodb/replica_sets/myrs_27020/mongod.conf
創(chuàng)建仲裁節(jié)點
- 創(chuàng)建目錄:存放數(shù)據(jù)
mkdir -p /usr/yltrcc/mongodb/replica_sets/myrs_arb
- 啟動節(jié)點服務
/usr/yltrcc/mongodb/bin/mongod --port 27030 --dbpath /usr/yltrcc/mongodb/replica_sets/myrs_arb --replSet myrs --bind_ip 192.168.20.131
初始化配置副本集和主節(jié)點
使用客戶端命令連接任意一個節(jié)點,但這里盡量要連接主節(jié)點(27017節(jié)點)
/usr/yltrcc/mongodb/bin/mongo --host=192.168.20.131 --port=27017
結果,連接上之后,很多命令無法使用,,比如 show dbs 等,必須初始化副本集才行。
使用命令:rs.initiate()
添加從節(jié)點
在主節(jié)點添加從節(jié)點,將其他成員加入到副本集
命令:rs.add("192.168.20.131:27018")
添加仲裁從節(jié)點
添加一個仲裁節(jié)點到副本集
命令:rs.addArb("192.168.20.131:27030")
設置從節(jié)點讀操作權限
當前從節(jié)點只是一個備份,不是奴隸節(jié)點,無法讀取數(shù)據(jù),寫當然更不行。因為默認情況下,從節(jié)點是沒有讀寫權限的,可以增加讀的權限,但需要進行設置。
使用命令:rs.slaveOk()或者 rs.slaveOk(true)
取消讀權限命令:rs.slaveOk(false)
提示:注意一定要連接到從節(jié)點上,不要連接到主節(jié)點上了。
答疑
- 1主1從1仲裁 不可以嗎?
這種是不用添加仲裁節(jié)點的,非仲裁者的數(shù)量要大于投票節(jié)點的大多數(shù),具體請查看:https://docs.mongodb.com/manual/reference/write-concern/
Spring Data MongoDB 連接副本集
語法格式:mongodb://host1,host2,host3/articledb?connect=replicaSet&slaveOk=true&replicaSet=副本集名字
參數(shù)說明:
-
slaveOk=true:開啟副本節(jié)點讀的功能,可實現(xiàn)讀寫分離。 -
connect=replicaSet:自動到副本集中選擇讀寫的主機。如果slaveOK是打開的,則實現(xiàn)了讀寫分離
實例:
連接 replica set 三臺服務器 (端口 27017, 27018, 和27019),直接連接第一個服務器,無論是replicaset一部分或者主服務器或者從服務器,寫入操作應用在主服務器 并且分布查詢到從服務器。
配置文件application.yml
spring:
#數(shù)據(jù)源配置
data:
mongodb:
# 副本集的連接字符串
# uri: mongodb://192.168.40.141:27017,192.168.40.141:27018,192.168.40.141:27019/articledb?connect=replicaSet&slaveOk=true&replicaSet=myrs
#副本集有認證的情況下,字符串連接
uri: mongodb://bobo:123456@192.168.40.141:27017,192.168.40.141:27018,192.168.40.141:27019/articledb?connect=replicaSet&slaveOk=true&replicaSet=myrs
美文佳句
夜深了,我躺在床上久久不能入睡,悄悄走到窗前。雖然西安的天空仍然灰蒙蒙的,但我知道,頭頂?shù)奶炜丈?,又多了一顆閃亮的星星,那是您,正悄悄地在云朵上看著我呢。放心吧,太姥姥,您給我的溫暖,會一直給我力量,希望您一路走好,帶著所有溫暖的回憶……
你好,我是yltrcc,日常分享技術點滴,歡迎關注我