centos7安装mongodb_mongodb副本集

更多学习课程欢迎大家扫码关注即可学习

http://hyk.open.1000phone.com/register?kid=16914&cid=18 (二维码自动识别)


============================================================================================================
MongoDB 副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组成。类似于MySQL的MMM架构。更多关于副本集的介绍请见官网。也可以在google、baidu上查阅。
副本集中数据同步过程:
Primary节点写入数据,Secondary通过读取Primary的oplog得到复制信息,开始复制数据并且将复制信息写入到自己的oplog。如果某个操作失败,则备份节点停止从当前数据源复制数据。如果某个备份节点由于某些原因挂掉了,当重新启动后,就会自动从oplog的最后一个操作开始同步,同步完成后,将信息写入自己的oplog,由于复制操作是先复制数据,复制完成后再写入oplog,有可能相同的操作会同步两份,不过MongoDB在设计之初就考虑到这个问题,将oplog的同一个操作执行多次,与执行一次的效果是一样的。
简单的说就是:
当Primary节点完成数据操作后,Secondary会做出一系列的动作保证数据的同步:
1:检查自己local库的oplog.rs集合找出最近的时间戳。
2:检查Primary节点local库oplog.rs集合,找出大于此时间戳的记录。
3:将找到的记录插入到自己的oplog.rs集合中,并执行这些操作。
副本集的同步和主从同步一样,都是异步同步的过程,不同的是副本集有个自动故障转移的功能。其原理是:slave端从primary端获取日志,然后在自己身上完全顺序的执行日志所记录的各种操作(该日志是不记录查询操作的),这个日志就是local数据 库中的oplog.rs表,默认在64位机器上这个表是比较大的,占磁盘大小的5%,oplog.rs的大小可以在启动参数中设 定:--oplogSize 1000,单位是M。
!注意:在副本集的环境中,要是所有的Secondary都宕机了,只剩下Primary。最后Primary会变成Secondary,不能提供服务。

副本集

与主从复制所能达到的效果类似。主从复制模型中的Master相当于副本集中的“活跃”节点;Slave相当于“备份”节点,如下图:

d1d668743eb50b9ecaf989872f32a13b.png


上图1,表明A是活跃的,B、C是用于备份的;图2表示,当A出现故障,这时候集群根据权重算法推选出B为活跃数据库节点;图3表示,当A恢复故障后,它自动变为了备份节点。
副本集与主从的区别:
与主从复制不同的是,主从复制中只有一个Master,当Master节点挂掉之后,所有的Slave节点无法自动变为Master,继续提供服务。这时所有的 Slave也就会因连不上Master而无法继续备份数据,直到它再次连到Master。
而副本集中所有的节点都可以成为“活跃”节点(一开始是随机推出的),当当前的活跃节点挂掉之后,集群会立即从其它完好的备份节点中推选出一个节点作为“活跃节点”,整个副本集群不会停止备份服务。
====================================================================================================================================================客户端连接到整个副本集,不关心具体哪一台机器是否挂掉。主服务器负责整个副本集的读写,副本集定期同步数据备份,一但主节点挂掉,副本节点就会选举一个新的主服务器,这一切对于应用服务器不需要关心。我们看一下主服务器挂掉后的架构:

副本集中的副本节点在主节点挂掉后通过心跳机制检测到后,就会在集群内发起主节点的选举机制,自动选举一位新的主服务器

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

====================================================================================================================

测试环境:centos7.4,准备三台机器最少是三台机器做集群

192.168.246.139 master

192.168.246.140 slave

192.168.246.141 slave2

===================================

安装Mongoliandb数据库略,本实验采用的是tar包安装。

================================================

首先准备tar包,这里已经下载好了,采用的是mongodb-linux-x86_64-4.0.2

安装mongodb:

三台机器相同操作

(当不一致时会另做说明!)

创建工作目录:
[root@moongodb-master ~]# mkdir -p /data/application
[root@moongodb-master ~]# tar xzf mongodb-linux-x86_64-4.0.2.tgz -C /data/application/
[root@moongodb-master ~]# cd /data/application/
[root@moongodb-master application]# mv mongodb-linux-x86_64-4.0.2/ mongodb
设置环境变量:
[root@moongodb-master application]# vim /etc/profile ---添加如下:

