(一)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,