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

简介:

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,如需转载请自行联系原作者
目录
相关文章
|
关系型数据库 MySQL 数据库
Docker Compose V2 安装常用数据库MySQL+Mongo
以上内容涵盖了使用 Docker Compose 安装和管理 MySQL 和 MongoDB 的详细步骤,希望对您有所帮助。
1470 42
|
SQL Oracle 关系型数据库
Java连接各种数据库操作(mysql、oracle、postgresql、gbase、mongo)
Java连接各种数据库操作(mysql、oracle、postgresql、gbase、mongo)
884 0
|
Oracle 关系型数据库 数据库
Oracle数据恢复—异常断电导致Oracle数据库数据丢失的数据恢复案例
Oracle数据库故障: 机房异常断电后,Oracle数据库启库报错:“system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。数据库没有备份,归档日志不连续。用户方提供了Oracle数据库的在线文件,需要恢复zxfg用户的数据。 Oracle数据库恢复方案: 检测数据库故障;尝试挂起并修复数据库;解析数据文件。
|
NoSQL MongoDB 数据库
Mongo 数据库备份和恢复命令
Mongo 数据库备份和恢复命令
1144 4
|
存储 Oracle 安全
服务器数据恢复—Raid故障导致数据库数据丢失的数据恢复案例
一台光纤存储中有一组由16块硬盘组成的raid。 该存储出现故障导致数据丢失。RAID中2块盘掉线,还有1块盘smart状态为“警告”。
|
存储 SQL NoSQL
【mongo 系列】mongodb 学习一,基本 nosql 和 mongodb等数据库对比
咱们工作或者学习的过程中,接到一个需求,或者学习一个技能的时候,我们是如何去学习的呢?
385 2
|
存储 Kubernetes NoSQL
k8s之KubeSphere部署有状态数据库中间件服务 mysql、redis、mongo
k8s之KubeSphere部署有状态数据库中间件服务 mysql、redis、mongo
|
数据库
使用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
|
NoSQL Shell MongoDB
liunx定时备份mongo数据库并实现自动删除N天前备份
liunx定时备份mongo数据库并实现自动删除N天前备份
281 0
|
监控 NoSQL Cloud Native
Serverless 解惑——函数计算如何访问 Mongo 数据库
本文介绍如何快速实现函数计算访问 Mongo 数据库。
Serverless 解惑——函数计算如何访问 Mongo 数据库

热门文章

最新文章