一段mongo数据库数据丢失 引发的血案

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介:

2017年1月8日上无,一个晴朗的早上(大周末的晴朗的早上),我还在梦境中,被一个电话吵醒,众所周知,做运维的最怕在休息期间接到公司同仁电话!

   起因:同事说线上的某个功能不能用了!(这个功能就是在mongo数据库中获取数据返给前端进行渲染)

   经过:之前也出现过类似的问题,排查故障后是因为mongo实例挂掉(某种原因造成),这次没想到事情比之前的故障还要叫人毛骨悚然----------mongo的数据丢了 我的个天啊。里面存放了不到5千万条的数据啊。丢了这可咋弄啊?

   解决:把mongo数据丢失关键字放到google上一搜,看到了一个帖子,《大批MongoDB因配置漏洞被攻击,黑客删除数据并勒索赎金》,心想完了数据很可能跟这个事情有关系!

       不幸中的万幸,我的mongo数据是一天一备份的。不然我都不知道找谁哭去

   数据还原:拿到之前的备份这根救命稻草,心(ri)里(ta)窃(lao)喜(lao)!我的mongo架构是做的主从读写分离模式的,首先不加验证的方式启动mongo的主、从、仲裁节点

关于如何配置mongo的主从读写分离技术,查看小编的另一篇文章:http://www.cnblogs.com/xinzhiyu/p/5907542.html

1
2
3
. /mongod  -f master.conf  #启动主节点
. /mongod  -f slave.conf  #启动从节点
. /mongod   -f  arbiter.conf  #启动仲裁节点

看一下当前配置文件内容:

master.conf

1
2
3
4
5
6
7
8
9
10
11
dbpath= /Disk/mongodb/data/master
logpath= /Disk/mongodb/log/master .log
pidfilepath= /Disk/mongodb/master .pid
directoryperdb= true
logappend= true
replSet=testrs
bind_ip=192.168.1.25
port=27017
oplogSize=10000
fork= true
noprealloc= true

slave.conf

1
2
3
4
5
6
7
8
9
10
11
dbpath= /Disk/mongodb/data/slaver
logpath= /Disk/mongodb/log/slaver .log
pidfilepath= /Disk/mongodb/slaver .pid
directoryperdb= true
logappend= true
replSet=testrs
bind_ip=192.168.1.25
port=27018
oplogSize=10000
fork= true
noprealloc= true

arbiter.conf

1
2
3
4
5
6
7
8
9
10
11
dbpath= /Disk/mongodb/data/arbiter
logpath= /Disk/mongodb/log/arbiter .log  
pidfilepath= /Disk/mongodb/arbiter .pid  
directoryperdb= true  
logappend= true  
replSet=testrs  
bind_ip=192.168.1.25
port=27019
oplogSize=10000  
fork= true  
noprealloc= true

使用mongo命令连接主数据库,创建管理员帐号。

1
. /mongo  --host=192.168.30.25:27017

创建管理员帐号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
use admin   #进入admin库
db.createUser( 'sa' , 'sa' #创建帐号为sa密码也是sa的一个管理员帐号
db.getUser( 'sa' )db.getUser( 'sa' # 查看以下sa帐号的用户角色
{
         "_id"  "admin.sa" ,
         "user"  "sa" ,
         "db"  "admin" ,
         "roles"  : [
                 {
                         "role"  "root" ,   # 角色为root,本帐号为最大权限帐号
                         "db"  "admin"
                 }
         ]
}

登录到从库上查看sa帐号是否已经同步到从库上,经过测试发现是没问题的。


生成一个配置key文件,这个文件是用来开启用户验证登录用的,这个key文件有如下要求:

1)至少6个字符,小于11024字节

2)认证时候不考虑文件中空白字符

3)连接到副本集的成员和mongos进程的keyfile文件内容必须一样

4)必须是base64编码,但不能有等号   这个一定要注意,生成了文件建议看一下文件内容,如果有等

  号必须重新生成文件

5)文件权限必须是600,也就是说不能分配任何权限给group成员和other成员

1
[root@54 ~] # openssl rand -base64 100 > /mongodb/scheme2/keyfile0

