MongoDB【第二篇】集群搭建
第一步:准备
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":0,"host":" 192.168.6.128:27017"}, ... {"_id":1,"host":" 192.168.6.129:27017"}, ... {"_id":2,"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" : 1, "term" : NumberLong(1), "heartbeatIntervalMillis" : NumberLong(2000), "optimes" : { "lastCommittedOpTime" : { "ts" : Timestamp(1488189735, 1), "t" : NumberLong(1) }, "appliedOpTime" : { "ts" : Timestamp(1488189735, 1), "t" : NumberLong(1) }, "durableOpTime" : { "ts" : Timestamp(1488189735, 1), "t" : NumberLong(1) } }, "members" : [ { "_id" : 0, "name" : "192.168.6.128:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 3107, "optime" : { "ts" : Timestamp(1488189735, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2017-02-27T10:02:15Z"), "electionTime" : Timestamp(1488189594, 1), "electionDate" : ISODate("2017-02-27T09:59:54Z"), "configVersion" : 1, "self" : true }, { "_id" : 1, "name" : "192.168.6.129:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 153, "optime" : { "ts" : Timestamp(1488189735, 1), "t" : NumberLong(1) }, "optimeDurable" : { "ts" : Timestamp(1488189735, 1), "t" : NumberLong(1) }, "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(0), "syncingTo" : "192.168.6.128:27017", "configVersion" : 1 }, { "_id" : 2, "name" : "192.168.6.130:27017", "health" : 1, "state" : 7, "stateStr" : "ARBITER", "uptime" : 153, "lastHeartbeat" : ISODate("2017-02-27T10:02:16.808Z"), "lastHeartbeatRecv" : ISODate("2017-02-27T10:02:15.766Z"), "pingMs" : NumberLong(0), "configVersion" : 1 } ], "ok" : 1 }
关注 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 -2 <pid>
注意:必须使用 kill -2 命令杀死 mongod 进程,否则会导致数据文件异常,致使 mongod 无法再次正常启动。
4)生成集群内部认证key
# openssl rand -base64 755 > keyfile # chmod 400 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()
验证故障节点恢复后,会自动从当前主节点同步增量数据