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

