今天休假在家,测试并搭建了一个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. 阅读javascript高级程序设计

    第一章 : javascript的简介: js的组成: 1.核心(ECMA) ECMA规定了js的 1,语法 2,保留字 3,关键字, 4,对象, 5,类型 6,操作符 7,语句 2.文档对象模型(D ...

  2. 轻松实现Android,iOS的一个手势动画效果

    先来看效果 这是iOS下的效果,android下完全一致.通过do_GestureView组件和do_Animation组件,deviceone能很容易实现复杂的跨平台纯原生动画效果,这个示例就是通过 ...

  3. [Machine-Learning] 熟悉 Matlab 中的 map

    概述 map 的意思是映射,即将一个变量映射到另一个变量. 比如将一个字符串映射为一个数值,那个字符串就是map 的键值(key),数值就是map的数据(value). 由此可以把map理解为一个哈希 ...

  4. JDK动态代理的实现原理

    学习JDK动态代理,从源码层次来理解其实现原理参考:http://blog.csdn.net/jiankunking/article/details/52143504

  5. 【Python】使用Supervisor来管理Python的进程

    来源 : http://blog.csdn.net/xiaoguaihai/article/details/44750073     1.问题描述 需要一个python的服务程序在后台一直运行,不能让 ...

  6. Try to write a script to send e-mail but failed

    #-*-coding: utf-8 -*- '''使用Python去发送邮件但是不成功,运行后,等待一段时间, 返回[Errno 10060] A connection attempt failed ...

  7. 【译】css动画里的steps()用法详解

    原文地址:http://designmodo.com/steps-c... 原文作者:Joni Trythall 我想你在css 动画里使用steps()会和我一样有很多困惑.一开始我不清楚怎样使用它 ...

  8. 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 ...

  9. XAF点滴:很具体很用实用---处理三个小问题

    以下内容全部为web版本的老模板风格下完成. 一.在编辑状态的详细视图下打印报表. 有些时候,需要在编辑状态下直接打印报表内容,官方默认是不允许这样做的.用Reflector查看源码,可以看到: De ...

  10. java文章显示内容部分(将html转成纯文本)

    public static String splitAndFilterString(String input, int length) { if (input == null || input.tri ...