六、MongoDB 副本集

1. 环境准备
1.1 副本集介绍
1.1.1 副本集是什么
– MongoDB复制是将数据同步在多个服务器的过程。
– 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。
– 复制还允许您从硬件故障和服务中断中恢复数据
1.2 复制原理
1.2.1 副本集工作过程
– mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。
– mongodb各个节点常见的搭配方式为:一主一从、一主多从。
– 主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。
1.3 副本集实现方式
1.3.1 Master-Slave 主从复制
– 实现数据同步只需要在某一台服务器启动时加上"-master"参数,以指明此服务器的角色是primary;另一台服务器加上"-slave"和"-source"参数,以指明此服务器的角色是slave。
1.3.2 主从复制的优点如下:
– 从服务器可以执行查询工作,降低主服务器访问压力。
– 在从服务器执行备份,避免备份期间锁定主服务器的数据。
– 当主服务器出现故障时,可以快速切换到从服务器,减少宕机时间。
1.3.3 Replica Sets复制集
– MongoDB 在 1.6 版本对开发了新功能replica set,这比之前的replication 功能要强大一 些,增加了故障自动切换和自动修复成员节点,各个DB 之间数据完全一致,大大降低了维 护成功。使用replica set故障切换完全自动。
– Replica Sets的结构类似一个集群,完全可以把它当成一个集群,因为它确实与集群实现的作用是一样的:如果其中一个节点出现故障,其他节点马上会将业务接管过来而无须停机操作

2. 拓扑结构

