MongoDB的Replica Set以及Auth的配置
http://blog.0x01.site/2017/01/13/MongoDB%E7%9A%84Replica-Set%E4%BB%A5%E5%8F%8AAuth%E7%9A%84%E9%85%8D%E7%BD%AE/
MongoDB事件出现后,公司要给MongoDB加Auth,于是我就调研了一番。
现在MongoDB在生产中一般使用Replica Set的方式部署,如果一台宕机,另外一台Secondary会变成Master继续服务,提高可用性。
使用docker搭个集群测试,首先建个network bridge
1 |
docker network new mongo-network |
然后就是运行MongoDB的容器,集群名为test-rep
1 |
docker run --rm -it --name mongo1 --net=mongo-network mongo --replSet test-rep |
然后再运行一个连接到上述三个MongoDB的容器
1 |
docker run --rm -it --name mongo-client --net=mongo-network mongo /bin/bash |
然后在容器中执行
1 |
mongo --host mongo1 |
发现连接上了,说明MongoDB的配置没有问题,然后是配置Replica Set。Replica Set要求配置的members中不能有localhost,而我配置为mongo2,mongo3这种一直都报类似的错误,我索性找出了几个容器的IP,配置上去
1 |
docker network inspect mongo-network |
可以看到几个容器的IP

然后就可以使用IP地址配置了
1 |
config = {_id:"test-rep", version:1, members:[{_id:0, host:"172.19.0.5:27017", priority:5}, {_id:1, host:"172.19.0.3:27017", priority:2}, {_id:2, host:"172.19.0.4:27017", priority:3}]}
|
再去看mongod的log,发现集群同步成功

把mongo1停掉,mongo2会成为primary