6a330988b1523d55a076b904c094b6b1.png


[root@moongodb-master application]# source /etc/profile

d809e04b49687588303b3c7edab5e82c.png


创建数据存放目录和日志存放目录与配置文件存放目录并修改属主和属组:
[root@moongodb-master application]# mkdir /data/application/mongodb/data
[root@moongodb-master application]# mkdir /data/application/mongodb/mongolog
[root@moongodb-master application]# mkdir /data/application/mongodb/etc
[root@moongodb-master application]# useradd mongodb ----创建用户
[root@moongodb-master application]# chown -R mongodb:mongodb /data/application/mongodb/data/
[root@moongodb-master application]# chown -R mongodb:mongodb /data/application/mongodb/mongolog/
手动生成配置文件(三个配置文件只是ip地址不一样!):
[root@moongodb-master application]# cd mongodb/etc/
[root@moongodb-master etc]# cat << EOF >> mongodb.conf
# mongod.conf, Percona Server for MongoDB
# for documentation of all options, see:
# http://docs.mongo.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
dbPath: /data/application/mongodb/data
journal:
enabled: true

# Storage engine various options
# More info for wiredTiger: https://docs.mongo.com/v3.4/reference/configuration-options/#storage-wiredtiger-options
wiredTiger:
engineConfig:
cacheSizeGB: 1  #内存的70%,单位是G
# checkpointSizeMB: 1000
# statisticsLogDelaySecs: 0
# journalCompressor: snappy
# directoryForIndexes: false
# collectionConfig:
# blockCompressor: snappy
# indexConfig:
# prefixCompression: true

# Two options below can be used for wiredTiger and inMemory storage engines
#setParameter:
# wiredTigerConcurrentReadTransactions: 128
# wiredTigerConcurrentWriteTransactions: 128

# where to write logging data.
systemLog:
destination: file
logAppend: true
logRotate: rename
path: /data/application/mongodb/mongolog/mongo.log

processManagement:
fork: true
pidFilePath: /data/application/mongodb/mongo.pid

# network interfaces
net:
port: 27017  #监听端口
bindIp: 192.168.246.139
maxIncomingConnections: 100000

#security:
# authorization: enabled
# keyFile: /data/application/mongodb/mongokeyfile  #集群节点间必须使用同一个文件

#operationProfiling:

replication:
replSetName: "test"    #副本集的名称,同一内所有实例必须使用同一个名称

#sharding:

## Enterprise-Only Options:

#auditLog:

#snmp:

EOF!最后记得将带有注释的汉字删除掉设置service管理mongodb:
[root@moongodb-master etc]# cd
[root@moongodb-master ~]# vim /etc/init.d/mongod
#!bin/bash
start() {
/data/application/mongodb/bin/mongod --config /data/application/mongodb/etc/mongodb.conf
}

stop() {
/data/application/mongodb/bin/mongod --config /data/application/mongodb/etc/mongodb.conf --shutdown
}
case "$1" in
start)
start
;;

stop)
stop
;;

restart)
stop
start
;;
*)
echo
$"Usage: $0 {start|stop|restart}"
exit 1
esac
[root@moongodb-master ~]# chmod +x /etc/init.d/mongod
控制mongo:
[root@moongodb-master ~]# service mongod start ---启动


[root@moongodb-master ~]# service mongod restart
[root@moongodb-master ~]# service mongod stop