在主从仲裁三个节点的配置文件中都要加上如下一句话

1
keyFile= /opt/mongodb/mongodb .key

重启所有的mongo节点

当加上这句话,说明mong就以验证的方式进行访问了

验证必须要进入admin库中进行验证用户权限

1
2
3
4
#进入admin库
use admin 
# 进行用户验证,如果返回的是1,说明验证成功;如果返回为0,验证失败     
db.auth( 'username' , 'passwd' )


分别进入到对应的库中,创建对应的帐号,这个也是在做安全时候需要考虑到的,对每个库分别创建对应的管理帐号

步骤一、首先进入到admin库中,验证最高管理员帐号和密码

1
2
3
4
#进入admin库
use admin 
# 进行用户验证,如果返回的是1,说明验证成功;如果返回为0,验证失败     
db.auth( 'username' , 'passwd' )

步骤二、进入到对应库中,创建账户

1
2
use  otherDB   #进入admin库
db.createUser( 'username' , 'passwd' #创建帐号为sa密码也是sa的一个管理员帐号

步骤三、查看账户的角色是否正确

1
2
3
4
5
6
7
8
9
10
11
12
testrs:PRIMARY> db.getUser( 'uxiaoxin' )db.getUser( 'uxiaoxin' )
{
         "_id"  "xiaoxin.uxiaoxin" ,
         "user"  "uxiaoxin" ,
         "db"  "xiaoxin" ,
         "roles"  : [
                 {
                         "role"  "dbOwner" ,    #角色为dbOwner
                         "db"  "xiaoxin"    #管理的数据库是xiaoxin库
                 }
         ]
}



进行验证:

    验证一:查看主从+读写分离数据库是否可以正常同步 

    验证二:使用mongorestore命令对主进行数据恢复,看从是否可以正常同步

    验证三:使用mongostat命令查看读写是否已经分离

重要参考地址:http://www.cnblogs.com/silentjesse/p/4676440.html










本文转自 xinsir999 51CTO博客,原文链接:http://blog.51cto.com/xinsir/1890428,如需转载请自行联系原作者
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
9月前
|
存储 SQL NoSQL
【mongo 系列】mongodb 学习一,基本 nosql 和 mongodb等数据库对比
咱们工作或者学习的过程中,接到一个需求,或者学习一个技能的时候,我们是如何去学习的呢?
107 2
|
9月前
|
存储 Kubernetes NoSQL
k8s之KubeSphere部署有状态数据库中间件服务 mysql、redis、mongo
k8s之KubeSphere部署有状态数据库中间件服务 mysql、redis、mongo
|
NoSQL Shell MongoDB
liunx定时备份mongo数据库并实现自动删除N天前备份
liunx定时备份mongo数据库并实现自动删除N天前备份
|
数据库
使用mongod启动mongo数据库时报错ERROR: child process failed, exited with error number 100
使用mongod启动mongo数据库时报错ERROR: child process failed, exited with error number 100
使用mongod启动mongo数据库时报错ERROR: child process failed, exited with error number 100
|
Java 数据库
java开发实战(3):springboot整合mongo数据库(mongodb-driver)
java开发实战(3):springboot多模块工程整合mongo数据库(mongodb-driver)
625 0
|
JSON NoSQL Shell
如何将 winston log 库记录的日志写入 mongo DB 数据库
Winston 非常适合配置不同的日志目的地。 在我们的小应用程序中,让我们创建另一个传输。 这次我想把日志保存到一个数据库中,MongoDB 简洁一些。 在 logger.js 文件上,复制以下代码块。 确保安装 Winston MongoDB,即 npm install winston-mongodb。
如何将 winston log 库记录的日志写入 mongo DB 数据库
|
监控 NoSQL Cloud Native
Serverless 解惑——函数计算如何访问 Mongo 数据库
本文介绍如何快速实现函数计算访问 Mongo 数据库。
Serverless 解惑——函数计算如何访问 Mongo 数据库
|
数据库 安全 NoSQL
mongo数据库单节点搭建
mongo数据库单节点搭建
1223 0