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