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()

验证故障节点恢复后,会自动从当前主节点同步增量数据

至此,mongodb 高可用集群的配置已经完成。

posted @ 2017-02-28 01:16  R.U.Ready  阅读(1077)  评论(2编辑  收藏  举报