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