副本集
簡介
- 就是一組維護相同數據集的mongod服務,類似主從集群
- 作用
- 冗餘和數據可用性:提供了多個數據副本,複製可提供容錯功能
- 實現副本服務器做只讀服務器,實現讀寫分離,提高負載
- 提高了系統可用性,有選舉策略,就算主節點掛掉了,也還有從節點
- MongoDB的複製
- 在副本集中有多個數據承載節點(從節點)和可選的一個仲裁節點,有且僅有一個是主節點
- 主節點接受所有寫操作,副本集只能有一個主要能夠確認具有寫入關注的寫入
- 主要記錄操作日誌中的數據集的所有更改就是oplog
- 從節點複製主節點的oplog並應用到數據集,以同步數據
副本集的三個角色
- 兩種類型
- 主節點:可讀寫,數據操作的主要連接點
- 從節點:數據冗餘備份節點,可以讀或選舉
- 三種角色
- 主成員:主節點
- 副本成員:從節點
- 仲裁者:不存數據,但是有投票選舉作用,副本成員可以同時是仲裁者,也可以是從節點
架構
第一步創建各個節點
#日志存储目录
mkdir -p /mongodb/replica_sets/myrs_27017/log \&
#数据存储目录
mkdir -p /mongodb/replica_sets/myrs_27017/data/db
vi mongodb/replica_sets/myrs_27017/mongod.conf
systemLog
# MongoDB发送所有日志输出的目标指定为文件
destination: file
# 日志文件的存储路径
path: "/mongodb/replica_sets/myrs_27017/log/mongod.log"
#mongodb实例启动的时候,将新条目加到现有日志的末尾
logAppend: true
storage:
#mongodb实例存储数据的目录,
dbPath: "/mongodb/replica_sets/myrs_27017/data/db"
journal:
# 启动或禁用持久化日志以确保数据文件保持有效和可恢复
enable: true
processManagement:
#启用在后台运行mongos或mongod进程的守护进程模式
fork: true
net:
#事务实例绑定的ip,默认是localhost
bindIp: localhost,192.168.0.2
#绑定的端口,默认是27017
port: 27017
replication:
# 副本集的名稱
replSetName: myrs
/usr/local/mongodb/bin/mongod -f /mongodb/replica_sets/myrs_27017/mongod.conf
- 再另外兩個服務器上配置副本和仲裁節點,除了port其他都一樣
第二步連接各個節點
/usr/local/mongodb/bin/mongo --host=180.76.159.126 --port=27017
rs.initiate()
- ok的值為1,說明創建成功
- 命令行提示符發生變化,變成一個從節點,此時默認不能讀寫,在等一會,回車,變成主節點
添加副本從節點
- 在主節點添加從節點,將其他成員加入副本集
- host為字符串或者配置文檔
- 字符串需要指定新成員的主機名和端口號
- 文檔需要指明在members數組中找到的副本集成員配置文檔,在文檔中需要指定主鍵字段
- arbiterOnly可選,僅在host為字符串的時候使用,如果為true,添加的主機的仲裁者
rs.add(host,arbiterOnly)
添加仲裁節點
配置讀權限
- 現在從節點只是一個備份,不能發揮讀的作用,需要到從節點設置
rs.slaveOK()
或
rs.slaveOK(true)
主節點的選舉原則
- 觸發條件
- 主節點故障
- 主節點網絡不可達(默認心跳機制10s)
- 人工干預(rs.stepDown(600))
- 選擇規則由票數來確定
- 票數最高:假設複製集中投票成員數量為N,大多為N/2+1
- 票數相同,數據新的節點獲勝(根據操作日誌oplog對比)
- 在獲取票數時,優先級參數影響重大
- 設置優先級(0~1000),越大票數就越高
默認優先級為1
springboot修改
- 在配置文件中修改
- slaveOK=true開啟副本節點讀功能,實現讀寫分離
- connect=replicaSet:自動到副本集中選擇讀寫的主機
spring:
data:
mongodb:
# 主機地址
#host: localhost
# 數據庫
#database: airClub
# 端口
#port: 27017
# 也可以使用uri連接
uri: mongodb://主節點ip:主節點port,從節點ip:從節點port,仲裁者ip:仲裁者port/airClub?
connect=replicaSet&slaveOK=true$replicaSet=myrs