什么是mognodb副本集官網(wǎng)上這么描述
為什么需要副本集
副本集復(fù)制原理參考這個博客MongoDB 副本集的原理、搭建、應(yīng)用 當(dāng)Primary節(jié)點完成數(shù)據(jù)操作后,Secondary會做出一系列的動作保證數(shù)據(jù)的同步: 副本集的同步和主從同步一樣,都是異步同步的過程,不同的是副本集有個自動故障轉(zhuǎn)移的功能。其原理是:slave端從primary端獲取日志,然后在自己身上完全順序的執(zhí)行日志所記錄的各種操作(該日志是不記錄查詢操作的),這個日志就是local數(shù)據(jù) 庫中的oplog.rs表,默認在64位機器上這個表是比較大的,占磁盤大小的5%,oplog.rs的大小可以在啟動參數(shù)中設(shè) 定:–oplogSize 1000,單位是M。 注意:在副本集的環(huán)境中,要是所有的Secondary都宕機了,只剩下Primary。最后Primary會變成Secondary,不能提供服務(wù)。 基于docker搭建最簡單的副本集基本思路是這個以下所有文件的項目地址在這里 配置docker環(huán)境這里省略,我當(dāng)前的環(huán)境如下:
編寫 |
version: '2' services: mongo1: image: awarecloud.com.cn/mongodb:latest container_name: "mongo1" ports: - "30001:27017" volumes: - /opt/replset/mongo1:/data/db command: mongod --replSet yw_replset restart: "always" networks: mongo_replset: ipv4_address: 162.16.1.10 mongo2: image: awarecloud.com.cn/mongodb:latest container_name: "mongo2" ports: - "30002:27017" volumes: - /opt/replset/mongo2:/data/db command: mongod --replSet yw_replset restart: "always" networks: mongo_replset: ipv4_address: 162.16.1.11 mongo3: image: awarecloud.com.cn/mongodb:latest container_name: "mongo3" ports: - "30003:27017" volumes: - /opt/replset/mongo3:/data/db command: mongod --replSet yw_replset restart: "always" networks: mongo_replset: ipv4_address: 162.16.1.12 #mongo-repl: # image: replset-mongo-config # container_name: mongo-repl # links: # - mongo1:mongo1 # - mongo2:mongo2 # - mongo3:mongo3 # networks: # mongo_replset: # ipv4_address: 162.16.1.13 networks: mongo_replset: driver: bridge driver_opts: com.docker.network.enable_ipv6: "false" ipam: driver: default config: - subnet: 162.16.1.0/24 gateway: 162.16.1.1 |
執(zhí)行命令docker-compose up -d
,復(fù)本集群就搭建完成了,連接mongo1,插入數(shù)據(jù),在mongo2中查詢,就可以看到了,默認SECONDARY
不支持查詢操作,需要執(zhí)行命令rs.setSlaveOk()
,然后執(zhí)行查詢,就沒問題了
replset.sh
執(zhí)行 sh replset.sh 初始化副本集相關(guān)信息
查看副本集信息
mongo --host 192.168.10.158 --port 30003
rs.status()
副本節(jié)點不支持查詢操作, db.getMongo().setSlaveOk() 當(dāng)前session有效
查看復(fù)制的情況
db.printSlaveReplicationInfo()
注意
上面有幾個點比較關(guān)鍵
slaveOk: true
,這樣才能從SECONDARY
節(jié)點取數(shù)據(jù)readPreference: secondary
,設(shè)定只能從SECONDARY
節(jié)點取數(shù)據(jù)readPreference: nearest
,實現(xiàn)負載均衡docker stop mongo1
關(guān)掉主節(jié)點,你會發(fā)現(xiàn)mongo2,或者是mongo3就會自動變成主節(jié)點,docker start mongo1
,重新啟動mongo1,發(fā)現(xiàn)它會變?yōu)?code>SECONDARY節(jié)點,并自動同步這down掉期間寫入的數(shù)據(jù)readPreference參數(shù)解釋
primary
默認參數(shù),只從主節(jié)點上進行讀取操作;primaryPreferred
大部分從主節(jié)點上讀取數(shù)據(jù),只有主節(jié)點不可用時從secondary節(jié)點讀取數(shù)據(jù)。secondary
只從secondary節(jié)點上進行讀取操作,存在的問題是secondary節(jié)點的數(shù)據(jù)會比primary節(jié)點數(shù)據(jù)“舊”。secondaryPreferred
優(yōu)先從secondary節(jié)點進行讀取操作,secondary節(jié)點不可用時從主節(jié)點讀取數(shù)據(jù);nearest
不管是主節(jié)點、secondary節(jié)點,從網(wǎng)絡(luò)延遲最低的節(jié)點上讀取數(shù)據(jù)。
|