今天休假在家,测试并搭建了一个replica set shard MongoDB鉴权集群。replica set shard 鉴权集群中文资料比较少,本文是个人笔记,同时也希望对后来者有所帮助。本文仅是搭建步骤和Q&A,用于实际工作中的使用查阅,阅读者需要有分布式集群的理论基础。

  关键字:Replica-Set Shard 副本 分片 鉴权 KeyFile auth

  MongoDB根据部署的不同,有两种添加鉴权的方式,分别是单实例的鉴权方式和KeyFile的鉴权方式。两种方式的共同点都是,先在没有鉴权的情况下创建超级用户,然后再以鉴权的方式重启实例。下面分别介绍这两种方式。

1 单实例的鉴权部署

  这种方式比较简单,步骤如下:

1.1 启动MongoDB

   mongod --logpath ./test.log -dbpath ./data --port 8765 --fork

1.2 添加超级用户

  use admin

  db.createUser({user:"cswuyg",pwd:"abc123",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})

1.3 以auth参数重启MongoDB

  mongod --logpath ./test.log -dbpath ./data --port 8765 --auth --fork

1.4 mongodb shell 登陆

#方式1:
mongo --port -u 'cswuyg' -p 'abc123' --authenticationDatabase 'admin'
#或者
#方式2:
mongo --port
#然后在mongo shell下执行:
use admin
db.auth('cswuyg', 'abc123')

1.5 创建普通用户

MongoDB的账号跟随DB,创建举例:

#以超级用户登陆之后,执行以下mongodb shell命令
use cswuyg
db.createUser({'user':'cswuyg', pwd:'cswuyg', roles:['readWrite', 'dbAdmin']})

2 分布式的鉴权集群部署

  我要搭建的集群含有两个shard;shard由replica set组成,replica set含有3个实例;mongodb config含有3个实例。如图所示:

下面介绍搭建步骤,两个副本中的六个mongodb实例的搭建雷同,三个配置实例的搭建也雷同,下面仅介绍不重复的内容:

2.1 安装openssl,使用openssl生成keyfile

openssl rand -base64 755 > mongodb-keyfile

2.2 搭建MongoDB副本

首先以无权限方式启动replica set,然后为replica set设置账号密码。

replica set A 需要启动三个MongoDB实例,下面的mongodb 配置文件以其中一个实例为例。

无鉴权启动配置config(set_one_mongod_17018.conf):

storage:
dbPath: "/home/ssd2/mongo_data/set_one_mongo17018"
systemLog:
destination: file
path: "/home/ssd2/mongo_data/set_one_mongo17018.log"
logAppend: true
replication:
oplogSizeMB:
replSetName: "set_one"
net:
port:
processManagement:
fork: true
setParameter:
cursorTimeoutMillis:

启动命令(start.sh):

/home/ssd2/mongo-3.2.-release/bin/mongod -f /home/ssd2/set_one_mongod_17018.conf
#/home/ssd2/mongo-3.2.-release/bin/mongod -f /home/ssd2//set_one_mongod_17018_auth.conf

以同样的方式再启动另外两个实例,然后配置副本集群:进入某个实例的mongo shell执行初始化:

rs.initiate({"_id" : "set_one", "members" : [{_id : , host: "host1:17018"}, {"_id": , "host": "host2:17018"}, {"_id": , "host" : "host3:17018"}]})

接着,mongo shell下创建超级用户:

