介绍

自从远古计绳结开始,数据库的存储就注定了今天的地位和多样性,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用户管理(转:http://blog.csdn.net/wlzjsj/article/details/61421230)相关推荐

  1. Spring+mongodb集群集成(吐血教程) 转自:http://blog.csdn.net/qq_16497617/article/details/52817335

    前一篇文章中介绍了在window系统下部署mongodb集群,按照教程一步步实现的话应该都可以在本机部署成功了,上篇文章末尾也提到了,想集成到SSM框架中去,网上资料基本都是单个mongodb数据库的 ...

  2. Mongodb 集群加keyFile认证

    介绍 自从远古计绳结开始,数据库的存储就注定了今天的地位和多样性,Nosql的出现更是解决了现有的关系型数据库无法解决的一些难题,对高性能,灵活度,扩展性,海量数据的问题.随之而出现的高速内存索引数据 ...

  3. 学习mongoDB的一些感受(转自:http://blog.csdn.net/liusong0605/article/details/11581019)

    曾经使用过mongoDB来保存文件,最一开始,只是想总结一下在开发中如何实现文件与mongoDB之间的交互.在此之前,并没有系统的了解过mongoDB,虽然知道我们用它来存储文件这些非结构化数据,但是 ...

  4. 系统权限管理设计 (转:http://blog.csdn.net/chexlong/article/details/37697555)

    权限设计(转:http://blog.csdn.net/chexlong/article/details/37697555)      1. 前言:      权限管理往往是一个极其复杂的问题,但也可 ...

  5. 架构之路之spring+springmvc+maven+mongodb的搭建(转载:http://blog.csdn.net/tomcat_2014/article/details/55100130)

    1.前言 最近项目开发使用到了spring+springmvc+maven+MongoDB,项目中的框架是用springboot进项开发的,对于我们中级开发人员来说,有利有弊,好处呢是springbo ...

  6. (微信公众号开发《一》OAuth2.0网页授权认证获取用户的详细信息,实现自动登陆)http://blog.csdn.net/liaohaojian/article/details/70175835

    从接触公众号到现在,通过不断积累学习,对如何调用微信提供接口有了一定的见解.当然在开发过程中遇到很多问题,现在把部分模块功能在这备案一下,做个总结也希望能给其他人帮助 工欲善其事,必先利其器,先看看开 ...

  7. Mongodb参数详解(参考:http://blog.csdn.net/freebird_lb/article/details/8229567)

    MongoDB配置参数详解: #对mongo实例来说,每个host允许链接的最大链接数,这些链接空闲时会放入池中,如果链接被耗尽,任何请求链接的操作会被阻塞等待链接可用,推荐配置10 connecti ...

  8. 如何正确对用户密码进行加密?转自https://blog.csdn.net/zhouyan8603/article/details/80473083...

    本文介绍了对密码哈希加密的基础知识,以及什么是正确的加密方式.还介绍了常见的密码破解方法,给出了如何避免密码被破解的思路.相信读者阅读本文后,就会对密码的加密有一个正确的认识,并对密码正确进行加密措施 ...

  9. Windows Phone开发(13):如何规范用户的输入行为 转:http://blog.csdn.net/tcjiaan/article/details/7341513...

    很多时候,我们对用户的操作或输入做一定程度的限制,以避免发生不必要的异常或错误,因此,对一些特殊的类型,进行输入限制是很有必要的. 通改变屏幕键盘的显示模式可以规范和告诉用户, 这里应该输入什么. 要 ...

最新文章

  1. 201621123030《Java程序设计》第4周学习总结
  2. Facebook TensorMask:一种新的密集滑动窗口分割技术
  3. 滑动窗口算法应用及详解
  4. android新闻app_如何利用 Python 爬虫实现给微信群发新闻早报?
  5. 开源实时音视频技术WebRTC中RTP/RTCP数据传输协议的应用
  6. 【数据结构与算法】之深入解析“等差数列划分II”的求解思路与算法示例
  7. 时间管理—如何充分利用你的24小时
  8. 计算机专业三年教学实施计划及总结,教师个人三年专业成长目标和措施
  9. java软件开发工程师的简历
  10. WebRTC源码架构浅析
  11. 人体姿态检测——CPN
  12. html5 实心圆点,html5如何使用canvas画空心圆与实心圆
  13. 人生三重界---看山不是山,看水不是水
  14. 老嫂子的保姆级科普 选择视频剪辑软件就从阅读本文开始
  15. 【STM32】使用STM32提供的DSP库进行FFT(附详细代码)
  16. 信天游:电视剧《血色浪漫》插曲-杜老汉-拜年
  17. 程序员实用工作技能之Docker
  18. 黑客攻防技术宝典(五)
  19. 温度传感器温度数据LED屏幕展示--物联网服务器搭建
  20. zara小程序怎么付款_能扫码付款并且可以打折的微信小程序怎么做?

热门文章

  1. filco蓝牙不好用_800元和300元的机械键盘差多少,Filco圣手104晒单
  2. 离散傅里叶变换python_使用python实现离散时间傅里叶变换
  3. 粒子群算法求解无约束优化问题 源码实现
  4. VTK:提取选择 OriginalId用法实战
  5. opengl加载显示3D模型AMF类型文件
  6. OpenCASCADE可视化:应用交互服务之交互式上下文
  7. wxWidgets:位图和图标
  8. boost::spirit模块实现一个雇员结构的解析器的测试程序
  9. boost::mpl模块实现sizeof相关的测试程序
  10. boost::math::chi_squared用法的测试程序