今天休假在家,测试并搭建了一个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. 前端之CSS(二)

    一.盒子模型 说到盒子模型,我们不得不提一下,W3C标准和IE浏览器是有区别的,我昨天就在写抽屉作业的时候踩过坑,建议用谷歌浏览器,并推荐一篇博文:http://www.osmn00.com/tran ...

  2. 《在纹线方向上进行平滑滤波,在纹线的垂直方向上进行锐化滤波》 --Gabor增强的具体实践

    <在纹线方向上进行平滑滤波,在纹线的垂直方向上进行锐化滤波>                                          --Gabor增强的具体实践     一.问 ...

  3. [Linux] vimdiff 快速比较和合并少量文件

    纯文本文件比较和合并工具一直是软件开发过程中比较重要的组成部分,vimdiff 能够在比较出来的多处差异之间快速定位,很容易的进行文件合并操作.在需要快速比较和合并少量文件的时候,vimdiff是很好 ...

  4. libevent源码分析:signal-test例子

    signal-test是libevent自带的一个例子,展示了libevent对于信号事件的处理方法. #include <sys/types.h> #include <event2 ...

  5. Android开发工具类

    7种无须编程的DIY开发工具 你知道几个? 现如今,各种DIY开发工具不断的出现,使得企业和个人在短短几分钟内就能完成应用的创建和发布,大大节省了在时间和资金上的投入.此外,DIY工 具的出现,也帮助 ...

  6. break continue return

    break 通常用在循环语句和开关语句中,当break语句用于do-while.for.while循环语句中时,可使程序终止循环而执行循环后面的语句, 通常break语句总是与if语句联在一起,即满足 ...

  7. uwsgi出现invalid request block size: 21573 (max 4096)...skip解决办法

    buffer-size uwsgi内部解析的数据包大小,默认4k. 如果准备接收大请求,你可以增长到64k. 允许uwsgi接收到32k,更大的会被丢弃. xweb.ini [uwsgi]socket ...

  8. 将自己库添加Cocoapods支持

    给库添加Cocoapods支持, 使这个工具使用起来更加方便, 更好的使用Cocoapods, 助力iOS程序开发, 下面进入正题, 想要实现这个过程, 绝对不虚此读. 首先写好一个要添加Cocoap ...

  9. 微信touchmove不生效

    最近在写一个微信里面滑动切换图片的功能,发现在chrome下都正常显示,可是在微信和qq浏览器里面就是不行. 经过一番排查,发现了问题: touchmove只触发了一次. 解决方案: 在touchst ...

  10. html,css命名规范 (转)

    HTML+CSS命名规范总结 1.HTML部分 1.1添加必须的utf-8的字符集,并且使用HTML5的简洁 方式: <meta charset="utf-8"> 1. ...