天天看點

Mongodb(三)Mongodb複制

(一)mongdb複制(副本集)

mongdb複制是将資料同步到多個伺服器的過程。

複制提供了資料的備援備份,并在伺服器上存儲資料副本,提高資料的可用性,保證資料的安全性,

複制允許你從硬體和服務的中斷中恢複資料,能随時應對資料丢失、機器損壞帶來的風險。

而且複制還能提高讀取能力,使用者讀取伺服器和寫入伺服器在不同的地方,提高整個系統的負載。

原理:而 mongodb 複制集,叢集中的任何節點都可能成為 master 節點。一旦 master 節點故障,則會在其餘節點中選舉出一個新的 master 節點。 并引導剩餘節點連接配接到新的 master 節點。這個過程對于應用是透明的。

在生産環境,複制集至少包括三個節點,其中一個必須為主節點,一個從節點,一個仲裁節點。其中每一個節點都是mongod程序對應的執行個體,節點間通過心跳檢查對方的狀态。

primary節點:負責資料庫的讀寫操作。

secondary節點:備份primary節點上的資料,可以有多個。

arbiter節點:主節點故障時,參與複制集剩下節點中選舉一個新的primary節點。

(二)、mongodb環境配置

1、主機配置

192.168.4.203 db1 ##primary節點

192.168.4.97 db2 ##secondary節點

192.168.4.200 db3 ##arbriter節點

2、安裝(略)請參考https://blog.51cto.com/liqingbiao/2401942

3.3、建立認證使用者。由于配置檔案啟用認證模式,現在需要以非認證的模式來建立使用者。

#```

#######先以非驗證模式啟動資料庫

[root@otrs ~]# /usr/local/mongodb/bin/mongod --fork --dbpath=/data/mongodb/db --logpath=/data/mongodb/mongodb.log

about to fork child process, waiting until server is ready for connections.

forked process: 28389

child process started successfully, parent exiting

[root@otrs ~]# netstat -lntp|grep mongod

tcp 0 0 127.0.0.1:27017 0.0.0.0:* listen 28389/mongod

############建立root使用者并配置管理者權限

[root@otrs ~]# mongo

mongodb shell version v4.0.9

connecting to: mongodb://127.0.0.1:27017/?gssapiservicename=mongodb

implicit session: session { "id" : uuid("4df82588-c03c-49e5-8839-92dafd7ff8ce") }

mongodb server version: 4.0.9

welcome to the mongodb shell.

for interactive help, type "help".

for more comprehensive documentation, see

http://docs.mongodb.org/

questions? try the support group

http://groups.google.com/group/mongodb-user

server has startup warnings:

2019-06-14t16:02:56.903+0800 i control [initandlisten]

2019-06-14t16:02:56.903+0800 i control [initandlisten] warning: access control is not enabled for the database.

2019-06-14t16:02:56.903+0800 i control [initandlisten] read and write access to data and configuration is unrestricted.

show dbs admin 0.000gb config 0.000gb local 0.000gb use admin switched to db admin db.createuser({ user: "root", pwd: "root", roles: [ { role: "root", db: "admin" } ] }); "user" : "root", "roles" : [ { "role" : "root", "db" : "admin" } ]

[root@otrs ~]# mongod --config /usr/local/mongodb/conf/master.conf about to fork child process, waiting until server is ready for connections. forked process: 28698 child process started successfully, parent exiting [root@otrs ~]# ps -ef|grep mongod root 28698 1 19 16:19 ? 00:00:01 mongod --config /usr/local/mongodb/conf/master.conf root 28731 28040 0 16:19 pts/0 00:00:00 grep --color=auto mongod

[root@otrs004097 opt]# mkdir /data/mongodb/standard [root@otrs004097 opt]# cat /usr/local/mongodb/conf/standard.conf bind_ip = 0.0.0.0 port = 27017 dbpath = /data/mongodb/standard logpath = /data/mongodb/mongodb.log logappend = true fork = true journal=true maxconns=1000 auth = true keyfile = /usr/local/mongodb/mongodb-keyfile storageengine=wiredtiger oplogsize=2048 replset=rs

[root@otrs004097 opt]# /usr/local/mongodb/bin/mongod --fork --config /usr/local/mongodb/conf/standard.conf [root@otrs004097 opt]# netstat -lntp|grep mongod tcp 0 0 0.0.0.0:27017 0.0.0.0:* listen 1045/mongod

[root@nginxserver01 mongodb]# cat /usr/local/mongodb/conf/arbiter.conf bind_ip = 0.0.0.0 port = 27017 dbpath = /data/mongodb/arbiter logpath = /data/mongodb/mongodb.log logappend = true fork = true journal=true maxconns=1000 auth = true keyfile = /usr/local/mongodb/mongodb-keyfile storageengine=wiredtiger oplogsize=2048 replset=rs [root@nginxserver01 mongodb]# /usr/local/mongodb/bin/mongod --config /usr/local/mongodb/conf/arbiter.conf about to fork child process, waiting until server is ready for connections. forked process: 26321 child process started successfully, parent exiting [root@nginxserver01 mongodb]# netstat -lntp|grep mongod tcp 0 0 0.0.0.0:27017 0.0.0.0:* listen 26321/mongod

