第一步:准备
1.安装包
mongodb-linux-x86_64-rhel70-3.4.2.tgz
2. 架构:
本文为 1-primary、1-secondary、1-arbiter 的 mongoDB 集群:
名称 | IP | 端口 |
mongodb | 192.168.6.128 | 27017 |
mongodb | 192.168.6.129 | 27017 |
mongodb | 192.168.6.130 | 27017 |
3. 安装 MongoDB
根据架构信息,参照 MongoDB【第一篇】安装 来安装架构中的实例。
第二步:配置集群
1. 登录至任意主机,执行 mongodb/bin/mongo,进入 mongo shell 客户端
# cd mongodb/bin
# ./mongo
2. 在 mongo shell中,定义集群配置对象
> config = {
... "_id" : "rs1",
... "members" : [
... {"_id":,"host":" 192.168.6.128:27017"},
... {"_id":,"host":" 192.168.6.129:27017"},
... {"_id":,"host":" 192.168.6.130:27017", "arbiterOnly":true}
... ]
...}
其中,"_id" : "rs1"应与配置文件中配置的 replicaction.replSetName 一致,"members" 中的 "host" 为三个节点的 ip 和 port,第三个节点的 "arbiterOnly":true 代表其为仲裁节点。
3. 初始化集群配置
在mongo shell中执行
> rs.initiate(config)
返回信息:
4. 查看集群状态
在mongo shell中执行
> rs.status()
返回信息:
{
"set" : "rs1",
"date" : ISODate("2017-02-27T10:02:17.320Z"),
"myState" : ,
"term" : NumberLong(),
"heartbeatIntervalMillis" : NumberLong(),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(, ),
"t" : NumberLong()
},
"appliedOpTime" : {
"ts" : Timestamp(, ),
"t" : NumberLong()
},
"durableOpTime" : {
"ts" : Timestamp(, ),
"t" : NumberLong()
}
},
"members" : [
{
"_id" : ,
"name" : "192.168.6.128:27017",
"health" : ,
"state" : ,
"stateStr" : "PRIMARY",
"uptime" : ,
"optime" : {
"ts" : Timestamp(, ),
"t" : NumberLong()
},
"optimeDate" : ISODate("2017-02-27T10:02:15Z"),
"electionTime" : Timestamp(, ),
"electionDate" : ISODate("2017-02-27T09:59:54Z"),
"configVersion" : ,
"self" : true
},
{
"_id" : ,
"name" : "192.168.6.129:27017",
"health" : ,
"state" : ,
"stateStr" : "SECONDARY",
"uptime" : ,
"optime" : {
"ts" : Timestamp(, ),
"t" : NumberLong()
},
"optimeDurable" : {
"ts" : Timestamp(, ),
"t" : NumberLong()
},
"optimeDate" : ISODate("2017-02-27T10:02:15Z"),
"optimeDurableDate" : ISODate("2017-02-27T10:02:15Z"),
"lastHeartbeat" : ISODate("2017-02-27T10:02:16.990Z"),
"lastHeartbeatRecv" : ISODate("2017-02-27T10:02:15.681Z"),
"pingMs" : NumberLong(),
"syncingTo" : "192.168.6.128:27017",
"configVersion" :
},
{
"_id" : ,
"name" : "192.168.6.130:27017",
"health" : ,
"state" : ,
"stateStr" : "ARBITER",
"uptime" : ,
"lastHeartbeat" : ISODate("2017-02-27T10:02:16.808Z"),
"lastHeartbeatRecv" : ISODate("2017-02-27T10:02:15.766Z"),
"pingMs" : NumberLong(),
"configVersion" :
}
],
"ok" :
}
关注 stateStr 字段,如集群配置正确,3个节点应有一个 PRIMARY,一个 SECONDARY,一个 ARBITER 。
如果stateStr字段显示为 STARTUP 或 RECOVERING,说明集群状态还在同步中,稍等几秒后再次运行 rs.status() 即可。
5. 配置集群安全认证
1)使用 mongo shell 连接到 PRIMARY 库
2)创建admin权限用户
> use admin
> db.createUser({
... user:"username",
... pwd:"password",
... roles:[
... {role:"clusterAdmin", db:"admin"},
... {role:"dbAdminAnyDatabase", db:"admin"},
... {role:"readWriteAnyDatabase", db:"admin"},
... {role:"userAdminAnyDatabase", db:"admin"}
... ]
... })
返回信息:
上面的命令创建了一个具备集群管理者权限、所有数据库dba权限、所有数据库读写权限、所有数据库用户管理权限的超级用户。
3)停止所有 mongodb 服务
# ps -ef|grep mongod |grep -v grep
# kill - <pid>
注意:必须使用 kill -2 命令杀死 mongod 进程,否则会导致数据文件异常,致使 mongod 无法再次正常启动。
4)生成集群内部认证key
# openssl rand -base64 > keyfile
# chmod keyfile
将 keyfile 拷贝至三台 mongodb 主机中。
5)修改mongodb配置文件
security:
keyFile: /root/mongodb/keyfile # 此处配置key文件的绝对路径
6)依次启动3个 mongod 实例
注意:启动前注意检查 ulimit 配置
7)身份认证
使用 mongo shell 登入任意 mongod 实例
> use admin
> db.auth(“username”,”password”)
认证通过后,再次查看集群状态:
> rs.status()
应返回正确的集群状态。
如果需要创建其他用户,先使用超级用户登录,再执行 db.createUser 命令即可。
第三步:测试
1. 测试同步功能
1)由于从节点默认是不可读的,为验证数据同步,首先要将从节点设为可读:
> rs.slaveOk()
2)登录主节点,执行以下命令:
> db.test1.insert({"test" : "ok"})
返回信息:
3)登录从节点,查找数据
> db.test1.findOne();
返回信息:
说明数据同步成功。
2. 测试故障自动回复功能
1)停止当前的主节点进程,然后连接从节点,执行命令:
> rs.status();
从输出中可以看到,原来的主节点已经不可用:
同时,原来的从节点已经升级为主节点:
说明故障自动恢复成功。
2)此时在当前主节点上插入一条新数据
> db.test1.insert({"test1":"ok"});
返回信息:
3)将先前停止的节点启动,并用mongo shell连接
此时新启动的实例应为从节点,从其中查找数据:
> db.test1.find()
验证故障节点恢复后,会自动从当前主节点同步增量数据