因业务需要,需要在centos安装一个mongodb集群做测试,折腾了一天,把坑都记下来,免得忘了。 mongodb集群搭建有三种方式:Replica Set / Sharding / Master-Slaver。本文使用Replica Set 方式。 Replica Set 就是集群当中包含了多份数据,保证主节点挂掉了,备节点能继续提供数据服务, 提供的前提就是数据需要和主节点一致,结构图如下:
Mongodb(M)表示主节点,Mongodb(S)表示备节点,Mongodb(A)表示仲裁节点。主备节点存储数据,仲裁节点不存储数据。 客户端同时连接主节点与备节点,不连接仲裁节点。
默认设置下,主节点提供所有增删查改服务,备节点不提供任何服务。但是可以通过设置使备节点提供查询服务, 这样就可以减少主节点的压力,当客户端进行数据查询时,请求自动转到备节点上。这个设置叫做Read Preference Modes, 同时Java客户端提供了简单的配置方式,可以不必直接对数据库进行操作。
仲裁节点是一种特殊的节点,它本身并不存储数据,主要的作用是决定哪一个备节点在主节点挂掉之后提升为主节点, 所以客户端不需要连接此节点。这里虽然只有一个备节点,但是仍然需要一个仲裁节点来提升备节点级别。 本问就是用这种方式搭建mongodb集群
准备三台机器:
oss2:主节点 oss1:备节点 dataengine1:仲裁节点
解压安装
将安装包拷贝到三台机器的/opt/目录下 安装目录为:/opt/mongodb-3.2.4/ 准备工作目录,主要用于存放mongodb工作的数据文件,日志,进程文件 新建目录/opt/mongo/ 并且在mongo下新建一个db目录,用于存放数据文件
###配置文件 新建配置文件/opt/mongodb-3.2.4/mongdb.conf,三台机器上配置文件确保一致:
#数据库文件所在位置(默认)
dbpath=/opt/mongo/db
#日志所在位置(默认)
logpath=/opt/mongo/mongod.log
#pid所在位置(默认)
pidfilepath = /opt/mongo/mongod.pid
#keyFile所在位置,生成方式在后面(添加)
keyFile=/opt/mongo/key
#启用授权
auth=true
#端口(默认)
port=27017
#每次启动后日志追加在后面,不会新建日志文件(默认)
logappend=true
#用deamon方式启动(添加)
fork=true
#打开操作日志,用于故障恢复和持久化(默认)
journal=true
#replica set的名字(添加)
replSet=test-set
KeyFile的设置
KeyFile是机器间用来进行权限认证的,如果没有设置KeyFile,在rs.initiate()的时候,会提示有其他机器没有ready. 创建Key File用下面的语句:
openssl rand -base64 755
如果有权限的问题,可以先创建一个文件:key,然后将上述命令的执行结果的一长串粘贴到key文件中。
注意mongod.conf配置文件中keyFile的路径要配置正确。
启动mongod
三台机器上分别执行下面命令启动mongodb sudo numactl –interleave=all /opt/mongodb-3.2.4/bin/mongod -f /opt/mongodb-3.2.4/mongod.conf
配置replica set节点
使用mongo命令行登录一台服务器输入下面命令
[ops@oss2 bin]$ ./mongo
MongoDB shell version: 3.2.4
connecting to: test
> config = {_id:"dataengine-adod",members:[{_id:0,host:'192.168.10.201:27017',priority :2},{_id:1,host:'192.168.10.200:27017',priority:1},{_id:2,host:'192.168.10.210:27017',priority:1}]}
{
"_id" : "dataengine-adod",
"members" : [
{
"_id" : 0,
"host" : "192.168.10.201:27017",
"priority" : 2
},
{
"_id" : 1,
"host" : "192.168.10.200:27017",
"priority" : 1
},
{
"_id" : 2,
"host" : "192.168.10.210:27017",
"priority" : 1
}
]
}
> rs.initiate(config);
{ "ok" : 1 }
查看节点状态
dataengine-adod:OTHER> rs.status();
{
"set" : "dataengine-adod",
"date" : ISODate("2016-06-23T09:22:20.239Z"),
"myState" : 1,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"members" : [
{
"_id" : 0,
"name" : "192.168.10.201:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 561,
"optime" : {
"ts" : Timestamp(1466673510, 2),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2016-06-23T09:18:30Z"),
"electionTime" : Timestamp(1466673510, 1),
"electionDate" : ISODate("2016-06-23T09:18:30Z"),
"configVersion" : 1,
"self" : true
},
{
"_id" : 1,
"name" : "192.168.10.200:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 241,
"optime" : {
"ts" : Timestamp(1466673510, 2),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2016-06-23T09:18:30Z"),
"lastHeartbeat" : ISODate("2016-06-23T09:22:18.437Z"),
"lastHeartbeatRecv" : ISODate("2016-06-23T09:22:19.397Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "192.168.10.201:27017",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "192.168.10.210:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 241,
"optime" : {
"ts" : Timestamp(1466673510, 2),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2016-06-23T09:18:30Z"),
"lastHeartbeat" : ISODate("2016-06-23T09:22:18.437Z"),
"lastHeartbeatRecv" : ISODate("2016-06-23T09:22:19.389Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "192.168.10.201:27017",
"configVersion" : 1
}
],
"ok" : 1
}
dataengine-adod:PRIMARY>
用户管理
-
切换到admin张华:
use admin
-
创建超级用户:
db.createUser({user:"superadmin",pwd:"superadminpwd",roles: [ "clusterAdmin","userAdminAnyDatabase","dbAdminAnyDatabase","readWriteAnyDatabase"]}) 创建成功会返回: Successfully added user: { "user" : "superadmin", "roles" : [ "clusterAdmin", "userAdminAnyDatabase", "dbAdminAnyDatabase", "readWriteAnyDatabase" ] }
-
创建应用用户
use myapp db.createUser( { user: "appuser", pwd: "password", roles: [ { role: "readWrite", db: "myapp" } ] } )
操作过程中如果提示没有权限操作,比如下面这类错误:
Error: couldn't add user: not authorized on adod to execute command
检查配置文件mongod.conf中是否配置了auth=ture,如果没有配置,则进行配置,并且重启mongodb
启动mongodb的时候注意,不要使用kill -9 去删除进程重启。而要用 kill -2 或者 db.shutdownServer(); 此时权限缺少的时候使用db.shutdownServer()也是无法关闭服务器的,所以基本上就只能使用kill来删进程,记得不要 -9即可。