db.createUser({user: 'cswuyg', pwd: cswuyg@home', roles:[{role:'root', db:'admin'}]})
db.createUser({user: "wuyg", pwd: "wuyg@home", roles: [{role:"userAdminAnyDatabase", db:"admin"}]})

至此 replica set A(副本A)处理完成。

再以同样的方式创建replica set B(副本B)

2.3 搭建config server

我没有使用replica set的方式搭建配置服务,所以各个单实例要独立设置账号密码。

无鉴权的启动配置config(config_27019.conf):

storage:
dbPath: "/home/work/mongo_data/config27019"
systemLog:
destination: file
path: "/home/work/mongo_data/mongo27019.log"
logAppend: true
sharding:
clusterRole: "configsvr"
net:
port:
setParameter:
cursorTimeoutMillis:
processManagement:
fork: true

启动命令(start.sh):

#/home/work/mongo/bin/mongod -f /home/work/config_27019_auth.conf
/home/work/mongo/bin/mongod -f /home/work/config_27019.conf

启动之后,创建超级用户,在mongo shell下执行:

db.createUser({user: 'cswuyg', pwd: cswuyg@home', roles:[{role:'root', db:'admin'}]})
db.createUser({user: "wuyg", pwd: "wuyg@home", roles: [{role:"userAdminAnyDatabase", db:"admin"}]})

接着以同样的方式搭建另外两个config server。

2.4 搭建mongos

无鉴权启动配置config(mongos_27032.conf):

sharding:
configDB: "host1:27019,host2:27019,host3:27019"
systemLog:
destination: file
path: "/home/work/mongo_data/mongos27032.log"
net:
port:
processManagement:
fork: true

启动命令(start.sh):

#/home/work/mongo/bin/mongod -f /home/work/config_27019_auth.conf
/home/work/mongo/bin/mongod -f /home/work/config_27019.conf

在mongos下创建超级用户,mongo shell下执行:

db.createUser({user: 'cswuyg', pwd: cswuyg@home', roles:[{role:'root', db:'admin'}]})
db.createUser({user: "wuyg", pwd: "wuyg@home", roles: [{role:"userAdminAnyDatabase", db:"admin"}]})

如有多个APP,可以继续以同样的方式创建多个mongos服务。

2.5 所有mongod、mongos都以鉴权方式重启

注:必要的时候在mongod启动时,加上numactl --interleave=all 参数

下面列举下有鉴权的mongodb副本实例、mongodb配置服务实例、mongos实例的启动配置:

副本实例配置举例:

storage:
dbPath: "/home/ssd2/mongo_data/set_one_mongo17018"
systemLog:
destination: file
path: "/home/ssd2/mongo_data/set_one_mongo17018.log"
logAppend: true
replication:
oplogSizeMB:
replSetName: "set_one"
net:
port:
security:
keyFile: "/home/ssd2/mongodb-keyfile"
authorization: "enabled"
processManagement:
fork: true
setParameter:
cursorTimeoutMillis:

config server配置举例:

storage:
dbPath: "/home/work/mongo_data/config27019"
systemLog:
destination: file
path: "/home/work/mongo_data/mongo27019.log"
logAppend: true
sharding:
clusterRole: "configsvr"
net:
port:
setParameter:
cursorTimeoutMillis:
security:
keyFile: "/home/work/mongodb-keyfile"
authorization: "enabled"
processManagement:
fork: true

mongos 配置举例:

sharding:
configDB: "host1:27019,host2:27019,host3:27019"
systemLog:
destination: file
path: "/home/work/mongo_data/mongos27032.log"
net:
port:
processManagement:
fork: true
security:
keyFile: "/home/work/mongodb-keyfile"
authorization: "enabled"

启动shell,参见上面的start.sh.

2.6 检查鉴权集群效果

#使用超级权限登陆
mongo --port -u zhangsan -p zhangsan_password #新建一个collection & 写入数据 & 设置分布式collection
use cswuyg
db.cswuyg.save({'a':'a'})
use admin
db.runCommand({"enablesharding":"cswuyg"})
db.runCommand({"shardcollection":"cswuyg.cswuyg","key":{"_id":}}) #新建用户
#使用超级用户权限登陆,然后
use cswuyg
db.createUser({'user':'zhangsan', pwd:'zhangsan_password', roles:['readWrite', 'dbAdmin']}) #测试新用户的使用:
mongo --port -u zhangsan -p zhangsan_password #测试读写
db.coll.find()
db.coll.save({'a':''})

3 Q&A

3.1 为什么副本实例、配置实例也要单独创建账号密码?

答:因为副本实例、配置实例设置的账号密码只是自己的账号密码,存储在本地,而从mongos设置的集群的账号密码存储在config server。如果直接从mongos上设置账号密码,那么副本实例、配置实例将会因为没有账号而无法做任何运维操作。

3.2 权限最大的超级用户是哪个?

答:root,创建方式:db.createUser({user: 'cswuyg', pwd: cswuyg@home', roles:[{role:'root', db:'admin'}]})

3.3 如果config server忘记单独添加权限,怎么办?

答:我们有三个config server,要逐个处理;首先停掉第一个config server,然后使用它的磁盘文件,以非鉴权方式启动,接着创建超级用户,最后再以鉴权方式重启;其它两个config server也以同样的方式逐一处理。另外,如果是 replica set 忘记单独添加权限,可以首先新加一个有单独权限的replica set,然后再把旧的replica set删除掉,在删除过程中可能需要移动DB的Primary所在:db.runCommand( { movePrimary : "monitor_check", to : "set_one" } );然后,再去掉旧的副本 db.runCommand( { removeShard : "old" } )。

4 参考资料

参考资料1,单实例鉴权:https://docs.mongodb.com/manual/tutorial/enable-authentication/

参考资料2,集群鉴权:https://docs.mongodb.com/v3.2/tutorial/enforce-keyfile-access-control-in-existing-replica-set/

搭建无鉴权的replica set shard集群参见:http://www.cnblogs.com/cswuyg/p/4356637.html

搭建一个分布式MongoDB鉴权集群的更多相关文章

  1. mongodb 3.4 分片 一主 一副 一仲 鉴权集群部署.

    Docker方式部署 为了避免过分冗余,并且在主节点挂了,还能顺利自动提升,所以加入仲裁节点 mongodb版本: 环境:一台虚拟机 三个configsvr 副本: 端口为 27020,27021,2 ...

  2. Docker mongodb 3.4 分片 一主 一副 一仲 鉴权集群部署.

    非docker部署 为了避免过分冗余,并且在主节点挂了,还能顺利自动提升,所以加入仲裁节点 为什么要用docker部署,因为之前直接在虚拟机启动10个mongod 进程.多线程并发测试的时候,mong ...

  3. 搭建一个三台服务器的Memcached集群

    关于memcached的基础知识可以查看博客其他博文,这里只记录了搭建的过程,谢谢! 1.分别在三台服务器上安装Memcached并启动 第一.由于memcached是基于libevent的事件处理, ...

  4. (转)MongoDB分片实战 集群搭建

    环境准备 Linux环境 主机 OS 备注 192.168.32.13 CentOS6.3 64位 普通PC 192.168.71.43 CentOS6.2 64位 服务器,NUMA CPU架构 Mo ...

  5. mongodb 3.4 集群搭建升级版 五台集群

    最新版mongodb推荐使用yaml语法来做配置,另外一些旧的配置在最新版本中已经不在生效,所以我们在生产实际搭建mongodb集群的时候做了一些改进.如果大家不熟悉什么是分片.副本集.仲裁者的话请先 ...

  6. mongodb 3.4 集群搭建:分片+副本集

    mongodb是最常用的nodql数据库,在数据库排名中已经上升到了前六.这篇文章介绍如何搭建高可用的mongodb(分片+副本)集群. 在搭建集群之前,需要首先了解几个概念:路由,分片.副本集.配置 ...

  7. 分布式协调服务Zookeeper集群搭建

    分布式协调服务Zookeeper集群搭建 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装jdk环境 1>.操作环境 [root@node101.yinzhengjie ...

  8. MongoDB高可用集群搭建(主从、分片、路由、安全验证)

    目录 一.环境准备 1.部署图 2.模块介绍 3.服务器准备 二.环境变量 1.准备三台集群 2.安装解压 3.配置环境变量 三.集群搭建 1.新建配置目录 2.修改配置文件 3.分发其他节点 4.批 ...

  9. MongoDB 高可用集群副本集+分片搭建

    MongoDB 高可用集群搭建 一.架构概况 192.168.150.129192.168.150.130192.168.150.131 参考文档:https://www.cnblogs.com/va ...

随机推荐

  1. 在Linux/Windows系统上编辑/etc/hosts文件

    Linux ubuntu16 open the terminal, input the command: sudo -i gedit /etc/hosts file click enter key, ...

  2. 安装软件时出现error 1337 【添加权限】

    Error 1317 An error occurred while attempting to create the directory Drive Name:\Folder Name https: ...

  3. python3 cgi传数据

    用cgi向文本或者数据库写入数据 1.开启cgi服务 python -m http.server  --cgi port[端口可选默认为8000] update.py代码 #coding:utf8im ...

  4. 如何让老Mac机支持USB安装Windows

    一些老Mac机的用户想装Windows,却发现自己的系统上的Boot Camp Assistant(以下简称BCA)没有USB安装Windows的选项. 下面以我的MacBook Pro (13-in ...

  5. Jekyll教程——精心收藏

    以前总想搭建一个自己的个人网站,由于不懂php后台,所以在点点网开过自己的博客,后来慢慢向程序员转变,点点网的博客已经不能满足这个职业特定的需求,于是用worldpress搭建了自己的第一个网站,鼓捣 ...

  6. Linux系统下配置Tomcat

    1.将下载好的tomcat文件拷贝至/usr/java文件夹中: cp apache-tomcat-7.0.72.tar.gz /usr/java 2.进入/usr/java文件夹: cd /usr/ ...

  7. php总结 --- 18. 七牛云存储

    第三方资源拉取 /** * 七牛云抓取文件 * @param string $url 文件URL地址 * * 参考地址:http://developer.qiniu.com/code/v6/api/k ...

  8. c++ is_space函数

    C库函数int isspace(int c)检查传递的字符是否是空白. 标准空白字符: ' ' (0x20) space (SPC) ' ' (0x09) horizontal tab (TAB) ' ...

  9. Could not create the view: An unexpected exception was thrown.

    今天打开Myeclipse10的时候,发现server窗口出现一堆问题,问题如标题,然后下方出现了一堆java.lang.NullPointerException的问题. java.lang.Null ...

  10. Gevent中信号量的使用

    greenlet间同步方法:信号量 1.为什么引入信号量: 2.gevent信号量有哪些: 3.编程实现. 为何引入信号量 信号量是一个允许Greenlet相互合作,限制并发访问或运行的低层次的同步原 ...