登录mongo:
[root@moongodb-master ~]# cd /data/application/mongodb/bin/
[root@moongodb-master bin]# ./mongo 192.168.246.139:27017
===============================================================配置副本集:
参考:https://www.cnblogs.com/zhoujinyi/p/3554010.html
副本集用户配置:https://www.cnblogs.com/Joans/p/7724144.html登入任意一台机器的MongoDB执行:因为是全新的副本集所以可以任意进入一台执行;要是有一台有数据,则需要在有数据上执行;要多台有数据则不能初始化。
##########################################################################3"_id": 副本集的名称"members": 副本集的服务器列表"_id": 服务器的唯一ID"host": 服务器主机"priority": 优先级,数字越大优先级越高(0-100),优先级最高的会是初始的主节点,显示为PRIMARY。如果不想让某些成员在故障切换时成为primary,则将它们的优先级设为0(为0永不会成为主节点)"arbiterOnly": 仲裁节点,只参与投票,不接收数据,也不能成为活跃节点。
配置priority案例

03d33dd1d2bed742706058a39d6909be.png


----------------------------------------------------------------------------------------------------------------
[root@moongodb-master ~]# cd /data/application/mongodb/bin/
[root@moongodb-master bin]# ./mongo 192.168.246.139:27017
MongoDB shell version v4.0.2
connecting to: mongodb://192.168.246.139:27017/test
MongoDB server version: 4.0.2
Server has startup warnings:
2018-09-18T09:47:18.644-0400 I STORAGE [initandlisten]
2018-09-18T09:47:18.644-0400 I STORAGE [initandlisten] ** WARNING: The configured WiredTiger cache size is more than 80% of available RAM.
2018-09-18T09:47:18.644-0400 I STORAGE [initandlisten] ** See http://dochub.mongodb.org/core/faq-memory-diagnostics-wt
2018-09-18T09:47:21.324-0400 I CONTROL [initandlisten]
2018-09-18T09:47:21.324-0400 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-09-18T09:47:21.324-0400 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2018-09-18T09:47:21.324-0400 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2018-09-18T09:47:21.324-0400 I CONTROL [initandlisten]
> use admin ----切换到admin库
switched to db admin
> rs.initiate({"_id":"test","members":[{"_id":0, "host":"192.168.246.139:27017"},{"_id":1, "host":"192.168.246.140:27017"},{"_id":3, "host":"192.168.246.141:27017"}]})
{
"ok" : 1,
"operationTime" : Timestamp(1537280794, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1537280794, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
test:SECONDARY>
test:SECONDARY> rs.status() -----查看副本集状态
{
"set" : "test",
"date" : ISODate("2018-09-18T14:27:00.141Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1537280808, 1),
"t" : NumberLong(1)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1537280808, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1537280808, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1537280808, 1),
"t" : NumberLong(1)
}
},
"lastStableCheckpointTimestamp" : Timestamp(1537280807, 1),
"members" : [
{
"_id" : 0,
"name" : "192.168.246.139:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY", -----主节点
"uptime" : 330,
"optime" : {
"ts" : Timestamp(1537280808, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-09-18T14:26:48Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1537280805, 1),
"electionDate" : ISODate("2018-09-18T14:26:45Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "192.168.246.140:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY", ------副本节点
"uptime" : 25,
"optime" : {
"ts" : Timestamp(1537280808, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1537280808, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-09-18T14:26:48Z"),
"optimeDurableDate" : ISODate("2018-09-18T14:26:48Z"),
"lastHeartbeat" : ISODate("2018-09-18T14:26:59.585Z"),
"lastHeartbeatRecv" : ISODate("2018-09-18T14:26:58.494Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "192.168.246.139:27017",
"syncSourceHost" : "192.168.246.139:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1
},
{
"_id" : 3,
"name" : "192.168.246.141:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY", -----副本节点
"uptime" : 25,
"optime" : {
"ts" : Timestamp(1537280808, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1537280808, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-09-18T14:26:48Z"),
"optimeDurableDate" : ISODate("2018-09-18T14:26:48Z"),
"lastHeartbeat" : ISODate("2018-09-18T14:26:59.585Z"),
"lastHeartbeatRecv" : ISODate("2018-09-18T14:26:58.493Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "192.168.246.139:27017",
"syncSourceHost" : "192.168.246.139:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1
}
],
"ok" : 1,
"operationTime" : Timestamp(1537280808, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1537280808, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
test:PRIMARY>

副本集启动成功后,139为主节点PRIMARY,140、141为副本节点SECONDARY。
以上副本集已经部署完成!
######副本集状态:"health" : 1, #代表机器正常 "stateStr" : "PRIMARY", #代表是主节点,可读写,其中有以下几下状态 1. STARTUP:刚加入到复制集中,配置还未加载 2. STARTUP2:配置已加载完,初始化; 3. RECOVERING:正在恢复,不适用读 4. ARBITER: 仲裁者 5. DOWN:节点不可到达 6. UNKNOWN:未获取其他节点状态而不知是什么状态,一般发生在只有两个成员的架构 7. REMOVED:移除复制集 8. ROLLBACK:数据回滚,在回滚结束时,转移到RECOVERING或SECONDARY状态 9. FATAL:出错。查看日志grep “replSet FATAL”找出错原因,重新做同步 10. PRIMARY:主节点 11. SECONDARY:备份节点
##############################################
二:维护操作
1.将141这台服务器从集群中删除:
rs.remove("192.168.246.141:27017")

117af350322189e3cd66a084ea804295.png


查看一下状态:
test:PRIMARY> rs.status()
{
"set" : "test",
"date" : ISODate("2018-09-18T14:46:17.466Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1537281967, 1),
"t" : NumberLong(1)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1537281967, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1537281967, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1537281967, 1),
"t" : NumberLong(1)
}
},
"lastStableCheckpointTimestamp" : Timestamp(1537281938, 1),
"members" : [
{
"_id" : 0,
"name" : "192.168.246.139:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 1487,
"optime" : {
"ts" : Timestamp(1537281967, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-09-18T14:46:07Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1537280805, 1),
"electionDate" : ISODate("2018-09-18T14:26:45Z"),
"configVersion" : 2,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "192.168.246.140:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 1182,
"optime" : {
"ts" : Timestamp(1537281967, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1537281967, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-09-18T14:46:07Z"),
"optimeDurableDate" : ISODate("2018-09-18T14:46:07Z"),
"lastHeartbeat" : ISODate("2018-09-18T14:46:16.275Z"),
"lastHeartbeatRecv" : ISODate("2018-09-18T14:46:17.293Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "192.168.246.139:27017",
"syncSourceHost" : "192.168.246.139:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 2
}
],
"ok" : 1,
"operationTime" : Timestamp(1537281967, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1537281967, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
已经将141从副本里面删除出去了。
====================================
2.添加节点到集群里面:将刚才删除的141添加到集群里面:
rs.add("192.168.246.141:27017")

c0f6cda3e9d5ad993c54415c1895de51.png

查看一下集群状态:
test:PRIMARY> rs.status()
{
"set" : "test",
"date" : ISODate("2018-09-18T14:51:22.611Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1537282277, 1),
"t" : NumberLong(1)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1537282277, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1537282277, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1537282277, 1),
"t" : NumberLong(1)
}
},
"lastStableCheckpointTimestamp" : Timestamp(1537282247, 1),
"members" : [
{
"_id" : 0,
"name" : "192.168.246.139:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 1792,
"optime" : {
"ts" : Timestamp(1537282277, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-09-18T14:51:17Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1537280805, 1),
"electionDate" : ISODate("2018-09-18T14:26:45Z"),
"configVersion" : 3,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "192.168.246.140:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 1488,
"optime" : {
"ts" : Timestamp(1537282277, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1537282277, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-09-18T14:51:17Z"),
"optimeDurableDate" : ISODate("2018-09-18T14:51:17Z"),
"lastHeartbeat" : ISODate("2018-09-18T14:51:22.087Z"),
"lastHeartbeatRecv" : ISODate("2018-09-18T14:51:21.105Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "192.168.246.139:27017",
"syncSourceHost" : "192.168.246.139:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 3
},
{
"_id" : 2,
"name" : "192.168.246.141:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 32,
"optime" : {
"ts" : Timestamp(1537282277, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1537282277, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-09-18T14:51:17Z"),
"optimeDurableDate" : ISODate("2018-09-18T14:51:17Z"),
"lastHeartbeat" : ISODate("2018-09-18T14:51:22.097Z"),
"lastHeartbeatRecv" : ISODate("2018-09-18T14:51:21.476Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "192.168.246.139:27017",
"syncSourceHost" : "192.168.246.139:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 3
}
],
"ok" : 1,
"operationTime" : Timestamp(1537282277, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1537282277, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
test:PRIMARY>
已经将141添加到集群里面了
===================================================新添加的注意如果出现这样的: "stateStr" : "UNKNOWN", #等一会就变成了 SECONDARY
============================================================三、查看复制状态
db.printSlaveReplicationInfo()

1f370615adb34e1f39cabeae8d074553.png


source:从库的ip和端口。
syncedTo:目前的同步情况,以及最后一次同步的时间。
从上面可以看出,在数据库内容不变的情况下他是不同步的,数据库变动就会马上同步。
============================================================
四、副本集的配置
rs.conf()/rs.config()
test:PRIMARY> rs.conf()
{
"_id" : "test",
"version" : 3,
"protocolVersion" : NumberLong(1),
"writeConcernMajorityJournalDefault" : true,
"members" : [
{
"_id" : 0,
"host" : "192.168.246.139:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "192.168.246.140:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "192.168.246.141:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"catchUpTimeoutMillis" : -1,
"catchUpTakeoverDelayMillis" : 30000,
"getLastErrorModes" : {
},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("5ba10b1a3dded46f0fa0d2d5")
}
}

============================================
五、操作Secondary
在副本节点测试:
默认情况下,Secondary是不提供服务的,即不能读和写。会提示:
error: { "$err" : "not master and slaveOk=false", "code" : 13435 }在特殊情况下需要读的话则需要:rs.slaveOk() ,只对当前连接有效。

83cd1967414b5fa2d1e7503d04cf2a7b.png


由于我没有在主节点添加数据所以find的时候没有查找处内容,但是没有报错。第一次是报错的!
==============================================================================测试应用:
1:测试副本集数据复制功能
在主节点Primary上面(192.168.246139:27017)上插入数据:

4f8dd8e434c96ae9383c8967107a5af7.png


在副本节点Secondary上查看是否已经同步:

5826a2764fa13f77d1e23eacc09294e9.png


数据已经同步了!
==============================================2:测试副本集故障转移功能
关闭Primary(主)节点,查看其他2个节点的情况:
在主节点查看一下状态;
test:PRIMARY> rs.status()
{
"set" : "test",
"date" : ISODate("2018-09-18T15:26:01.607Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1537284357, 1),
"t" : NumberLong(1)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1537284357, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1537284357, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1537284357, 1),
"t" : NumberLong(1)
}
},
"lastStableCheckpointTimestamp" : Timestamp(1537284347, 1),
"members" : [
{
"_id" : 0,
"name" : "192.168.246.139:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 3871,
"optime" : {
"ts" : Timestamp(1537284357, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-09-18T15:25:57Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1537280805, 1),
"electionDate" : ISODate("2018-09-18T14:26:45Z"),
"configVersion" : 3,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "192.168.246.140:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 3567,
"optime" : {
"ts" : Timestamp(1537284357, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1537284357, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-09-18T15:25:57Z"),
"optimeDurableDate" : ISODate("2018-09-18T15:25:57Z"),
"lastHeartbeat" : ISODate("2018-09-18T15:26:01.275Z"),
"lastHeartbeatRecv" : ISODate("2018-09-18T15:26:00.289Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "192.168.246.139:27017",
"syncSourceHost" : "192.168.246.139:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 3
},
{
"_id" : 2,
"name" : "192.168.246.141:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 2111,
"optime" : {
"ts" : Timestamp(1537284357, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1537284357, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-09-18T15:25:57Z"),
"optimeDurableDate" : ISODate("2018-09-18T15:25:57Z"),
"lastHeartbeat" : ISODate("2018-09-18T15:26:01.291Z"),
"lastHeartbeatRecv" : ISODate("2018-09-18T15:26:00.715Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "192.168.246.139:27017",
"syncSourceHost" : "192.168.246.139:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 3
}
],
"ok" : 1,
"operationTime" : Timestamp(1537284357, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1537284357, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
test:PRIMARY>
通过状态查看到139是主节点
关闭主节点;模仿主节点故障

在副本节点上面查看状态: 当主节点故障后(关闭后),需要3-6秒钟的时间才能完成切换
test:SECONDARY> rs.status()
{
"set" : "test",
"date" : ISODate("2018-09-18T15:35:20.422Z"),
"myState" : 2,
"term" : NumberLong(2),
"syncingTo" : "192.168.246.141:27017",
"syncSourceHost" : "192.168.246.141:27017",
"syncSourceId" : 2,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1537284918, 1),
"t" : NumberLong(2)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1537284918, 1),
"t" : NumberLong(2)
},
"appliedOpTime" : {
"ts" : Timestamp(1537284918, 1),
"t" : NumberLong(2)
},
"durableOpTime" : {
"ts" : Timestamp(1537284918, 1),
"t" : NumberLong(2)
}
},
"lastStableCheckpointTimestamp" : Timestamp(1537284888, 1),
"members" : [
{
"_id" : 0,
"name" : "192.168.246.139:27017", ---这台主节点目前处于关闭状态
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"optime" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"optimeDurable" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"optimeDurableDate" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2018-09-18T15:35:18.433Z"),
"lastHeartbeatRecv" : ISODate("2018-09-18T15:33:05.509Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "Error connecting to 192.168.246.139:27017 :: caused by :: Connection refused",
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"configVersion" : -1
},
{
"_id" : 1,
"name" : "192.168.246.140:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 4403,
"optime" : {
"ts" : Timestamp(1537284918, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2018-09-18T15:35:18Z"),
"syncingTo" : "192.168.246.141:27017",
"syncSourceHost" : "192.168.246.141:27017",
"syncSourceId" : 2,
"infoMessage" : "",
"configVersion" : 3,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 2,
"name" : "192.168.246.141:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY", -----这台141已经成为新的主节点
"uptime" : 2672,
"optime" : {
"ts" : Timestamp(1537284918, 1),
"t" : NumberLong(2)
},
"optimeDurable" : {
"ts" : Timestamp(1537284918, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2018-09-18T15:35:18Z"),
"optimeDurableDate" : ISODate("2018-09-18T15:35:18Z"),
"lastHeartbeat" : ISODate("2018-09-18T15:35:20.305Z"),
"lastHeartbeatRecv" : ISODate("2018-09-18T15:35:19.658Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1537284797, 1),
"electionDate" : ISODate("2018-09-18T15:33:17Z"),
"configVersion" : 3
}
],
"ok" : 1,
"operationTime" : Timestamp(1537284918, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1537284918, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
test:SECONDARY> 启动之前的主
[root@moongodb-master bin]# service mongod start ---将原来的主启动起来
再副本节点上面查看状态:
test:SECONDARY> rs.status()
{
"set" : "test",
"date" : ISODate("2018-09-18T15:40:45.617Z"),
"myState" : 2,
"term" : NumberLong(2),
"syncingTo" : "192.168.246.141:27017",
"syncSourceHost" : "192.168.246.141:27017",
"syncSourceId" : 2,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1537285238, 1),
"t" : NumberLong(2)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1537285238, 1),
"t" : NumberLong(2)
},
"appliedOpTime" : {
"ts" : Timestamp(1537285238, 1),
"t" : NumberLong(2)
},
"durableOpTime" : {
"ts" : Timestamp(1537285238, 1),
"t" : NumberLong(2)
}
},
"lastStableCheckpointTimestamp" : Timestamp(1537285188, 1),
"members" : [
{
"_id" : 0,
"name" : "192.168.246.139:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 64,
"optime" : {
"ts" : Timestamp(1537285238, 1),
"t" : NumberLong(2)
},
"optimeDurable" : {
"ts" : Timestamp(1537285238, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2018-09-18T15:40:38Z"),
"optimeDurableDate" : ISODate("2018-09-18T15:40:38Z"),
"lastHeartbeat" : ISODate("2018-09-18T15:40:44.804Z"),
"lastHeartbeatRecv" : ISODate("2018-09-18T15:40:43.943Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "192.168.246.141:27017",
"syncSourceHost" : "192.168.246.141:27017",
"syncSourceId" : 2,
"infoMessage" : "",
"configVersion" : 3
},
{
"_id" : 1,
"name" : "192.168.246.140:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 4728,
"optime" : {
"ts" : Timestamp(1537285238, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2018-09-18T15:40:38Z"),
"syncingTo" : "192.168.246.141:27017",
"syncSourceHost" : "192.168.246.141:27017",
"syncSourceId" : 2,
"infoMessage" : "",
"configVersion" : 3,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 2,
"name" : "192.168.246.141:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 2997,
"optime" : {
"ts" : Timestamp(1537285238, 1),
"t" : NumberLong(2)
},
"optimeDurable" : {
"ts" : Timestamp(1537285238, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2018-09-18T15:40:38Z"),
"optimeDurableDate" : ISODate("2018-09-18T15:40:38Z"),
"lastHeartbeat" : ISODate("2018-09-18T15:40:44.507Z"),
"lastHeartbeatRecv" : ISODate("2018-09-18T15:40:43.840Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1537284797, 1),
"electionDate" : ISODate("2018-09-18T15:33:17Z"),
"configVersion" : 3
}
],
"ok" : 1,
"operationTime" : Timestamp(1537285238, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1537285238, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
test:SECONDARY>
通过查看状态发现原来的主节点已经成为副本节点SECONDARY
在新主插入的数据:


切换到刚成为副本节点的服务器上面查看是否已经同步::
已经同步!
===============================================================================================配置key文件开启认证:注意:创建keyFile前,需要先停掉副本集中所有主从节点的mongod服务,然后再创建,否则有可能出现服务启动不了的情况。添加用户分配权限
在主节点上面操作:
test:PRIMARY> use admin
switched to db admin
test:PRIMARY> db.createUser({user:"admin", pwd:"admin", roles:[{role: "userAdminAnyDatabase", db:"admin" }]})
Successfully added user: {
"user" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
test:PRIMARY> exit ---退出
bye
在服务器上面操作:注意:创建keyFile前,需要先停掉副本集中所有主从节点的mongod服务,然后再创建,否则有可能出现服务启动不了的情况。
mongodb集群有自动切换主库功能,如果先关主库,主库就切换到其它上面去了,这里预防主库变更,从库关闭后再关闭主库
[root@moongodb-master bin]# openssl rand -base64 753 >mongokeyfile ---生成key文件
[root@moongodb-master bin]# mv mongokeyfile /data/application/mongodb/ ----放到自己制定的位置
[root@moongodb-master bin]# chmod 600 /data/application/mongodb/mongokeyfile
[root@moongodb-master bin]# chown -R mongodb.mongodb /data/application/mongodb/mongokeyfile
将主节点中的keyfile文件拷贝到副本集其他从节点服务器中,路径地址对应mongo.conf配置文件中的keyFile字段地址。并设置keyfile权限为600
[root@moongodb-master bin]# scp /data/application/mongodb/mongokeyfile 192.168.246.140:/data/application/mongodb/
[root@moongodb-master bin]# scp /data/application/mongodb/mongokeyfile192.168.246.141:/data/application/mongodb/
[root@moongodb-master bin]# cd ../etc
[root@moongodb-master etc]# vim mongodb.conf

d33272a64fb7ac82ef420308bef30d15.png


配置好所有节点的keyFile文件后,打开主节点的mongo.conf配置,取消注释:auth,keyFile,oplogSize;从节点取消keyFile,oplogSize的注释即可,从节点不需要启用auth,然后重新启动所有节点服务
[root@moongodb-master etc]# service mongod stop -----如果开启请先关闭
[root@moongodb-master etc]# service mongod start ---启动
===========================================================
查找用户;
在主节点上面操作:

3d8a2a3abb399c4d2f746edd52fe62d7.png

删除用户:

在主节点上面操作;

7ba3cecc5ea8c16be9d6d06a4d7427e1.png

在查找用户的时候可以先use到那个库,然后在执行查找命令,删除也一样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值