Mongodb 集群加keyFile认证
介绍
自从远古计绳结开始,数据库的存储就注定了今天的地位和多样性,Nosql的出现更是解决了现有的关系型数据库无法解决的一些难题,对高性能,灵活度,扩展性,海量数据的问题。随之而出现的高速内存索引数据库、列式存储、图像存储等等,这篇文章主要讲的是mongodb文档型数据库,mongodb目前也在各种大中小型创业型公司大受欢迎,占据了一定的地位。文章讲解的是如何搭建一个安全认证的mongodb集群(安全认证还是很重要,各大数据库被沦陷后,怎么有效预防被勒索比特币….)
mongodb集群有三种模式,主从模式,副本集模式、sharding分片模式。主从模式官网也不再推荐上生产环境,主要是安全性太低。副本集和sharding模式目前是用的最广的方案,通常这2种方案的选择通过数据量和并发数来权衡。在GB级别的基本上副本集方案可满足,TB级别或以上采用sharding模式,解决单机容量和单机并发能力。这两种既有自己的优势也有自己的缺点,比如sharding模式分片越多,性能自然下降越多。
进入正题,讲解副本集的搭建以及配置安全认证。副本集有两种方案,一种是有仲裁节点(Arbiter
),如图1,一种是不含仲裁节点,如图2所示。
图1 一主一从一仲裁
图2 多节点副本
当数据节点为偶数时候需要增加仲裁节点,故障时候仲裁新的主,当数据节点为奇数时候无需仲裁节点,根据id优先级选举新的主。仲裁节点本身不存储数据,如果配置仲裁节点使用虚拟机即可。本文为了节约机器提高数据的安全度使用的是不带仲裁节点的方案:
一、 环境:
系统:Ubuntu 16.04.02 LTS
mongodb版本:https://www.mongodb.org/dr/fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.4.2.tgz
服务器:
Mongodb 主机 |
服务器端口地址 |
默认角色 |
mongodb主机 1 |
10.10.1.163:30010 |
primary |
mongodb主机 2 |
10.10.1.109: 30010 |
secondary |
mongodb主机 3 |
10.10.1.110: 30010 |
secondary |
二、 安装mogodb
2.1 创建mongo用户
略(如果root启动,可忽略本步骤,启动用户是mongo就必须集群目录授权mongo用户)
2.2 集群目录
创建mongo集群目录,最好三台配置都一样,方便维护(以下操作三台服务器均一样);
解压二进制压缩包并复制到/usr/local目录下
tar xzf mongodb-linux-x86_64-3.4.2.tgz mv mongodb-linux-x86_64-3.4.2 mongodb-3.4.2 ln –s mongodb-3.4.2 mongodb |
创建集群目录:
mkdir –p data/mongo_set/$集群名字/30010 |
配置集群的配置文件:
# usercenter replset master bind_ip=10.10.1.163 #指定服务器监听的端口,默认是27017 port=30010 #集群名字 replSet=test_set #以守护进程的方式运行MongoDB fork=true #一个数据库一个文件夹 directoryperdb=true ##启用日志选项,MongoDB的数据操作将会写入到journal文件夹的文件里 journal = true # 在收到客户数据,检查的有效性 objcheck=true #操作日志大小限制2G oplogSize=2000 #pidfile pidfilepath=/data/mongo_set/test_set/30010/mongo_m30010.pid #指定数据目录,默认是/data/db/。每个mongod进程都需要独立的目录, #启动mongod时就会在数据目录中创建mongod.lock文件,防止其他mongod进程使用该数据目录。 dbpath=/data/mongo_set/test_set/30010 #指定日志输出路径,如果不指定则会在终端输出。每次启动都会覆盖原来的日志,如果不想覆盖就要用--logappend选项 logpath=/data/mongo_set/test_set/30010/mongo30010.log logappend=true #auth=true #0:关闭,不收集任何数据。1:收集慢查询数据,默认是100毫秒。2:收集所有数据 profile=2 slowms=100 #.禁止HTTP状态接口 nohttpinterface=true #.禁止REST接口-在生产环境下建议不要启用MongoDB的REST接口 rest=false |
2.3 三台主机分别启动mongodb
Primary启动: /usr/local/mongodb/bin/mongod –f /data/mongo_set/test_set/30010/mongodb_m30010.conf Secondary1: /usr/local/mongodb/bin/mongod –f /data/mongo_set/test_set/30010/mongodb_s30010.conf Secondary2: /usr/local/mongodb/bin/mongod –f /data/mongo_set/test_set/30010/mongodb_s30010.conf |
三、 配置副本集
3.1 配置主primary
此时我们并没有配置任何认证账户,我们登录主库:
root@xxxx:~#mongo 10.10.1.163:30010 MongoDB server version: 3.4.2 Server has startup warnings: 2017-03-10T20:08:31.847+0800 I STORAGE [initandlisten] 2017-03-10T20:08:31.847+0800 I STORAGE [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine 2017-03-10T20:08:31.847+0800 I STORAGE [initandlisten] ** See http://dochub.mongodb.org/core/prodnotes-filesystem 2017-03-10T20:08:32.115+0800 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended. 2017-03-10T20:08:32.115+0800 I CONTROL [initandlisten] 2017-03-10T20:08:32.116+0800 I CONTROL [initandlisten] 2017-03-10T20:08:32.116+0800 I CONTROL [initandlisten] ** WARNING: You are running on a NUMA machine. 2017-03-10T20:08:32.116+0800 I CONTROL [initandlisten] ** We suggest launching mongod like this to avoid performance problems: 2017-03-10T20:08:32.116+0800 I CONTROL [initandlisten] ** numactl --interleave=all mongod [other options] 2017-03-10T20:08:32.116+0800 I CONTROL [initandlisten] 2017-03-10T20:08:32.116+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. 2017-03-10T20:08:32.116+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2017-03-10T20:08:32.116+0800 I CONTROL [initandlisten] 2017-03-10T20:08:32.116+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. 2017-03-10T20:08:32.116+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2017-03-10T20:08:32.116+0800 I CONTROL [initandlisten] 2017-03-10T20:08:32.116+0800 I CONTROL [initandlisten] ** WARNING: soft rlimits too low. rlimits set to 65535 processes, 655350 files. Number of processes should be at least 327675 : 0.5 times number of files. 2017-03-10T20:08:32.116+0800 I CONTROL [initandlisten] test_set:PRIMARY> test_set:PRIMARY> use admin switched to db admin |
3.2 配置副本几点及权重
test_set:PRIMARY> config_test={_id : 'usercenter',members : [{_id : 0, host : '10.10.1.1.163:30010'},{_id : 1, host : '10.10.1.109:30010'},{_id : 2, host : '10.10.1.110:30010'}]} #初始化副本集 test_set:PRIMARY> rs.initiate(config_ test); { "ok" : 1 } |
3.3查看副本集群状态
test_set:PRIMARY> rs.status() { "set" : "test_set", "date" : ISODate("2017-03-11T08:25:02.832Z"), "myState" : 1, "term" : NumberLong(5), "heartbeatIntervalMillis" : NumberLong(2000), "optimes" : { "lastCommittedOpTime" : { "ts" : Timestamp(1489220694, 1), "t" : NumberLong(5) }, "appliedOpTime" : { "ts" : Timestamp(1489220694, 1), "t" : NumberLong(5) }, "durableOpTime" : { "ts" : Timestamp(1489220694, 1), "t" : NumberLong(5) } }, "members" : [ { "_id" : 0, "name" : "10.10.1.163:30010", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 72991, "optime" : { "ts" : Timestamp(1489220694, 1), "t" : NumberLong(5) }, "optimeDate" : ISODate("2017-03-11T08:24:54Z"), "electionTime" : Timestamp(1489147722, 1), "electionDate" : ISODate("2017-03-10T12:08:42Z"), "configVersion" : 1, "self" : true }, { "_id" : 1, "name" : "10.10.1.109:30010", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 72980, "optime" : { "ts" : Timestamp(1489220694, 1), "t" : NumberLong(5) }, "optimeDurable" : { "ts" : Timestamp(1489220694, 1), "t" : NumberLong(5) }, "optimeDate" : ISODate("2017-03-11T08:24:54Z"), "optimeDurableDate" : ISODate("2017-03-11T08:24:54Z"), "lastHeartbeat" : ISODate("2017-03-11T08:25:02.583Z"), "lastHeartbeatRecv" : ISODate("2017-03-11T08:25:01.359Z"), "pingMs" : NumberLong(0), "syncingTo" : "10.10.1.163:30010", "configVersion" : 1 }, { "_id" : 2, "name" : "10.10.1.110:30010", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 72971, "optime" : { "ts" : Timestamp(1489220694, 1), "t" : NumberLong(5) }, "optimeDurable" : { "ts" : Timestamp(1489220694, 1), "t" : NumberLong(5) }, "optimeDate" : ISODate("2017-03-11T08:24:54Z"), "optimeDurableDate" : ISODate("2017-03-11T08:24:54Z"), "lastHeartbeat" : ISODate("2017-03-11T08:25:02.442Z"), "lastHeartbeatRecv" : ISODate("2017-03-11T08:25:01.007Z"), "pingMs" : NumberLong(0), "syncingTo" : "10.10.1.163:30010", "configVersion" : 1 } ], "ok" : 1 } test_set:PRIMARY> |
3.4 查看副本同步状态
test_set:PRIMARY> db.printSlaveReplicationInfo(); source: 10.10.1.109:30010 syncedTo: Sat Mar 11 2017 16:25:24 GMT+0800 (CST) 0 secs (0 hrs) behind the primary source: 10.10.1.110:30010 syncedTo: Sat Mar 11 2017 16:25:24 GMT+0800 (CST) 0 secs (0 hrs) behind the primary |
一切ok,该副本集搭建完成。目前副本集架构如下所示:
四、 增加安全认证机制KeyFile
4.1 集群之间的安全认证
集群之间的复制增加keyFile认证
#生成key openssl rand -base64 745 > /data/mongo_set/usercenter/30010/mongodb-keyfile chmod 600 /data/mongo_set/usercenter/30010/mon-keyfile # 该key的权限必须是600 |
将该key放到集群中机器的每一台上,记住必须保持一致,权限设置成600;
4.2 修改配置
在mongodb.conf启动配置文件中增加配置项
#安全认证机制 keyFile=/data/mongo_set/test_set/30010/mon-keyfile |
4.3 主库配置用户
也可后面配置,开启keyfile认证就默认开启了auth认证了,为了保证后面可以登录,我提前创建了用户:
先创建管理员账户 db.createUser( { user:"admin", pwd:"xxxxxx", roles:[{role:"userAdminAnyDatabase",db:"admin"}] } ); db.createUser( { user: "root", pwd: "xxxxxxx", roles: [ { role: "root", db: "admin" } ] }); #认证用户 db.auth("admin","xxxxxxx") db.auth("root","xxxxxxx") |
4.4 重启进入
重新启动mongodb,记住重新启动时候,keyfile的指定如果没有在配置文件中配置,就必须启动时候使用参数keyfile指定,关闭顺序注意下,mongodb集群有自动切换主库功能,如果先关主库,主库就切换到其它上面去了,这里预防主库变更,从库关闭后再关闭主库。
mongo 10.10.1.163:30010/admin -u root –p 2017-03-10T20:08:32.116+0800 I CONTROL [initandlisten] test_set:PRIMARY> use admin switched to db admin |
重新查看从库和集群状态都是正常。
五、 创建用户和用户数据库
5.1 启动认证
开启了安全认证就可以开始对每个数据库进行安全认证了,首先给用户创建一个数据库:
test_set:PRIMARY> use user_test switched to db user_test mongodb创建数据库直接use即可,此时show dbs是看不到该库的,需要插入一条数据才会现实出来,这里不演示; |
创建用户数据库的用户:
db.createUser( { user: “test_user", pwd: "xxxxxx", roles: [ { role: "readWrite", db: "user_test" } ] } ); |
创建完成会显示成功,可以用db.system.users.find()查看所有用户验证用户是否存在;
5.2 验证用户登录
#client操作 mongo 10.10.1.163:30010/user_test –u user_test –p MongoDB shell version v3.4.2 Enter password: connecting to: mongodb://192.168.1.163:30010/user_center MongoDB server version: 3.4.2 user_test:PRIMARY> |
Mongodb 集群加keyFile认证的更多相关文章
- 生产环境部署MongoDB副本集(带keyfile安全认证以及用户权限)
本文同步于个人Github博客:https://github.com/johnnian/Blog/issues/8,欢迎留言. 安装软件包:mongodb-linux-x86_64-3.4.1.tgz ...
- mongodb副本集加分片集群安全认证使用账号密码登录
mongodb副本集加分片集群搭建网上资料有很多.粘贴一个写的比较好的.副本集加分片搭建 对于搭建好的mongodb副本集加分片集群,为了安全,启动安全认证,使用账号密码登录. 默认的mongodb是 ...
- mongodb复制集开启安全认证
之前我有一篇博客写的是“node.js通过权限验证连接MongoDB”,这篇博客上提到如何在启动文件中通过配置auth参数来开启权限认证,但这种认证方式只适合单机节点,当我们使用复制集时应该怎么开启权 ...
- mongodb集群搭建(分片+副本)开启安全认证
关于安全认证得总结: 这个讲述的步骤也是先创建超管用户,关闭服务,然后生成密钥文件,开启安全认证,启动服务 相关概念 先来看一张图: 从图中可以看到有四个组件:mongos.config server ...
- MongoDB集群架构及搭建
MongoDB分布式集群 MongDB分布式集群能够对数据进行备份,提高数据安全性,以及提高集群提高读写服务的能力和数据存储能力.主要通过副本集(replica)对数据进行备份,通过分片(shardi ...
- Mongodb 集群搭建以及常见错误
Mongodb 集群搭建以及常见错误 1 关于Replica Sets +Sharding(主从复制加分片)搭建,不这详细去说,网上有很多,大部分的例子就三台服务器之间做主从复制,分2个shard,架 ...
- MongoDB集群部署 - 带访问控制的分片副本集
1. 前言 Ceilometer将meter.event等数据保存在MongoDB中,之前将MongoDB部署在控制节点上,使用三副本模式,时间长了发现meter数据爆炸式增长,区区2T的磁盘捉襟见肘 ...
- MongoDB复制集安全认证
之前我有一篇博客写的是“node.js通过权限验证连接MongoDB”,这篇博客上提到如何在启动文件中通过配置auth参数来开启权限认证,但这种认证方式只适合单机节点,当我们使用复制集时应该怎么开启权 ...
- mongodb集群化
转自:https://www.cnblogs.com/nulige/p/7613721.html 一.mongodb主从复制配置 主从复制是MongoDB最常用的复制方式,也是一个简单的数据库同步备份 ...
随机推荐
- 【转】IntelliJ IDEA的光芒会盖过Eclipse吗
作为一个资深的Eclipse用户,我想对IntelliJ IDEA做一个更为严谨的审视.JetBrains的工作人员非常的友善,并为Podcastpedia.org和Codingpedia.org这两 ...
- 雷林鹏分享:Ruby 文件的输入与输出
Ruby 文件的输入与输出 Ruby 提供了一整套 I/O 相关的方法,在内核(Kernel)模块中实现.所有的 I/O 方法派生自 IO 类. 类 IO 提供了所有基础的方法,比如 read. wr ...
- Android之修改用户头像并上传服务器(实现手机拍照和SD卡选择上传)
写了这么多个的APP,最近才把他这个功能写上来,就抽取其中的用户修改头像的相关操作这个功能写了这篇博客,来与大家分享,希望对你有所帮助. 案例包含了: Xutil图片上传 拍照和SD卡选择图片 图片缓 ...
- C# DataTable Compute方法的使用
在开发中需要对DataTable的数据进行处理,比如累加,求最大最小及平均值等,以前都采用手工对DataTable进行循环并计算的方式,现在发现DataTable的Compute方法可以轻松实现这些功 ...
- ssh隧道(通过跳板机)连接mysql
案例: A服务器 B服务器 C服务器mysql 现在mysql服务器C只能通过内网访问,B服务器就能通过内网连接访问到mysql A服务器无法直接连接C服务器mysql,所以要通过跳板机(跳板 ...
- Jenkins插件开发(一)--环境搭建
最近写了一个jenkins插件,功能比较简单,时间主要是花在对jenkins插件框架和Maven的熟悉上.jenkins插件虽然以前也接触过一点,不过现在都忘得差不多了,这个笔记权当知识点记录,顺带介 ...
- 《转》深入理解Activity启动流程(三)–Activity启动的详细流程2
本文原创作者:Cloud Chou. 出处:本文链接 本系列博客将详细阐述Activity的启动流程,这些博客基于Cm 10.1源码研究. 深入理解Activity启动流程(一)--Activity启 ...
- ADS1.2使用
ADS编译错误Error : A1163E: Unknown opcode ARM汇编指令不支持顶格写,否则不能识别,指令前加上空格即可. 使用for(;;;)//死循环,编译报错如下,说是该语句有错 ...
- 安装xadmin后台管理插件
django自带的admin后台管理功能太少.使用国人开发的xadmin后台,使用pip install xadmin安装在线包时,会出错,其中的README.rst是utf8格式,我们win7系统默 ...
- L3-011 直捣黄龙 (30 分)
本题是一部战争大片 —— 你需要从己方大本营出发,一路攻城略地杀到敌方大本营.首先时间就是生命,所以你必须选择合适的路径,以最快的速度占领敌方大本营.当这样的路径不唯一时,要求选择可以沿途解放最多城镇 ...