mongoDB系列之(二):mongoDB 副本集


1. 什么是副本集

副本集就是mongoDB副本所組成的一個集群。

同期原理是,寫操作發生在主庫,從庫同步主庫的OpLog日志。

集群中沒有特定的主庫,主庫是選舉產生,如果主庫down了,會再選舉出一台主庫。

                   

 

mongoDB也可以配置成主從模式,但,官方已經不建議使用主從模式了,替代方案是采用副本集的模式。

 

副本集有以下特點:

1. 最小構成是:primary,secondary,arbiter,一般部署是:primary,2 secondary。

2. 成員數應該為奇數,如果為偶數的情況下添加arbiter,arbiter不保存數據,只投票。

3. 最大50 members,但是只能有 7 voting members,其他是non-voting members。

2. 配置副本集

本次實驗,配置的是1主2從的副本集。

test166:27017,test167:27017,test167:27018

關於mongoDB的安裝和使用,請參考mongoDB系列之(一):10分鍾玩轉mongoDB

2.1 創建副本集

在3台服務器上啟動mongoDB,指定副本集的名字為rs0

test166上啟動第一個mongoDB

# mongod --dbpath /var/lib/mongo --replSet rs0

test167上啟動第二個mongoDB

# mongod --dbpath /var/lib/mongo --replSet rs0

test167上啟動第三個mongoDB,指定端口為27018

# mkdir -p /data/mongo
# mongod --dbpath /data/mongo --port 27018 --replSet rs0

也可以在設定文件中指定,然后啟動

# vi /etc/mongod.conf

replication:
  replSetName: rs0

 

# systemctl start mongod

2.2 配置副本集

在任意一台上連接mongodb,初始化

# mongo
> use admin
> rs.initiate()

確認設定

rs0:PRIMARY> rs.conf()

添加成員到副本集

先在/etc/hosts設定hostname

添加第一個從庫,test167:27017

rs0:PRIMARY> rs.add('test167:27017')

添加第二個從庫,test167:27018

可以通過priority來調整主庫,選舉的時候,priority大的優先被選舉為主庫

rs0:PRIMARY> rs.add({host: "test167:27018", priority: 5})

確認設定

rs0:PRIMARY> rs.conf()

查看狀態

rs0:SECONDARY> rs.status()

移除從庫

先關閉從庫的mongoDB,然后在主庫上移除從庫

rs0:PRIMARY> rs.remove('test166:27019')

2.3 同期動作確認

在主庫上插入一條記錄

> db.user.insert({"username":"test","age":12,"sex":"m"})

在從庫上查看數據已經同期

rs0:SECONDARY> db.getMongo().setReadPref('secondaryPreferred')
rs0:SECONDARY> use new2
rs0:SECONDARY> db.user.find()

2.4 Failover動作

副本集heartbeat ping 2秒一次,10秒沒有回應認為down了。

Priority最高的被選舉為主庫,Priority 0的不能升為主。

Optime最高的從庫才能被選為主庫。

主庫需要能連到其他從庫,1主2從的情況下,down掉2台的情況下,不會選舉出主庫。

 

關閉主庫

> use admin
> db.shutdownServer()

在從庫上查看副本集狀態,可以看到一個從庫升級為主庫

rs0:SECONDARY> rs.status()

啟動關閉的前主庫,查看副本集狀態,看到主庫降為從庫,前主庫成為主庫

rs0:SECONDARY> rs.status()

備注:因為是使用OpLog日志同期,前主庫down掉的時間內,在1主1從構成下發生的數據更新,前主庫啟動后,會同期過來

3. 讀寫分離

主庫,從庫都支持讀操作。但是,默認情況讀也是從主庫來讀。

從庫可以通過設置ReadPreference打開支持讀操作,ReadPreference有幾種模式:

Primary                   #從主的讀,默認

primaryPreferred      #基本上從主的讀,主不可用時,從從的讀

secondary                #從從的讀

secondaryPreferred   #基本上從從的讀,從不可用時,從主的讀

nearest                    #從網絡延遲最小的讀

 

基本上常用的是,Primary,secondary,nearest

 

副本集的設定中可以通過Tag把成員歸類,通過下面方法指定讀的類型:

1,程序連接的時候,指定讀的類型ReadPreference

2,用mongo命令連接,只對當前連接有效

rs0:SECONDARY> db.getMongo().setReadPref('secondaryPreferred')

4. 特殊成員類型

Secondary還有一些特殊的成員類型:

Priority 0   #不能升為主,可以用於多數據中心場景

Hidden     #對客戶端來說是不可見的,一般用作備份或統計報告用

Delayed    #數據比副集晚,一般用作 rolling backup 或歷史快照

5. 后記

本次介紹了副本集的配置,下次將會介紹分片(Sharding)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM