上一篇我们了解了MongoDB的复制集概念和复制集的搭建,本篇我们来了解一下如何实现数据恢复 和 提升安全性的一些实践。

1 Mongo Tools实现数据恢复

MongoDB 4.4之后,备份与恢复功能就和主版本分离开了,因此如果我们想要实现备份与恢复就需要独立下载Tools包。

下载地址:https://www.mongodb.com/try/download/database-tools

这里,我们下载后将tgz包放到master节点下。

配置Mongo Tools

首先,解压压缩包并重命名,然后将其移动到指定目录下:

tar -zvxf mongodb-database-tools-rhel70-x86_64-100.3.1.tgz
mv mongodb-database-tools-rhel70-x86_64-100.3.1 tools
mv tools /usr/local/mongodb

然后,为tools在master节点下配置环境变量:

Step1. 修改profile文件并刷新

cat >>/etc/profile<<"EOF"
>export PATH=$PATH:/usr/local/mongodb/tools/bin
>EOF source /etc/profile

Step2. 修改.bashrc文件

cat >>/root/.bashrc<<"EOF"
>export PATH="$PATH:/usr/local/mongodb/tools/bin"
>EOF

测试数据恢复

首先,下载测试数据备份dump:

其次,将其拷贝到master节点(因为我们只在master节点安装了tools)并解压:

tar -zvxf mongodb-database-tools-rhel70-x86_64-100.3.1.tgz

最后,在解压的目录下(我这里是/usr/local/mongodb/)执行mongorestore:

mongorestore -h mongo-master:27017

执行结果如下图所示:

可以看到,有100000条记录成功恢复。

我们也可以验证一下:

可以看到orders表已经恢复到mock数据库中。

此外,我们还可以使用mongo tools实现数据的备份,只需借助 mongodump 命令,示例如下:

# 排除指定的集合
mongodump --db test --excludeCollection=users --excludeCollection=salaries
# 指定ip,端口,用户名,认证,压缩,输出目录
mongodump --host mongo-master --port 37017 --username user --password "pass" --gzip --out /opt/backup/mongodump-2020-05-17

2 提升安全性的实践

默认是无安全性的设置

MongoDB默认的配置是无安全性的,用户名密码都不需要就可以直接连接。在默认模式下,一般不要开放外网连接端口,否则你的MongoDB很可能会被攻击和删库。

更改MongoDB默认端口

MongoDB默认的端口是27017,一般线上环境都建议更改默认端口,比如改为20270,只需在mongodb.conf中配置即可。

net:
bindIp: 0.0.0.0
port: 20270 # port

MongoDB的用户认证方式

MongoDB提供了以下的用户认证方式:

本次我们实践一下用户名+密码的认证方式来提高一点安全性。

MongoDB的授权基于角色的权限控制,不同权限的用户对数据库的操作不同。这一点,跟传统的关系型数据库如MySQL、MSSQL没有多大差异。

Mongo集群节点的认证

首先,我们需要配置一下Mongo集群节点的认证,目前有两种认证方式。

这里,我们采用第一种,即Keyfile的方式。

Step1.在master节点上通过openssl生成Keyfile:

mkdir /usr/local/mongodb/certs
cd /usr/local/mongodb/certs
openssl rand -base64 756 > mongo-repl-set.key
chmod 400 mongo-repl-set.key

Step2.将这个Keyfile复制到两个slave节点上,文件目录的组织可以保持一致。

Step3.分别修改各个节点的mongodb.conf,添加security的配置:

systemLog:
destination: file
path: /usr/local/mongodb/logs/mongodb.log # log path
logAppend: true
storage:
dbPath: /usr/local/mongodb/data # data directory
net:
bindIp: 0.0.0.0
port: 27017 # port
security:
#authorization: enabled
keyFile: /usr/local/mongodb/certs/mongo-repl-set.key
replication:
replSetName: localrs
processManagement:
fork: true

