1. 程式人生 > 其它 >使用Replica Set副本集方式搭建mongodb副本叢集

使用Replica Set副本集方式搭建mongodb副本叢集

1.Mongodb叢集搭建的三種方式

1.Replica Set(首選)【簡稱:副本集,叢集當中包含了多份資料,保證主節點掛掉了,備節點能繼續提供資料服務,提供的前提就是資料需要和主節點一致。】
2.Sharding【只有真的是大資料,Sharding才能顯現威力,畢竟備節點同步資料是需要時間的;Sharding可以將多片資料集中到路由節點上進行一些對比,然後將資料返回給客戶端,但是效率還是比較低的說。】
3.Master-Slaver【最簡單的叢集搭建,不過準確說也不能算是叢集,只能說是主備。並且官方已經不推薦這種方式】

2.Replica Set工作原理

1.Replica Set叫做副本集,叢集當中包含了多份資料,保證主節點掛掉了,備節點能繼續提供資料服務,提供的前提就是資料需要和主節點一致。
2.Mongodb(M)表示主節點,Mongodb(S)表示備節點,Mongodb(A)表示仲裁節點。主備節點儲存資料,仲裁節點不儲存資料。客戶端同時連線主節點與備節點,不連線仲裁節點。
3.預設設定下,主節點提供所有增刪查改服務,備節點不提供任何服務。但是可以通過設定使備節點提供查詢服務,這樣就可以減少主節點的壓力,當客戶端進行資料查詢時,請求自動轉到備節點上。這個設定叫做Read Preference Modes,同時Java客戶端提供了簡單的配置方式,可以不必直接對資料庫進行操作。
4.仲裁節點是一種特殊的節點,它本身並不儲存資料,主要的作用是決定哪一個備節點在主節點掛掉之後提升為主節點,所以客戶端不需要連線此節點。這裡雖然只有一個備節點,但是仍然需要一個仲裁節點來提升備節點級別。


3.安裝mongodb

