mongodb-linux-x86_64-rhel70-3.4.2.tgz
本文为 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 |
根据架构信息,参照 来安装架构中的实例。
- # cd mongodb/bin
- # ./mongo
- > 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 代表其为仲裁节点。
在 mongo shell 中执行
- > rs.initiate(config)
返回信息:
在 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() 即可。
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
注意:必须使用 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)由于从节点默认是不可读的,为验证数据同步,首先要将从节点设为可读:
- > rs.slaveOk()
2)登录主节点,执行以下命令:
- > db.test1.insert({
- "test": "ok"
- })
返回信息:
3)登录从节点,查找数据
- > db.test1.findOne();
返回信息:
说明数据同步成功。
1)停止当前的主节点进程,然后连接从节点,执行命令:
- > rs.status();
从输出中可以看到,原来的主节点已经不可用:
同时,原来的从节点已经升级为主节点:
说明故障自动恢复成功。
2)此时在当前主节点上插入一条新数据
- > db.test1.insert({
- "test1": "ok"
- });
返回信息:
3)将先前停止的节点启动,并用 mongo shell 连接
此时新启动的实例应为从节点,从其中查找数据:
- > db.test1.find()
验证故障节点恢复后,会自动从当前主节点同步增量数据
来源: http://www.cnblogs.com/RUReady/p/6475445.html