一、原理
通俗的講就是用多臺機器進行同一數據的異步同步,從而使多臺機器擁有同一數據的多個副本,其中有一個主服務器(primary),用戶處理客戶端請求,還有多個備份服務器(secondary),用戶保存主服務器的數據副本。並且當主庫奔潰時在不需要用戶干預的情況下自動切換其他備份服務器做主庫。而且還可以利用副本服務器做只讀服務器,實現讀寫分離,提高負載。
mongodb的複製至少需要兩個節點。其中一個是主節點,負責處理客戶端請求,其餘的都是從節點,負責複製主節點上的數據。
mongodb各個節點常見的搭配方式爲:一主一從、一主多從。
主節點記錄在其上的所有操作oplog,從節點定期輪詢主節點獲取這些操作,然後對自己的數據副本執行這些操作,從而保證從節點的數據與主節點一致。
二、環境準備
[root@node1 bin]# cat /etc/redhat-release
CentOS release 6.6 (Final)
兩臺服務器:192.168.200.140(primary) 192.168.200.144(secondary)
三、複製集搭建過程
1.啓動節點
(1)啓動節點1
[root@node1 bin]# ./mongod --dbpath=/a01/mongodb/data/ --logpath=/a01/mongodb/logs/node1.log --oplogSize 400 --maxConns=2000 --replSet replcopy/192.168.200.140:27017 --fork
(2)啓動節點2
[root@node2 bin]# ./mongod --dbpath=/a01/mongodb/data/ --logpath=/a01/mongodb/logs/node2.log --oplogSize 400 --maxConns=2000 --replSet replcopy/192.168.200.144:27017 --fork
(3)啓動arbiter節點
[root@node2 bin]# ./mongod --dbpath=/a01/mongodb/arbiter/ --logpath=/a01/mongodb/logs/arbiter.log --port 20000 --replSet replcopy/192.168.200.140:27017,192.168.200.144:27017 --fork
2.初始化節點
(1)運行第一個節點的Mogo
[root@node1 bin]# ./mongo
(2)配置複製集
> cfg = { _id: "replcopy", members:[ { _id:0,host:"192.168.200.140:27017"}, { _id:1, host:"192.168.200.144:27017"} ]}
(3)初始化配置集
> rs.initiate(cfg)
3. 加入arbiter(仲裁)節點
(1)replcopy:OTHER> rs.addArb("192.168.200.144:20000");
(2)查看狀態
replcopy:PRIMARY> rs.status();
4.複製測試
(1)主節點中新建數據庫並添加數據
replcopy:PRIMARY> use testdb
replcopy:PRIMARY> db.user.insert({name:"wangxiuli"});
replcopy:PRIMARY> db.user.find();
{ "_id" : ObjectId("576fc8c2e2070e5168bfe7bd"), "name" : "wangxiuli" }
(2)從節點查看數據是否同步
replcopy:SECONDARY> use testdb;
默認從庫是不可查詢的,但是執行如下語句則可以查詢。
replcopy:SECONDARY> rs.slaveOk();
replcopy:SECONDARY> db.user.find();
{ "_id" : ObjectId("576fc8c2e2070e5168bfe7bd"), "name" : "wangxiuli" }
(3)停止主節點
[root@node1 bin]# kill -2 1659
(4)查看從庫狀態
主節點down掉之前,從節點的狀態
replcopy:SECONDARY> rs.status()
"stateStr" : "SECONDARY",
主節點down掉之後,從節點的狀態
replcopy:SECONDARY> rs.status()
"stateStr" : "PRIMARY",
可以看出來主庫down掉之後,從庫立馬切換爲primary狀態
(5)此時將主庫(192.168.200.140)開啓mogo進程會發現已經變爲從庫
"state" : 2,
"stateStr" : "SECONDARY",
如果我們仍然想讓節點1做主庫,節點2做從庫,我們需要更改優先級。
修改節點優先級需要登錄Master節點運行。否則報錯。
replcopy:PRIMARY> cfg=rs.conf();
replcopy:PRIMARY> cfg.members[0].priority=10
replcopy:PRIMARY> cfg.members[1].priority=2
replcopy:PRIMARY> rs.reconfig(cfg);
replcopy:PRIMARY> rs.status()
此時192.168.200.140狀態:
"state" : 1,
"stateStr" : "PRIMARY",
192.168.200.144的狀態:
"state" : 2,
"stateStr" : "SECONDARY",
如果不配置仲裁節點,也可實現故障切換,只不過每一臺都可能爲主或從。而配置了仲裁節點,仲裁節點永遠只能爲從,不能爲主,只參與主庫的選舉,可作爲數據的備份。