mongodb集群部署

 : jank    :   : 2910    : 2017-03-22 20:52  mongo

MongDB分布式集群能够对数据进行备份,提高数据安全性,以及提高集群提高读写服务的能力和数据存储能力。主要通过副本集(replica)对数据进行备份。

一、安装mongodb

在事先准备好的A,B两台服务器上分别安装mongodb,安装完

在A服务器上创建配置文件mongodb_master.conf里面包括如下配置信息

#master

dbpath=data/master

logpath=log/mongodb_master.log

pidfilepath=master.pid

#keyFile=keyfile

#directoryperdb=true

logappend=true

replSet=buka

bind_ip=0.0.0.0

port=27017

#auth=true

oplogSize=100

fork=true

noprealloc=true

#maxConns=4000

B服务器同时部署mongodb_slave.conf mongodb_arbiter.conf

#slave

dbpath=data/slave

logpath=log/mongodb_slave.log

pidfilepath=slave.pid

#keyFile=keyfile

#directoryperdb=true

logappend=true

replSet=buka

bind_ip=0.0.0.0

port=27017

#auth=true

oplogSize=100

fork=true

noprealloc=true

#maxConns=4000


#arbiter

dbpath=data/arbiter

logpath=log/mongodb_arbiter.log

pidfilepath=arbiter.pid

#keyFile=keyfile

#directoryperdb=true

logappend=true

replSet=buka

bind_ip=0.0.0.0

port=27017

#auth=true

oplogSize=100

fork=true

noprealloc=true

#maxConns=4000


注:部署完成前先屏蔽keyFile及auth

分别启动A、B服务器中的mongdb服务

./bin/mongod -f ./mongodb_master.conf

./bin/mongod -f ./mongodb_slave.conf

./bin/mongod -f ./mongodb_arbiter.conf


登陆客户端./bin/mongo

查看信息:rs.status()

显示

{
"ok" : 0,
"errmsg" : "not authorized on admin to execute command { replSetGetStatus: 1.0 }",
"code" : 13,
"codeName" : "Unauthorized"
}

说明还没有配置集群。

输入:

cfg={ _id:"bukadb", members:
[ 
{_id:0,host:'A服务器:27017',priority:2},
{_id:1,host:'B服务器:27017',priority:1},
{_id:2,host:'B服务器:27018',arbiterOnly:true}
] };
rs.initiate(cfg)

cfg名字可选,只要跟mongodb参数不冲突,_id为Replica Set名字,members里面的优先级priority值高的为主节点,对于仲裁点一定要加上arbiterOnly:true,否则主备模式不生效

查看是否生效:rs.status()

结果显示信息,stateStr字段为主备仲裁节点的标志,下面会显示字样:"ok" : 1


接下来配置keyFile副本集认证:

副本集总体思路是用户名、密码和keyfile文件,keyfile需要各个副本集服务启动时加载而且要是同一文件,然后在操作库是需要用户名、密码

KeyFile文件必须满足条件:

(1)至少6个字符,小于1024字节

(2)认证时候不考虑文件中空白字符

(3)连接到副本集的成员和mongos进成的keyfile文件内容必须一样

(4)必须是base64编码,但是不能有等号

(5)文件权限必须是x00,也就是说,不能分配任何权限给group成员和other成员

注:win下可以通过记事本文件,输入任意内容,删除后缀名后使用,是否可行还在试验

 

以副本集sh0为例:(以下为linux系统操作,win系统出了创建keyfile文件不一样 其他相同)

1.生成keyFile文件:

在54上执行:

[root@54 ~]# openssl rand -base64 100 > /mongodb/scheme2/keyfile0 --文件内容采base64编码,一共100个字符

2.修改文件权限:

[root@54 ~]# chmod 600 /mongodb/scheme2/keyfile0

把生成的文件拷贝到副本集剩余各台机器上,存放的目录可以不一样,注意权限。

3.三台机器启动时指定--keyFile选项

numactl --interleave=all  mongod  --replSet sh0 --port 10000

--dbpath=/mongodb/scheme2/sh0/data --logpath=/mongodb/scheme2/sh0/logs/sh0.log

--logappend --fork --directoryperdb --bind_ip=127.0.0.1,192.168.69.54 --nohttpinterface

--keyFile=/mongodb/scheme2/keyfile0

这样,没有这个文件的机器就无法加入副本集,Sh1和sh2副本集的操作类似。

开启了keyFile,隐含就开启了auth,这个时候连接副本集就需要进行认证了,否则只能通过本地例外方式操作数据库。

在副本集中添加用户需要在服务未加--keyFile参数启动的情况加按照单实例方法添加(访问任意一个副本器操作,其他副本集会自动同步),账户添加、授权成功后重新加入keyFile启动服务,即可完成并使用。

配置auth用户,如:

use admin

db.createUser(

  {

    user: "root",

    pwd: "root",

    roles: [ { role: "root", db: "admin" } ]

  }

);


MongoDB数据库角色



内建的角色 

数据库用户角色:read、readWrite; 

数据库管理角色:dbAdmin、dbOwner、userAdmin; 

集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager; 

备份恢复角色:backup、restore; 

所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase 

超级用户角色:root // 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase) 

内部角色:__system 

角色说明: 

Read:允许用户读取指定数据库 

readWrite:允许用户读写指定数据库 

dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile 

userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户 

clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。 

readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限 

readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限 

userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限 

dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。 

root:只在admin数据库中可用。超级账号,超级权限


   

备案编号:赣ICP备15011386号

联系方式:qq:1150662577    邮箱:1150662577@qq.com