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

jopen 8年前發布 | 13K 次閱讀 MongoDB NoSQL數據庫

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. 后記

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

來自: http://www.cnblogs.com/ee900222/p/mongodb_2.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!