使用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.仲裁節點是一種特殊的節點,它自己並不存儲數據,主要的做用是決定哪個備節點在主節點掛掉以後提高爲主節點,因此客戶端不須要鏈接此節點。這裏雖然只有一個備節點,可是仍然須要一個仲裁節點來提高備節點級別。

image-20210809100151666


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

image-20210809104435277

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(),重點看這些字段linux

image-20210809104948576

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,.....

image-20210809151253528

> 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爲從節點mongodb

"_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主節點數據庫

image-20210809105659992

登陸其中正常的節點查看狀態: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爲從節點app

/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.驗證數據同步

image-20210809152449561

image-20210809152514699

12.實際應用程序如何鏈接副本集羣?

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

注意:由於仲裁節點沒有數據副本,仲裁節點也不可能會被選舉爲主節點,因此鏈接字符串信息中不要包含仲裁節點的信息。大數據

相關文章
相關標籤/搜索