tar -xf mongodb-linux-x86_64-rhel70-4.2.9.tgz 
/bin/mv mongodb-linux-x86_64-rhel70-4.2.9 /usr/local/mongodb
ln -svf /usr/local/mongodb/bin/* /usr/local/bin/

4.Replica Set搭建配置【生產環境應該主,備,仲裁節點各佔一臺主機,這裡測試環境,只在一臺機器上驗證了】

5.分別在主,備,仲裁節點建立目錄

mkdir -p /data/mongodb_test/master/data
mkdir -p /data/mongodb_test/slaver/data
mkdir -p /data/mongodb_test/arbiter/data

6.編輯配置檔案【更多引數詳細檢視官方文件】

#master.conf
dbpath=/data/mongodb_test/master/data
logpath=/data/mongodb_test/master/master.log
pidfilepath=/data/mongodb_test/master/master.pid
directoryperdb=true
logappend=true
replSet=testrs
bind_ip=0.0.0.0
port=27517
oplogSize=10000
fork=true
#slaver.conf
dbpath=/data/mongodb_test/slaver/data
logpath=/data/mongodb_test/slaver/slaver.log
pidfilepath=/data/mongodb_test/slaver/slaver.pid
directoryperdb=true
logappend=true
replSet=testrs
bind_ip=0.0.0.0
port=27617
oplogSize=10000
fork=true
#arbiter.conf
dbpath=/data/mongodb_test/arbiter/data
logpath=/data/mongodb_test/arbiter/arbiter.log
pidfilepath=/data/mongodb_test/arbiter/arbiter.pid
directoryperdb=true
logappend=true
replSet=testrs
bind_ip=0.0.0.0
port=27577
oplogSize=10000
fork=true

7.執行mongodb主,備,仲裁節點

/usr/local/mongodb/bin/mongod -f /data/mongodb_test/master/master.conf
/usr/local/mongodb/bin/mongod -f /data/mongodb_test/slaver/slaver.conf
/usr/local/mongodb/bin/mongod -f /data/mongodb_test/arbiter/arbiter.conf

8.保證各節點網路互通,配置叢集

登入master節點:mongo 127.0.0.1:27517
> use admin
> cfg={ _id:"testrs", members:[ {_id:0,host:'10.21.210.78:27517',priority:10}, {_id:1,host:'10.21.210.78:27617',priority:1},
{_id:2,host:'10.21.210.78:27717',arbiterOnly:true}] };
> rs.initiate(cfg) # 使cfg配置生效
# priority:優先順序越大,則優先分配成主節點
# 對於仲裁節點,必須要有arbiterOnly:true,不然主備模式就不能生效
登入從節點:mongo 127.0.0.1:27617
> db.getMongo().setSlaveOk() # 當要去從節點查詢資料時,直接插會報錯,需要設定從節點為只讀.注意從節點的字首現在是SECONDARY。

檢視叢集狀態:> rs.status(),重點看這些欄位

9.開啟mongodb認證配置

(1)配置主節點:
登入master節點:mongo 127.0.0.1:27517
> use admin
> db.createUser({user: "admin",pwd: "123456",roles:[{role:"userAdminAnyDatabase",db:"admin"},"readWriteAnyDatabase"]});
> db.grantRolesToUser("admin", ["clusterAdmin"]) # 需要給admin賦予叢集許可權,否則在後面執行rs.status()會出現如下報錯:
"errmsg" : "not authorized on admin to execute command { replSetGetStatus: 1.0,.....

> db.auth("admin", "123456")	# 登入資料庫
> db.system.users.find() # 檢視使用者

mongo 127.0.0.1:27517 -u admin -p 123456 --authenticationDatabase admin # 使用命令驗證登入
(2)生成mongodb_key檔案:
openssl rand -base64 21 > /data/mongodb_test/mongodb_key
chmod 600 mongodb_key
cat mongodb_key
HnYdGbfazRVLdIl2xIuaDmasYXT0
# 注意:上面的數字 21,最好是 3 的倍數,否則生成的字串可能含有非法字元,認證失敗。
(3)修改mongodb主,備,仲裁節點的配置檔案
# 增加下面兩行
......
auth=true
keyFile =/data/mongodb_test/mongodb_key
(4)重啟mongodb主,備,仲裁節點
# 關閉
kill $(pgrep -f "/usr/local/mongodb/bin/mongod -f /data/mongodb_test/slaver/slaver.conf")
kill $(pgrep -f "/usr/local/mongodb/bin/mongod -f /data/mongodb_test/arbiter/arbiter.conf")
kill $(pgrep -f "/usr/local/mongodb/bin/mongod -f /data/mongodb_test/master/master.conf")
# 啟動
/usr/local/mongodb/bin/mongod -f /data/mongodb_test/master/master.conf
/usr/local/mongodb/bin/mongod -f /data/mongodb_test/slaver/slaver.conf
/usr/local/mongodb/bin/mongod -f /data/mongodb_test/arbiter/arbiter.conf

10.測試叢集,驗證主備切換

> rs.status() 檢視主節點,27517為主節點,27617為從節點

"_id" : 1,
"name" : "10.21.210.78:27617",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",

"_id" : 1,
"name" : "10.21.210.78:27617",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",

模擬故障,kill主節點

登入其中正常的節點檢視狀態:27517為非健康狀態,27617成為新的主節點

"_id" : 0,
"name" : "10.21.210.78:27517",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,

"_id" : 1,
"name" : "10.21.210.78:27617",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 2116,

恢復故障節點後,檢視叢集狀態:27517成為主節點,27617為從節點

/usr/local/mongodb/bin/mongod -f /data/mongodb_test/slaver/slaver.conf

"_id" : 0,
"name" : "10.21.210.78:27517",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 18,

"_id" : 1,
"name" : "10.21.210.78:27617",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 15,
驗證叢集正常

11.驗證資料同步

12.實際應用程式如何連線副本叢集?

副本集連線字串格式:
mongodb://username:password@host1:port1,host2:port2[,...,hostN:portN]/database?options
# options是連線配置中的可選項,replicaSet是其中的一個子項。
示例可以寫成:mongodb://admin:[email protected]:27517,10.21.210.78:27617/DbName?replicaSet=testrs"

注意:因為仲裁節點沒有資料副本,仲裁節點也不可能會被選舉為主節點,所以連線字串資訊中不要包含仲裁節點的資訊。