天天看点

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,