然后,重新启动这个复制集集群中的三个节点。

创建认证用户

首先,MongoDB规定,创建的第一个用户一定要在admin数据库,并且角色是 userAdminAnyDatabase。

use admin
db.createUser({user:"admin",pwd:"yourpassword",
roles:[{role:"userAdminAnyDatabase",db:"admin"}]})

创建完第一个用户,就可以用这个用户登录并创建其他角色的用户了。

其次,创建一个集群的admin用户:

use admin
db.auth("admin","yourpassword")
db.createUser({user:"replicasAdmin",pwd:"yourpassword",
roles:[{role:"clusterAdmin",db:"admin"}]})

这时,你就可以用这个replicasAdmin用户作为你的复制集的使用账号了。

对于生产环境,你还需要自定义一些角色并生成对应用户来控制访问权限,例如下面的授权:

db.createRole(
{
role: 'sampleRole',
privileges: [{
resource: {
db: 'sampledb', collection: 'sample'
},
actions: ["update"]
}],
roles: [{
role: 'read',
db: 'sampledb'
}]
}
)
db.createUser(
{
user: 'sampleUser',
pwd: 'password',
roles: [{role: 'sampleRole', db: 'admin'}]
}

最后,你也可以创建一个root用户,和Linux系统一样,这是一个超级用户账号:

use admin
db.auth("admin","yourpassword")
db.createUser({user:"root",pwd:"yourpassword",
roles:[{role:"root",db:"admin"}]})

当然,由于这个账号权限太大,不建议分给应用程序层面(比如.NET或Java应用)进行联接使用。

重启复制集集群

将三个节点的mongodb.conf中的 security.authorization:true 的注释去掉,重启复制集:

......
security:
authorization: enabled
keyFile: /usr/local/mongodb/certs/mongo-repl-set.key
......

3 总结

本文介绍了如何通过Mongo Tools实现数据恢复 和 提高安全性的一些实践。

下一篇,我们会学习MongoDB的基本操作和查询。

参考资料

唐建法,《MongoDB高手课》(极客时间)

郭远威,《MongoDB实战指南》(图书)

△推荐订阅学习

作者:周旭龙

出处:https://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

MongoDB入门实战教程(3)的更多相关文章

  1. Kafka入门实战教程(7):Kafka Streams

    1 关于流处理 流处理平台(Streaming Systems)是处理无限数据集(Unbounded Dataset)的数据处理引擎,而流处理是与批处理(Batch Processing)相对应的.所 ...

  2. ZooKeeper入门实战教程(一)-介绍与核心概念

    1.ZooKeeper介绍与核心概念1.1 简介ZooKeeper最为主要的使用场景,是作为分布式系统的分布式协同服务.在学习zookeeper之前,先要对分布式系统的概念有所了解,否则你将完全不知道 ...

  3. Node+Express+MongoDB+Socket.io搭建实时聊天应用实战教程(一)--MongoDB入门

    前言 本文并不是网上流传的多少天学会MongoDB那种全面的教程,而意在总结这几天使用MongoDB的心得,给出一个完整的Node+Express+MongoDB+Socket.io搭建实时聊天应用实 ...

  4. Node+Express+MongoDB + Socket.io搭建实时聊天应用实战教程(二)--node解析与环境搭建

    前言 本来开始写博客的时候只是想写一下关于MongoDB的使用总结的,后来觉得还不如干脆写一个node项目实战教程实战.写教程一方面在自己写的过程中需要考虑更多的东西,另一方面希望能对node入门者有 ...

  5. MongoDB入门必读(概念与实战并重)

    MongoDB入门必读(概念与实战并重) 一.概述 MongoDB是一个基于分布式文件存储的数据库开源项目.由C++语言编写.旨在为WEB应用提供可护展的高性能数据存储解决方案. MongoDB是一个 ...

  6. mybatis实战教程(mybatis in action),mybatis入门到精通

    转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门一下下,如果你看过hibernate了那这个就非常的简单) (再加 ...

  7. mybatis实战教程(mybatis in action),mybatis入门到精通(转)

    转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门一下下,如果你看过Hibernate了那这个就非常的简单) (再加 ...

  8. mongodb入门教程二

    title: mongodb入门教程二 date: 2016-04-07 10:33:02 tags: --- 上一篇文章说了mongodb最基本的东西,这边博文就在深入一点,说一下mongo的一些高 ...

  9. mongodb入门教程

    title: mongodb入门教程 date: 2016-04-06 14:47:18 tags: --- 为什么要认识呢,因为这玩意就一傻逼 借用一下百科的介绍 MongoDB 是一个介于关系数据 ...

  10. MongoDb 入门教程

    MongoDb 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 它是可扩展的高性能数据存储解决方案,经常被用于非关系型数据的存储,能存储海量的数据. 常 ...

随机推荐

  1. AOT编译Avalonia应用:StarBlog Publisher项目实践与挑战

    前言 最近我使用 Avalonia 开发了一个文章发布工具,StarBlog Publisher. Avalonia 是一个跨平台的 UI 框架,它可以在 Windows.Linux 和 macOS ...

  2. 【Git】国内的项目托管网站-码云

    国内的项目托管网站-码云 1 简介 使用 GitHub 作为项目托管网站如果网速不好很影响效率,大家也可以使用国内的项目托管网站-码云.网址是 https://gitee.com/ ,使用方式跟 Gi ...

  3. vue2&vue3&小程序简介

    Vue2.Vue3.小程序页面生命周期详解 本篇将对比 Vue2.Vue3 以及小程序页面/组件的生命周期,简单梳理各自特点.差异.新增优化点. Vue2 生命周期 beforeCreate → cr ...

  4. 说说 Java 的执行流程?

    Java 的执行流程 Java 的执行流程包括多个阶段,从源码编写到最终程序的执行,涉及到编译.类加载.字节码执行.垃圾回收等多个环节.下面将详细介绍 Java 程序的执行流程. 1. 编写源代码 开 ...

  5. 2.1k star! 抓紧冲,DeepChat:连接AI与个人世界的智能助手的开源项目

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 DeepChat是一款开源的跨平台智能助手工具,它如同AI世界的"万能转换插头&q ...

  6. rider 跑不动了,快找车吧=vscode

    我的笔记本跑rdier有点吃紧了,T440s; rider的慢速是我有点难以接受了,在开发效率和性能方面综合考虑,我考虑换上vscode了. 做.net core web开发完全够用了,也不用各种等待 ...

  7. 从零开始学Flink:开启实时计算的魔法之旅

    在凌晨三点的数据监控大屏前,某电商平台的技术负责人突然发现一个异常波动:支付成功率骤降15%.传统的数据仓库此时还在沉睡,而基于Flink搭建的实时风控系统早已捕捉到这个信号,自动触发预警机制.当运维 ...

  8. OpenDeepWiki一分钟即可让您的仓库自动生成精美文档

    引言 还在为编写详尽的项目文档而头疼吗?是否曾经面对一个陌生的代码仓库,却不知从何下手理解其结构和逻辑?在软件开发的世界里,高质量文档就像一张详细的地图,引导开发者穿越复杂代码的迷宫.然而,编写这样的 ...

  9. Axure RP大数据可视化大屏原型组件源文件

    Axure RP大数据可视化大屏原型模板 大数据BI分析上大屏,在很多大企业和政府单位客户都需要,高新区市场监控等,那使用Axure RP做交互原型是必不可少的,有了大屏原型模板可做出不同风格和行业的 ...

  10. C#之结构

    结构是用户定义的数据类型,与类非常相似,它们有数据成员和函数成员,但与类最重要的区别是:类是引用类型,而结构是值类似,结构是隐式密封的,这意味这它们不能被派生,所以结构类型不能为null,两个结构变量 ...