[root@otrs ~]# mongo -uroot -p mongodb shell version v4.0.9 enter password: #########檢視副本集的狀态,發現并未初始化,接下來進行初始化。 rs.status() { "ok" : 0, "errmsg" : "no replset config has been received", "code" : 94, "codename" : "notyetinitialized" }

#########進行config的配置 config={"_id":"rs","members":[ {"_id":0,"host":"192.168.4.203:27017"},{"_id":1,"host":"192.168.4.97:27017"}]} { "_id" : "rs", "members" : [ { "_id" : 0, "host" : "192.168.4.203:27017" }, { "_id" : 1, "host" : "192.168.4.97:27017" } ] }

rs.initiate(config); #######初始化 { "ok" : 1 }

6.2、檢視副本集的狀态

6.3、由初始化結果檢視,兩個都是secondary節點,由于資料庫同步沒有完成,等同步完成的時候會變成primary節點。等兩分鐘再次檢視下

6.4、在secondary伺服器上檢視同步日志

##########檢視複制集的狀态

rs:primary> rs.status()

"set" : "rs",

"date" : isodate("2019-06-14t09:40:04.334z"),

"mystate" : 1,

"term" : numberlong(1),

"syncingto" : "",

"syncsourcehost" : "",

"syncsourceid" : -1,

"heartbeatintervalmillis" : numberlong(2000),

"optimes" : {

"lastcommittedoptime" : {

"ts" : timestamp(1560505197, 1),

"t" : numberlong(1)

},

"readconcernmajorityoptime" : {

"appliedoptime" : {

"durableoptime" : {

"laststablecheckpointtimestamp" : timestamp(1560505167, 1),

"members" : [

"_id" : 0,

"name" : "192.168.4.203:27017",

"health" : 1,

"state" : 1,

"statestr" : "primary",

"uptime" : 4850,

"optime" : {

"optimedate" : isodate("2019-06-14t09:39:57z"),

"infomessage" : "",

"electiontime" : timestamp(1560502885, 1),

"electiondate" : isodate("2019-06-14t09:01:25z"),

"configversion" : 2,

"self" : true,

"lastheartbeatmessage" : ""

"_id" : 1,

"name" : "192.168.4.97:27017",

"state" : 2,

"statestr" : "secondary",

"uptime" : 2330,

"optimedurable" : {

"optimedurabledate" : isodate("2019-06-14t09:39:57z"),

"lastheartbeat" : isodate("2019-06-14t09:40:02.717z"),

"lastheartbeatrecv" : isodate("2019-06-14t09:40:02.767z"),

"pingms" : numberlong(0),

"lastheartbeatmessage" : "",

"syncingto" : "192.168.4.203:27017",

"syncsourcehost" : "192.168.4.203:27017",

"syncsourceid" : 0,

"configversion" : 2

"_id" : 2,

"name" : "192.168.4.45:27017",

"state" : 7,

"statestr" : "arbiter",

"uptime" : 11,

"lastheartbeat" : isodate("2019-06-14t09:40:02.594z"),

"lastheartbeatrecv" : isodate("2019-06-14t09:40:04.186z"),

],

"ok" : 1,

"operationtime" : timestamp(1560505197, 1),

"$clustertime" : {

"clustertime" : timestamp(1560505197, 1),

"signature" : {

"hash" : bindata(0,"ff00ryxuvxdpc5nzfqyxgzilnbc="),

"keyid" : numberlong("6702308864978583553")

7、檢視primary節點、secondary節點、arbriter節點的資料的變化

7.1、主節點parimary操作,建立表并插入資料。

8.rs:primary> use lqb

switched to db lqb

rs:primary> db.object.×××ert([{"language":"c"},{"language":"c++"}])

bulkwriteresult({

"writeerrors" : [ ],

"writeconcernerrors" : [ ],

"ninserted" : 2,

"nupserted" : 0,

"nmatched" : 0,

"nmodified" : 0,

"nremoved" : 0,

"upserted" : [ ]

})

rs:primary> db.object.find()

{ "_id" : objectid("5d0370424e7535b767bb7098"), "language" : "c" }

{ "_id" : objectid("5d0370424e7535b767bb7099"), "language" : "c++" }

7.2、從節點操作。檢視有資料同步到

rs:secondary> use lqb;

rs:secondary> rs.slaveok();

rs:secondary> db.object.find()

7.3、仲裁節點aribriter。仲裁節點不會存儲資料

rs:arbiter> use lqb;

rs:arbiter> show tables

warning: unable to run listcollections, attempting to approximate collection names by parsing connectionstatus

rs:arbiter> db.object.find()

error: error: {

"ok" : 0,

"errmsg" : "not authorized on lqb to execute command { find: \"object\", filter: {}, lsid: { id: uuid(\"d2d7e624-8f30-468a-a3b0-79728b0cabbd\") }, $readpreference: { mode: \"secondarypreferred\" }, $db: \"lqb\" }",

"code" : 13,