搭建一个分布式MongoDB鉴权集群
今天休假在家,测试并搭建了一个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鉴权集群的更多相关文章
- mongodb 3.4 分片 一主 一副 一仲 鉴权集群部署.
Docker方式部署 为了避免过分冗余,并且在主节点挂了,还能顺利自动提升,所以加入仲裁节点 mongodb版本: 环境:一台虚拟机 三个configsvr 副本: 端口为 27020,27021,2 ...
- Docker mongodb 3.4 分片 一主 一副 一仲 鉴权集群部署.
非docker部署 为了避免过分冗余,并且在主节点挂了,还能顺利自动提升,所以加入仲裁节点 为什么要用docker部署,因为之前直接在虚拟机启动10个mongod 进程.多线程并发测试的时候,mong ...
- 搭建一个三台服务器的Memcached集群
关于memcached的基础知识可以查看博客其他博文,这里只记录了搭建的过程,谢谢! 1.分别在三台服务器上安装Memcached并启动 第一.由于memcached是基于libevent的事件处理, ...
- (转)MongoDB分片实战 集群搭建
环境准备 Linux环境 主机 OS 备注 192.168.32.13 CentOS6.3 64位 普通PC 192.168.71.43 CentOS6.2 64位 服务器,NUMA CPU架构 Mo ...
- mongodb 3.4 集群搭建升级版 五台集群
最新版mongodb推荐使用yaml语法来做配置,另外一些旧的配置在最新版本中已经不在生效,所以我们在生产实际搭建mongodb集群的时候做了一些改进.如果大家不熟悉什么是分片.副本集.仲裁者的话请先 ...
- mongodb 3.4 集群搭建:分片+副本集
mongodb是最常用的nodql数据库,在数据库排名中已经上升到了前六.这篇文章介绍如何搭建高可用的mongodb(分片+副本)集群. 在搭建集群之前,需要首先了解几个概念:路由,分片.副本集.配置 ...
- 分布式协调服务Zookeeper集群搭建
分布式协调服务Zookeeper集群搭建 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装jdk环境 1>.操作环境 [root@node101.yinzhengjie ...
- MongoDB高可用集群搭建(主从、分片、路由、安全验证)
目录 一.环境准备 1.部署图 2.模块介绍 3.服务器准备 二.环境变量 1.准备三台集群 2.安装解压 3.配置环境变量 三.集群搭建 1.新建配置目录 2.修改配置文件 3.分发其他节点 4.批 ...
- MongoDB 高可用集群副本集+分片搭建
MongoDB 高可用集群搭建 一.架构概况 192.168.150.129192.168.150.130192.168.150.131 参考文档:https://www.cnblogs.com/va ...
随机推荐
- 阅读javascript高级程序设计
第一章 : javascript的简介: js的组成: 1.核心(ECMA) ECMA规定了js的 1,语法 2,保留字 3,关键字, 4,对象, 5,类型 6,操作符 7,语句 2.文档对象模型(D ...
- 轻松实现Android,iOS的一个手势动画效果
先来看效果 这是iOS下的效果,android下完全一致.通过do_GestureView组件和do_Animation组件,deviceone能很容易实现复杂的跨平台纯原生动画效果,这个示例就是通过 ...
- [Machine-Learning] 熟悉 Matlab 中的 map
概述 map 的意思是映射,即将一个变量映射到另一个变量. 比如将一个字符串映射为一个数值,那个字符串就是map 的键值(key),数值就是map的数据(value). 由此可以把map理解为一个哈希 ...
- JDK动态代理的实现原理
学习JDK动态代理,从源码层次来理解其实现原理参考:http://blog.csdn.net/jiankunking/article/details/52143504
- 【Python】使用Supervisor来管理Python的进程
来源 : http://blog.csdn.net/xiaoguaihai/article/details/44750073 1.问题描述 需要一个python的服务程序在后台一直运行,不能让 ...
- Try to write a script to send e-mail but failed
#-*-coding: utf-8 -*- '''使用Python去发送邮件但是不成功,运行后,等待一段时间, 返回[Errno 10060] A connection attempt failed ...
- 【译】css动画里的steps()用法详解
原文地址:http://designmodo.com/steps-c... 原文作者:Joni Trythall 我想你在css 动画里使用steps()会和我一样有很多困惑.一开始我不清楚怎样使用它 ...
- hdu 5506 GT and set dfs+bitset优化
GT and set Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Probl ...
- XAF点滴:很具体很用实用---处理三个小问题
以下内容全部为web版本的老模板风格下完成. 一.在编辑状态的详细视图下打印报表. 有些时候,需要在编辑状态下直接打印报表内容,官方默认是不允许这样做的.用Reflector查看源码,可以看到: De ...
- java文章显示内容部分(将html转成纯文本)
public static String splitAndFilterString(String input, int length) { if (input == null || input.tri ...