然后按照MongoDB的文档增加用户
1 |
db.createUser( |
重启mongod的进程,增加–auth参数,表示启用权限校验
1 |
docker run --rm -it --name mongo1 --net=mongo-network mongo --replSet test-rep --auth |
发现一直报Error in heartbeat request to 172.19.0.5:27017; Unauthorized: not authorized on admin to execute command的错误,查了很久,发现Replica Set要使用keyFile的校验方式,让集群的member之间同步,也就是说,通过keyFile获得__system用户在local上的权限。local存放着Replica Set的配置和同步信息。
MongoDB官方推荐的keyFile的生产方式
1 |
openssl rand -base64 756 > <path-to-keyfile> |
先结束掉mongod的进程,因为要放入keyFile,于是我启动docker的时候,默认不启动mongod
1 |
docker run --rm -it --name mongo1 --net=mongo-network mongo /bin/bash |
容器里没有装openssl,我偷懒使用了以下命令
1 |
echo 'I8au1RERvEQkIiIB7vhTMhfceA8oH/L0mT6xxeVgaJg/mYnnZe89dGWjMrQSXI7A' > /data/key_file |
然后启动mongod进程
1 |
mongod --replSet test-rep --auth --keyFile=/data/key_file |
在mongo2,mongo3上按照上述命令,依次启动。发现漂亮的同步成功的标志

收工
生产上的MongoDB,切换到需要Auth,是否可以在不停机的状况下进行呢?
某同学猜想,mongod不采用Auth的时候,客户端使用密码,可不可以呢?Python连接MongoDB的代码很简单
pymongo.MongoClient('mongodb://user:user1@mongo1:27017,mongo2:27017,mongo3:27017/mydb?authMechanism=SCRAM-SHA-1')
访问mydb的时候,直接就抛Authentication failed错误了。如果我先添加了user呢?在mongo shell中执行
1 |
db.createUser( |
刚刚的admin,只是访问admin库的用户名和密码,可以管理用户信息,user用户可以用来读写相应的库。此时,mongod依然没有使用--auth启动,因此是没有权限检查的,再次连接,一切正常。
因此配置步骤如下
- 创建MongoDB用户
1 |
use admin |
- 修改应用,更改MongoDB的URI
1 |
pymongo.MongoClient('mongodb://user:user1@mongo1:27017,mongo2:27017,mongo3:27017/mydb?authMechanism=SCRAM-SHA-1')
|
- mongod增加keyFile
1 |
openssl rand -base64 756 > /data/key_file |
- 把key_file上传到其他mongod服务器上,修改mongod配置,一般是/etc/mongodb.conf
1 |
security: |
- 然后同时重启三台mongod
这样只有重启的那一刹那不可用
MongoDB的Replica Set以及Auth的配置的更多相关文章
- MongoDB 维护Replica Set
在每个MongoDB(版本 3.2.9) Instance中,都有一个本地数据库(local),用于存储 Replication 进程的信息和本地数据.local 数据库的特性是:位于local数据库 ...
- 部署Replica Sets及查看相关配置
MongoDB 支持在多个机器中通过异步复制达到故障转移和实现冗余.多机器中同一时刻只有一台是用于写操作.正是由于这个情况,为MongoDB 提供了数据一致性的保障.担当Primary 角色的机器能把 ...
- mongodb的学习-3-在Mac上的安装配置
1.使用homebrew安装: brew install mongodb 查看安装好的版本: mongo --version MongoDB shell version v3.6.4 git vers ...
- MongoDB之Replica Sets环境搭建
最近学习MongoDB,这两天在搭建复制集的时候碰到了不少问题,也踩了好多坑,现在在这里记录下来,以供自己和他人参考 (因为本人是初学者,所以遇到的问题也会比较初级,所以本文也比较适合初学者查阅) 背 ...
- 学习MongoDB(二) Replica Set集群配置
1.官方网址:https://docs.mongodb.org/manual/tutorial/deploy-replica-set-for-testing/ 2.Replica Set介绍: htt ...
- mongodb主从以及auth主从 配置详解
1.主服务器配置 #auth = true dbpath = /data/mongodb/db logpath = /data/mongodb/log/mongodb.log port = ...
- MongoDB搭建Replica Set Shard Cluster步骤
本文记录从头搭建一个MongoDB 副本集分片集群的过程. 我们要创建一个这样子的分布式集群:有两个shard,每个shard都是一个replica set,各有两个副本(实际产品应用中还应加上一个仅 ...
- mongodb系列之--分片的原理与配置
1.分片的原理概述 分片就是把数据分成块,再把块存储到不同的服务器上,mongodb的分片是自动分片的,当用户发送读写数据请求的时候,先经过mongos这个路由层,mongos路由层去配置服务器请求分 ...
- mongodb数据库集群及sharding分片配置
复制集群的配置 1.安装mongodb数据库 在主节点和从节点上都安装mongodb # rpm -ivh mongo-10gen-2.4.6-mongodb_1.x86_64.rpm mongo-1 ...
随机推荐
- Python全栈开发记录_第九篇(面向对象(类)的学习)
有点时间没更新博客了,今天就开始学习类了,今天主要是面向对象(类),我们知道面向对象的三大特性,那就是封装,继承和多态.内容参考该博客https://www.cnblogs.com/wupeiqi/p ...
- Tesseract-OCR的使用记录
参考: http://www.cnblogs.com/cnlian/p/5765871.html http://www.cnblogs.com/wzben/p/5930538.html 1.下载 Te ...
- 纠结了一下午的问题:运行opencv的HoughLinesP函数出错
问题描述:检测出的直线数量显然不对,非常巨大.程序运行崩溃. 解决办法:在添加附加依赖项时,Dubug模式只添加opencv_world310d.lib,Release模式下只添加opencv_wor ...
- Spring中@Value注解使用——一种新的直接读取配置文件的方式
1.@Value注解作用 该注解的作用是将我们配置文件的属性读出来,有@Value(“${}”)和@Value(“#{}”)两种方式. 2.@Value注解作用的两种方式 场景 假如有以下属性文件de ...
- 4-17疑难点 c语言之【结构体对齐】
今天学习了结构体这一章节,了解到了结构体在分配内存的时候采取的是对齐的方式 例如: #include<stdio.h> struct test1 { int a; char b; shor ...
- jsfl 进入影片 退出影片
targetMC=fl.getDocumentDOM().getTimeline().layers [0].frames[0].elements[0]; fl.getDocumentDOM().lib ...
- 1.PHP连接mysql
1.使用mysqli_connect()函数连接到MySQL数据库: mysqli_connect()函数的格式如下: mysqli_connect('MySQL服务器地址','用户名','用户密 ...
- Office免费激活方法!亲测有效!2019年4月3日测试
内容转载自:https://blog.csdn.net/qq_41785863/article/details/83619401 防止原博主删除,我先放上自己下载好了的工具分享链接. 链接:https ...
- netfilter的笔记3--那些内置的表
通过netfilter的笔记2的例子,我们知道了怎么使用netfilter的框架,对于内核的设计原则来说,策略和机制分离,所以提供了iptables来供用户配置防火墙策略. 那么,怎么使用iptabl ...
- 微软Microsoft SQL server 之 MDS connection问题
微软的MDS和DQS使用面大概还不太广的两个新产品,之前有说道DQS的system.web的register的问题,MDS的问题就经常会碰到链接的问题,当你的用户在Excel中经常都会发生以下问题的时 ...