3. 配置Replica Sets 副本集
3.1 根据拓扑图搭建三台MongoDB服务器
主(db1):(192.168.4.11:27011)、从1(db2):(192.168.4.12:27012)、从2(db3):(192.168.4.13:27013)
3.1.1 搭建步骤
[root@db1 ~]# mkdir /usr/local/mongodb
[root@db1 ~]# tar -zxf soft/mongodb/mongodb-linux-x86_64-rhel70-3.6.3.tgz -C /root
[root@db1 ~]# cp -r mongodb-linux-x86_64-rhel70-3.6.3/bin /usr/local/mongodb/
[root@db1 mongodb]# mkdir etc
[root@db1 mongodb]# mkdir log
[root@db1 mongodb]# mkdir -p data/db
3.2 创建配置文件
-手动创建服务配置文件
[root@db1 mongodb]# vim /usr/local/mongodb/etc/mongodb.conf
logpath=/usr/local/mongodb/log/mongodb.log
logappend=true #追加的方式记录日志信息
dbpath=/usr/local/mongodb/data/db #数据库目录
bind_ip=192.168.4.11
port=27011
fork=true #守护进程方式运行
3.3 把mongodb文件拷贝到db2 db3
[root@db1 mongodb]# scp -r /usr/local/mongodb/ root@192.168.4.12:/usr/local/mongodb/
[root@db1 mongodb]# scp -r /usr/local/mongodb/ root@192.168.4.13:/usr/local/mongodb/
[root@db2 mongodb]# ls
bin data etc log
[root@db3 ~]# ls /usr/local/mongodb/
bin data etc log
3.4 创建软连接(个人爱好)
[root@db1 mongodb]# ln -s /usr/local/mongodb/bin/* /sbin/
[root@db2 mongodb]# ln -s /usr/local/mongodb/bin/* /sbin/
[root@db3 mongodb]# ln -s /usr/local/mongodb/bin/* /sbin/
3.4 启动服务
[root@db1 ~]# mongod -f /usr/local/mongodb/etc/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 7841
child process started successfully, parent exiting
[root@db2 mongodb]# mongod -f /usr/local/mongodb/etc/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 7664
child process started successfully, parent exiting
[root@db3 mongodb]# mongod -f /usr/local/mongodb/etc/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 7019
child process started successfully, parent exiting
3.5 查看服务信息
[root@db1 ~]# ps -C mongod
PID TTY TIME CMD
7841 ? 00:00:01 mongod
[root@db1 ~]# netstat -utnlp | grep :270
tcp 0 0 192.168.4.11:27011 0.0.0.0:* LISTEN 7841/mongod
[root@db2 mongodb]# ps -C mongod
PID TTY TIME CMD
7664 ? 00:00:00 mongod
[root@db2 mongodb]# netstat -utnlp | grep :270
tcp 0 0 192.168.4.12:27012 0.0.0.0:* LISTEN 7664/mongod
[root@db3 mongodb]# ps -C mongod
PID TTY TIME CMD
7019 ? 00:00:00 mongod
[root@db3 mongodb]# netstat -utnlp | grep :270
tcp 0 0 192.168.4.13:27013 0.0.0.0:* LISTEN 7019/mongod
3.6 停MongoDB服务,清空数据
3.6.1 停服务
[root@db1 ~]# mongod --shutdown -f /usr/local/mongodb/etc/mongodb.conf
killing process with pid: 7841
[root@db2 mongodb]# mongod --shutdown -f /usr/local/mongodb/etc/mongodb.conf
killing process with pid: 7664
[root@db3 mongodb]# mongod --shutdown -f /usr/local/mongodb/etc/mongodb.conf
killing process with pid: 7019
注:停服务也可以(pkill mongod)
3.6.2 清空数据(如果生产环境已有要先备份数据)
[root@db1 mongodb]# rm -rf /usr/local/mongodb/data/db/*
[root@db2 mongodb]# rm -rf /usr/local/mongodb/data/db/*
[root@db3 mongodb]# rm -rf /usr/local/mongodb/data/db/*
注:要保证数据的一致性
3.7 启动服务时,指定主机所在副本集名称
– 副本集成员间使用相同的副本集名称
– --replSet rs1 //指定副本集名称
3.7.1 更改配置文件【db1-db3都要更改】(要启用集群配置)如下:
logpath=/usr/local/mongodb/log/mongodb.log
logappend=true
dbpath=/usr/local/mongodb/data/db
bind_ip=192.168.4.13
port=27013
fork=true
replSet=rs1
3.7.2 启动服务(db1-db3)都要启动
[root@db1 ~]# mongod -f /usr/local/mongodb/etc/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 8529
child process started successfully, parent exiting
注:如果发现启动失败:第一步检查配置项;第二步查看数据是否一致
3.8 创建集群
3.8.1 在任意一台主机连接MongoDB服务,执行如下操作:
格式:
[root@server0 ~]# ./mongo --host 192.168.4.61
config = {
_id:"rs1",
members:[
{_id:0,host:“IP地址:端口"},
{_id:1,host:“IP地址:端口"},
{_id:2,host:“IP地址:端口"}
]
};
[root@db1 ~]# mongo --host 192.168.4.11 --port 27011
> config = {
... _id:"rs1",
... members:[
... {_id:0,host: "192.168.4.11:27011"},
... {_id:1,host: "192.168.4.12:27012"},
... {_id:2,host: "192.168.4.13:27013"}
... ]
... };
{
"_id" : "rs1",
"members" : [
{
"_id" : 0,
"host" : "192.168.4.11:27011"
},
{
"_id" : 1,
"host" : "192.168.4.12:27012"
},
{
"_id" : 2,
"host" : "192.168.4.13:27013"
}
]
}
3.8.2 初始化Replica Sets环境
执行如下命令
– >rs.initiate(config)#tab键可以补全
> rs.initiate(config)
{
"ok" : 1,
"operationTime" : Timestamp(1625732303, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1625732303, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
rs1:SECONDARY>
3.9 查看副本集状态
3.9.1 查看状态信息
rs1:SECONDARY> rs.status()
{
"set" : "rs1",
"date" : ISODate("2021-07-08T08:23:39.453Z"),
"myState" : 1,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1625732616, 1),
"t" : NumberLong(1)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1625732616, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1625732616, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1625732616, 1),
"t" : NumberLong(1)
}
},
"members" : [
{
"_id" : 0,
"name" : "192.168.4.11:27011",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 2073,
"optime" : {
"ts" : Timestamp(1625732616, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-07-08T08:23:36Z"),
"electionTime" : Timestamp(1625732314, 1),
"electionDate" : ISODate("2021-07-08T08:18:34Z"),
"configVersion" : 1,
"self" : true
},
{
"_id" : 1,
"name" : "192.168.4.12:27012",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 315,
"optime" : {
"ts" : Timestamp(1625732616, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1625732616, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-07-08T08:23:36Z"),
"optimeDurableDate" : ISODate("2021-07-08T08:23:36Z"),
"lastHeartbeat" : ISODate("2021-07-08T08:23:38.840Z"),
"lastHeartbeatRecv" : ISODate("2021-07-08T08:23:39.321Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "192.168.4.13:27013",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "192.168.4.13:27013",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 315,
"optime" : {
"ts" : Timestamp(1625732616, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1625732616, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-07-08T08:23:36Z"),
"optimeDurableDate" : ISODate("2021-07-08T08:23:36Z"),
"lastHeartbeat" : ISODate("2021-07-08T08:23:38.840Z"),
"lastHeartbeatRecv" : ISODate("2021-07-08T08:23:39.277Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "192.168.4.11:27011",
"configVersion" : 1
}
],
"ok" : 1,
"operationTime" : Timestamp(1625732616, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1625732616, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
rs1:PRIMARY>
3.9.2 查看是否为master
rs1:PRIMARY> rs.isMaster()
{
"hosts" : [
"192.168.4.11:27011",
"192.168.4.12:27012",
"192.168.4.13:27013"
],
"setName" : "rs1",
"setVersion" : 1,
"ismaster" : true,
"secondary" : false,
"primary" : "192.168.4.11:27011",
"me" : "192.168.4.11:27011",
"electionId" : ObjectId("7fffffff0000000000000001"),
"lastWrite" : {
"opTime" : {
"ts" : Timestamp(1625732686, 1),
"t" : NumberLong(1)
},
"lastWriteDate" : ISODate("2021-07-08T08:24:46Z"),
"majorityOpTime" : {
"ts" : Timestamp(1625732686, 1),
"t" : NumberLong(1)
},
"majorityWriteDate" : ISODate("2021-07-08T08:24:46Z")
},
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 100000,
"localTime" : ISODate("2021-07-08T08:24:51.662Z"),
"logicalSessionTimeoutMinutes" : 30,
"minWireVersion" : 0,
"maxWireVersion" : 6,
"readOnly" : false,
"ok" : 1,
"operationTime" : Timestamp(1625732686, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1625732686, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
rs1:PRIMARY>
3.10 验证副本集配置
3.10.1 默认从库没有任何权限如下:
[root@db2 mongodb]# mongo --host 192.168.4.12 --port 27012
rs1:SECONDARY> show dbs
2021-07-08T04:32:18.495-0400 E QUERY [thread1] Error: listDatabases failed:{
"operationTime" : Timestamp(1625733136, 1),
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotMasterNoSlaveOk",
"$clusterTime" : {
"clusterTime" : Timestamp(1625733136, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:65:1
shellHelper.show@src/mongo/shell/utils.js:816:19
shellHelper@src/mongo/shell/utils.js:706:15
@(shellhelp2):1:1
3.10.2 允许从库查看数据(在从库界面操作就可以了)
rs1:SECONDARY> db.getMongo( ).setSlaveOk( )

 

posted @ 2021-07-08 10:10  落樰兂痕  阅读(76)  评论(0编辑  收藏  举报