MongoDB 的Replica Set集群
工作中遇到要存储非常庞大的文档型的结构化数据,于是考虑使用mongodb
,要求数据库的高可用,所以看了一下mongodb
的Replica Set
集群部署;这里简单罗列一下我在CentOS 6.5
单服务器上部署的三个节点的集群的步骤;
安装
- 下载:进入
mongodb
的官网下载页面,下载当前稳定版本:3.2.0,下载路径是: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.0.tgz - 解压:解压之后将目录命名为
mongodb-3.2.0
并移至/opt
下; - 安装配置:编辑
/etc/profile
,增加如下两行配置:
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
; 并在此目录下创建mongodb1
、mongodb2
、mongodb3
目录; - 创建
mongodb
的日志目录:/var/log/mongodb
;并在此目录下创建mongodb1
、mongodb2
、mongodb3
目录;
这里部署的三个节点的端口号为:9001
、9002
、9003
;
在 /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.conf
、mongodb.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
}
即说明部署完成!!!