生产环境部署MongoDB副本集(带keyfile安全认证以及用户权限)
本文同步于个人Github博客:https://github.com/johnnian/Blog/issues/8,欢迎留言。
安装软件包:mongodb-linux-x86_64-3.4.1.tgz
安装流程思路
目前最小节点是3个,本文档暂且按照3个节点来配置:A、B、C
1、在集群每个节点上安装一份MongoDB;
2、配置副本集;
3、配置副本集的用户、密码;
4、配置副本集的KeyFile安全鉴权;
5、配置开机自启动;
每个节点IP:
- A节点: 172.17.0.3
- B节点: 172.17.0.4
- C节点: 172.17.0.5
步骤1: 每个节点安装MongoDB
1、下载MongoDB安装包:mongodb-linux-x86_64-3.4.1.tgz
2、解压安装包, 创建目录,拷贝配置文件:
[root@a6a766e6204a ~]# tar -zxvf mongodb-linux-x86_64-3.4.1.tgz
[root@a6a766e6204a ~]# mv mongodb-linux-x86_64-3.4.1 mongodb
[root@a6a766e6204a ~]# mv mongo.conf mongodb/
[root@a6a766e6204a ~]# mkdir mongodb/data mongodb/keyfile mongodb/logs
创建完成后,目录的结构:
mongodb
├── bin #可执行文件
├── data #存放数据库文件
├── keyfile #存放Keyfile
├── logs #存放系统日志
├── mongo.conf #配置文件
3、添加到环境变量
[root@a6a766e6204a ~]# vi /etc/bashrc
#MongoDB config
MONGO_HOME=/root/mongodb
PATH=$MONGO_HOME/bin:$PATH
export PATH MONGO_HOME
[root@a6a766e6204a ~]# source /etc/bashrc
4、创建 mongo.conf 配置项,包括端口、路径等, 例如,配置后的文件:
[root@a6a766e6204a ~]# vi mongodb/mongo.conf
#日志文件位置:改为实际路径
logpath=/root/mongodb/logs/mongo.log
#以追加的方式写日志
logappend=true
#端口
port=27018
#是否以守护进程的方式运行
fork=true
#数据库存储位置:改为实际路径
dbpath=/root/mongodb/data/
#是否以安装认证方式运行
#auth=true
#副本集名字
replSet=replSet
#KeyFile鉴权文件:改为实际路径
#keyFile=/root/mongodb/keyfile
5、分别启动每个节点:A、B、C节点
[root@a6a766e6204a ~]# mongod -f mongodb/mongo.conf
about to fork child process, waiting until server is ready for connections.
forked process: 1289
child process started successfully, parent exiting
步骤2: 组建副本集
1、使用mongo 客户端 连接任意节点(假设 目前创建的节点有 A、B、C 三台)
[root@c43bfab6f744 ~]# mongo --port 27018
连接成功后,开始配置副本集:
> config = {_id: 'replSet', members: [{_id: 0, host: '172.17.0.3:27018'},{_id: 1, host: '172.17.0.4:27018'},{_id: 2, host:'172.17.0.5:27018'}]}
{
"_id" : "replSet",
"members" : [
{
"_id" : 0,
"host" : "172.17.0.3:27018"
},
{
"_id" : 1,
"host" : "172.17.0.4:27018"
},
{
"_id" : 2,
"host" : "172.17.0.5:27018"
}
]
}
> rs.initiate(config) #初始化副本集
{ "ok" : 1 }
> rs.status() #查看副本集状态,找到private节点的IP
步骤3:创建帐户密码
副本集搭建成功后,需要给整个副本集创建帐户、密码
1、在主节点上,用客户端连接,创建用户权限(主节点,可以用 rs.status() 查看)
[root@c43bfab6f744 ~]# mongo --port 27018
replSet:PRIMARY> use admin
switched to db admin
#创建分配用户权限的帐户:admin
replSet:PRIMARY> db.createUser({user:"admin", pwd:"admin", roles:[{role: "userAdminAnyDatabase", db:"admin" }]})
Successfully added user: {
"user" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
#创建普通数据库、用户
replSet:PRIMARY> db.auth("admin","admin")
1
replSet:PRIMARY> use mytest #创建mytest数据库
switched to db mytest
replSet:PRIMARY> db.createUser({user:"mytest",pwd:"mytest",roles:[{role:"dbOwner",db:"mytest"}]})
Successfully added user: {
"user" : "mytest",
"roles" : [
{
"role" : "dbOwner",
"db" : "mytest"
}
]
}
这样,就创建数据库:mytest, 数据库用户:mytest / mytest, 生产部署的时候,改成对应的数据库名、用户名
可以通过连接验证下:
[root@c43bfab6f744 ~]# mongo 172.17.0.3:27018/mytest -u mytest -p mytest
步骤4:创建副本集认证key文件
1、创建key文件: 注意,三个节点必须要用同一份keyfile,在一台机器生成,拷贝到另外两台,并且修改成 600 的文件属性
[root@c43bfab6f744 ~]# openssl rand -base64 90 -out ./keyfile
[root@c43bfab6f744 ~]# cp keyfile mongodb/keyfile/
[root@c43bfab6f744 ~]# chmod 600 mongodb/keyfile/keyfile
备注:keyfile的属性必须更改,否则会报错:
2017-06-30T07:01:28.950+0000 I CONTROL [main] ***** SERVER RESTARTED *****
2017-06-30T07:01:28.954+0000 I ACCESS [main] permissions on /root/mongodb/keyfile/keyfile are too open
并且把这份keyfile同步到其他两个节点的 ~/mongodb/keyfile/ 文件夹中;
2、关闭副本集:分别关闭每个节点的mongod
[root@c43bfab6f744 ~]# mongo --port 27018
replSet:PRIMARY> use admin
replSet:PRIMARY> db.shutdownServer()
3、修改每个节点的配置文件mongo.conf中的下面项:
[root@c43bfab6f744 ~]# vi ~/mongodb/mongo.conf
...
...
#是否以安装认证方式运行
auth=true
#KeyFile鉴权文件:改为实际路径
keyFile=/root/mongodb/keyfile/keyfile
4、重新启动副本集
[root@c43bfab6f744 ~]# mongod -f mongodb/mongo.conf #机器A
[root@c43bfab6f744 ~]# mongod -f mongodb/mongo.conf #机器B
[root@c43bfab6f744 ~]# mongod -f mongodb/mongo.conf #机器C
步骤5:设置MongoDB开机自启动
[root@c43bfab6f744 ~]# vi /etc/rc.d/rc.local #加入下面的自启动脚本
/root/mongodb/bin/mongod -f /root/mongodb/mongo.conf
附录
1、创建数据库的用户角色:
role角色
- 数据库用户角色:read、readWrite;
- 数据库管理角色:dbAdmin、dbOwner、userAdmin;
- 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
- 备份恢复角色:backup、restore;
- 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
- 超级用户角色:root
- 内部角色:__system
角色说明
- read:允许用户读取指定数据库
- readWrite:允许用户读写指定数据库
- dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
- userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
- clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
- readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
- readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
- userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
- dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
- root:只在admin数据库中可用。超级账号,超级权限
- dbOwner: readWrite + dbAdmin + dbAdmin
2、Java客户端连接配置
Spring XML配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/data/mongo
http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- credentials="用户名:密码@用户归属数据库" -->
<mongo:mongo-client replica-set="172.17.0.3:27018,172.17.0.4:27018, 172.17.0.5:27018" credentials="mytest:mytest@mytest" id="mongo">
<mongo:client-options
connections-per-host="20"
threads-allowed-to-block-for-connection-multiplier="10"
connect-timeout="120000"
max-wait-time="120000"
socket-keep-alive="true"
socket-timeout="150000"
/>
</mongo:mongo-client>
<mongo:db-factory dbname="数据库名" mongo-ref="mongo" />
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
</bean>
</beans>
Spring Boot配置
spring.data.mongodb.uri=mongodb://user:pwd@ip1:port1,ip2:port2/database
作者:Johnnian
链接:https://www.jianshu.com/p/f021f1f3c60b
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
生产环境部署MongoDB副本集(带keyfile安全认证以及用户权限)的更多相关文章
- linux上安装MongoDB副本集(带keyfile安全认证以及用户权限)
搭建前准备 MongoDB版本:4.0 主要参考搭建MongoDB副本集网站:https://www.jianshu.com/p/f021f1f3c60b 安装之前最好先确定一下几点: 防火墙关闭 M ...
- docker中部署mongodb副本集
1.基本信息如下 服务器地址 192.168.73.129 副本集名称 rs 容器节点及端口映射 m0 37017:27017 m1 47017:27017 ...
- MongoDB和Java(6):Spring Data整合MongoDB副本集、分片集群
最近花了一些时间学习了下MongoDB数据库,感觉还是比较全面系统的,涉及了软件安装.客户端操作.安全认证.副本集和分布式集群搭建,以及使用Spring Data连接MongoDB进行数据操作,收获很 ...
- 四十三.MongoDB副本集 MongoDB文档管理
一.部署MongoDB副本集 1.1 启用副本集配置并指定集群名称 rs1 1.2 定义集群成员列表 部署好机器51,52,53:51上配置 bind_ip=192.168.4.51(要改) port ...
- Mongodb副本集+分片集群环境部署记录
前面详细介绍了mongodb的副本集和分片的原理,这里就不赘述了.下面记录Mongodb副本集+分片集群环境部署过程: MongoDB Sharding Cluster,需要三种角色: Shard S ...
- Mongodb副本集+分片集群环境部署
前面详细介绍了mongodb的副本集和分片的原理,这里就不赘述了.下面记录Mongodb副本集+分片集群环境部署过程: MongoDB Sharding Cluster,需要三种角色: Shard S ...
- MongoDB副本集(一主两从)读写分离、故障转移功能环境部署记录
Mongodb是一种非关系数据库(NoSQL),非关系型数据库的产生就是为了解决大数据量.高扩展性.高性能.灵活数据模型.高可用性.MongoDB官方已经不建议使用主从模式了,替代方案是采用副本集的模 ...
- MongoDB副本集(一主一备+仲裁)环境部署-运维操作记录
MongoDB复制集是一个带有故障转移的主从集群.是从现有的主从模式演变而来,增加了自动故障转移和节点成员自动恢复.MongoDB复制集模式中没有固定的主结点,在启动后,多个服务节点间将自动选举产生一 ...
- NoSQL数据库Mongodb副本集架构(Replica Set)高可用部署
NoSQL数据库Mongodb副本集架构(Replica Set)高可用部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. MongoDB 是一个基于分布式文件存储的数据库.由 C ...
随机推荐
- 【转】Java中static关键字用法总结
1. 静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法 声明为static的方法有以下几条限制: · 它们仅能调用其他的static 方法. · 它 ...
- 十三. Python基础(13)--生成器进阶
十三. Python基础(13)--生成器进阶 1 ● send()方法 generator.send(value) Resumes the execution, and "sends&qu ...
- 深入理解java虚拟机----java技术体系(一)
1.java技术体系 举例: class文件格式:如下图所示,java源代码可以根据不同的编译器可以编译成不同的代码.即可以自定义语言规范比如beanshell,并编写代码; 然后自己编写java编译 ...
- 5.4 C++重载输入与输出操作符
参考:http://www.weixueyuan.net/view/6382.html 总结: 在C++中,系统已经对左移操作符“<<”和右移操作符“>>”分别进行了重载,使其 ...
- SQL-24 获取所有非manager员工当前的薪水情况,给出dept_no、emp_no以及salary ,当前表示to_date='9999-01-01'
题目描述 获取所有非manager员工当前的薪水情况,给出dept_no.emp_no以及salary ,当前表示to_date='9999-01-01'CREATE TABLE `dept_emp` ...
- suse_linux 11 sp3 安装 was7
1.安装操作系统 suse linux 11 1.创建虚拟机 2.下一步 3.稍后安装操作系统,下一步 4.选择操作系统 5.选择存储目录 6.下一步 7.完成 8.编辑虚拟机 9.内存1G,CD/D ...
- 利用node,跑项目。
(前提是已经安装了node) 一.简单介绍 Vue开发|文件目录结构部署 目录结构 ├── index.html 入口页面 ├── build 构建脚本目录 │ ├── build-server.j ...
- dos命令:目录操作
目录操作 一.cd语句 1.介绍 显示当前目录名或改变当前目录. 2.语法 CHDIR [/D] [drive:][path] CHDIR [..] CD [/D] [drive:][path] ...
- nginx的日志切割
nginx日志默认情况下统统写入到一个文件中,文件会变的越来越大,非常不方便查看分析.以日期来作为日志的切割是比较好的,通常我们是以每日来做统计的.下面来说说nginx日志切割. 如果我们使用的是yu ...
- 10.3制作Android Splash启动界面
共分三步: 1.制作.9.png图片 可以参考这个文章. 2.修改项目文件,使用.9.png图片 用笔记本打开项目文件,先找到在项目中设置的Splash文件名,并改成第一步制作的.9.png文件名.例 ...