1 介绍
MongoDB Replica Set中文名为副本集,通俗地讲是集群当中包含了多份数据,保证主节点挂掉了,备节点能继续提供数据服务,提供的前提就是数据需要和主节点一致。
Mongodb(M)表示主节点,Mongodb(S)表示备节点,Mongodb(A)表示仲裁节点(Arbiter)。主备节点存储数据,仲裁节点不存储数据。客户端同时连接主节点与备节点,不连接仲裁节点。
默认设置下,主节点提供所有增删查改服务,备节点不提供任何服务。但是可以通过设置使备节点提供查询服务,这样就可以减少主节点的压力,当客户端进行数据查询时,请求自动转到备节点上。这个设置叫做Read Preference Modes,同时Java客户端提供了简单的配置方式,可以不必直接对数据库进行操作。
仲裁节点是一种特殊的节点,它本身并不存储数据,主要的作用是决定哪一个备节点在主节点挂掉之后提升为主节点,所以客户端不需要连接此节点。这里虽然只有一个备节点,但是仍然需要一个仲裁节点来提升备节点级别。我开始也不相信必须要有仲裁节点,但是自己也试过没仲裁节点的话,主节点挂了备节点还是备节点,所以咱们还是需要它的。
2 部署MongoDB Replica Set
2.1 准备工作
部署环境:
IP | 角色 | 端口 |
192.168.5.131 | PRIMARY | 27017 |
192.168.5.132 | SECONDARY | 27017 |
192.168.5.133 | SECONDARY | 27017 |
192.168.5.131 | ARBITER | 27018 |
192.168.5.132 | ARBITER | 27018 |
192.168.5.133 | ARBITER | 27018 |
创建mongo用户
[root]# useradd mongo
[root]# passwd mongo
生成keyfile,确保每个服务的keyfile一样
[root]# mkdir -p /etc/mongod
[root]# openssl rand -base64 765 > /etc/mongod/key.file
[root]# chmod 400 /etc/mongod/key.file
[root]# chown mongo:mongo /etc/mongod/key.file
2.2 编辑配置文件
编辑mongod.conf
[root]# vi /etc/mongod/mongod.conf
systemLog:
destination: file
path: "/data/mongodb/db/mongod.log"
logAppend: true
storage:
dbPath: /data/mongodb/db
wiredTiger:
engineConfig:
cacheSizeGB: 1
processManagement:
fork: true
net:
bindIpAll: true
port: 27017
#security:
# keyFile: /etc/mongod/key.file
# authorization: enabled
replication:
replSetName: replicas
oplogSizeMB: 2048
编辑arbiter.conf
[root]# vi /etc/mongod/arbiter.conf
systemLog:
destination: file
path: "/data/mongodb/arbiter/arbiter.log"
logAppend: true
storage:
dbPath: /data/mongodb/arbiter
wiredTiger:
engineConfig:
cacheSizeGB: 0.25
processManagement:
fork: true
net:
bindIpAll: true
port: 27018
#security:
# keyFile: /etc/mongod/key.file
replication:
replSetName: replicas
oplogSizeMB: 2048
2.3 安装MongoDB
下载介质并安装
[root]# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.12.tgz
[root]# tar -zxvf mongodb-linux-x86_64-rhel70-4.4.12.tgz -C /usr/local/
[root]# ln -s /usr/local/mongodb-linux-x86_64-rhel70-4.4.12 /usr/local/mongodb
[root]# chown -R mongo:mongo /usr/local/mongodb-linux-x86_64-rhel70-4.4.12.tgz
[root]# chown -R mongo:mongo /usr/local/mongodb
配置环境变量
[root]# echo "export PATH=$PATH:/usr/local/mongodb/bin" >> /etc/profile
[root]# source /etc/profile
启动服务
[root]# mongod -f /etc/mongod/mongod.conf
[root]# mongod -f /etc/mongod/arbiter.conf
2.4 配置复制集
初始化MongoDB复制集
> rs.initiate(
{
_id : "replicas",
members: [
{ _id : 0, host : "192.168.5.131:27017" },
{ _id : 1, host : "192.168.5.132:27017" },
{ _id : 2, host : "192.168.5.133:27017" },
{ _id : 3, host : "192.168.5.131:27018", arbiterOnly:true },
{ _id : 4, host : "192.168.5.132:27018", arbiterOnly:true },
{ _id : 5, host : "192.168.5.133:27018", arbiterOnly:true }
]
}
)
查看集群配置信息
replicas:SECONDARY> rs.conf()
{
"_id" : "replicas",
"version" : 1,
"term" : 1,
"protocolVersion" : NumberLong(1),
"writeConcernMajorityJournalDefault" : true,
"members" : [
{
"_id" : 0,
"host" : "192.168.5.131:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "192.168.5.132:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "192.168.5.133:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 3,
"host" : "192.168.5.131:27018",
"arbiterOnly" : true,
"buildIndexes" : true,
"hidden" : false,
"priority" : 0,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 4,
"host" : "192.168.5.132:27018",
"arbiterOnly" : true,
"buildIndexes" : true,
"hidden" : false,
"priority" : 0,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 5,
"host" : "192.168.5.133:27018",
"arbiterOnly" : true,
"buildIndexes" : true,
"hidden" : false,
"priority" : 0,
"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("62032c3f782afe1fd1364616")
}
}
3 MongoDB Replica Set测试
3.1 数据同步测试
MASTER端创建测试数据
[root]# mongo
replicas:PRIMARY> use test
replicas:PRIMARY> db.t1.insert( { name : "gaoyu" } )
SECONDARY端查看数据是否同步
[root]# mongo
replicas:SECONDARY> use test
replicas:SECONDARY> rs.secondaryOk() #开启可读
replicas:SECONDARY> show collections
t1
replicas:SECONDARY> db.t1.find()
{ "_id" : ObjectId("61e6d385c8ca480d8b12f836"), "name" : "gaoyu" }
3.2 测试MASTER自动切换
模拟故障MASTER意外宕机,然后观察MASTER是否能自动切换。
查看MASTER
replicas:SECONDARY> rs.isMaster()
4 开启认证登录
第一步:MASTER创建管理员账号,账号会自动同步到所有SECONDARY节点
> use admin
> db.createUser(
{
user:"root",
pwd:"Your_passwd",
roles:[{role:"root",db:"admin"}]
}
)
第二步:将mongod.cof arbiter.conf文件中security:的注释去掉
第三步:重启所有mongo服务