MongoDB 的Replica Set集群

工作中遇到要存储非常庞大的文档型的结构化数据,于是考虑使用mongodb,要求数据库的高可用,所以看了一下mongodbReplica Set集群部署;这里简单罗列一下我在CentOS 6.5单服务器上部署的三个节点的集群的步骤;

安装
export MONGODB_HOME=/opt/mongodb-3.2.0  
export PATH=$MONGODB_HOME/bin:$MONGODB_HOME  

然后通过source命令使得刚才的配置在当前shell中生效;

source /etc/profile  

运行mongo

mongo --version  
MongoDB shell version: 3.2.0  

即说明mongodb安装完成;

准备集群环境
  • 创建mongodb的配置文件目录:/etc/mongodb
  • 生成KEY文件,并修改KEY文件的权限,此文件是集群节点之间认证的凭证;
openssl rand -base64 741 > /etc/mongodb/key  
chmod 600 /etc/mongodb/key  
  • 创建mongodb的数据目录:/var/data/mongodb; 并在此目录下创建mongodb1mongodb2mongodb3目录;
  • 创建mongodb的日志目录:/var/log/mongodb;并在此目录下创建mongodb1mongodb2mongodb3目录;

这里部署的三个节点的端口号为:900190029003

/etc/mongodb/ 目录下,创建第一个节点的配置文件:mongodb.9001.conf,内容为:

processManagement:  
   fork: true
net:  
   bindIp: 127.0.0.1
   port: 9001
storage:  
   dbPath: /var/data/mongodb/mongodb1
systemLog:  
   destination: file
   path: "/var/log/mongodb/mongod1.log"
   logAppend: true
storage:  
   journal:
      enabled: true
replication:  
   oplogSizeMB: 64
   replSetName: "cluster_demo"
   secondaryIndexPrefetch: "all"
security:  
   keyFile: "/etc/mongodb/key"
   clusterAuthMode: "keyFile"
   authorization: "enabled"
   javascriptEnabled: true

注意security.keyFile指向的是刚刚生成的key文件;

然后将mongodb.9001.conf文件复制两份并分别命名为mongodb.9002.confmongodb.9003.conf,并对应修改文件里的net.port对应的端口,storage.dbPath对应的数据目录,systemLog.path对应的日志目录;

注意replication.replSetName 配置的是集群的名字;

启动节点

按三个配置文件分别启动节点:

mongod -f mongodb.9001.conf  
mongod -f mongodb.9002.conf  
mongod -f mongodb.9003.conf  

三个节点即启动完成;

开始配置集群

使用mongo登录到其中一个节点上:

mongo 127.0.0.1:9001  

声明一个集群配置的变量

config =  
{
    "_id": "cluster_demo",
    "members": [
        {
            "_id": 1,
            "host": "127.0.0.1:9001",
        },
        {
            "_id": 2,
            "host": "127.0.0.1:9002",
        },
        {
            "_id": 3,
            "host": "127.0.0.1:9003",
        }
    ]
}

注意这里的config._id是上面配置的集群的名字;

然后做集群初始化:

rs.initiate(c)  
{ "ok" : 1 }

回车一下,即看到当前节点的状况:

cluster_demo:PRIMARY>  
增加账户

创建管理员账户

cluster_demo:PRIMARY> use admin  
cluster_demo:PRIMARY> db.createUser(u)  
Successfully added user: {  
  "user" : "admin",
  "roles" : [
    {
      "role" : "root",
      "db" : "admin"
    }
  ]
}

创建数据库的dbOwner账户;

cluster_demo:PRIMARY> use mydb  
switched to db mydb  
cluster_demo:PRIMARY> u =  
{
      user: "mydbo",
      pwd: "mypwd",
      roles: [
         { role: "dbOwner", db: "mydb" }
      ]
}
cluster_demo:PRIMARY> db.createUser(u)  
Successfully added user: {  
  "user" : "mydbo",
  "roles" : [
    {
      "role" : "dbOwner",
      "db" : "mydb"
    }
  ]
}

查看集群状态

cluster_demo:PRIMARY> rs.status()  
{
  "set" : "cluster_demo",
  "date" : ISODate("2015-12-14T06:54:05.941Z"),
  "myState" : 1,
  "term" : NumberLong(1),
  "heartbeatIntervalMillis" : NumberLong(2000),
  "members" : [
    {
      "_id" : 1,
      "name" : "127.0.0.1:9001",
      "health" : 1,
      "state" : 1,
      "stateStr" : "PRIMARY",
    ……
    ……
    ……
      }
  ],
  "ok" : 1
}

即说明部署完成!!!