一段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,如需转载请自行联系原作者

你可能感兴趣的:(数据库,运维,前端,ViewUI)