第一章 mongodb产品日常维护
1.1 启停操作
1.1.1 启动mongodb
在没有做全局变量的情况下需要cd到/home/mongodb/mongodb/bin/来执行以下命令
./mongod –f /home/mongodb/mongodb/mongodb.conf
在/home/mongodb/目录下有个script目录中有启动脚本。
1.1.2 停止mongodb
在库中切换到admin库 use admin
执行db.(“root”,”root123”)来通过用户验证。
执行db.shutdownServer();命令
./mongod –f /home/mongodb/mongo/mongodb.conf –shutdown也可以停掉mongodb
在/home/mongodb/目录下有个script目录中有启动脚
本和关闭脚本还有备份脚本,也可以使用脚本来停止mongodb。如下:
./mongodb-shutdown.sh 来关闭mongodb。
./mongodb-start.sh 来启动mongodb
./mongodb-backup.sh 来备份mongodb。
1.1.3 状态检查
状态检查,在mongodb的目录下/monitor/目录下有定时巡检的脚本,监控状态,作为每分钟执行一次脚本。脚本输出的结果在/home/mongodb/monitor/logs下。在crontab –e中写入 * * * * * /home/mongodb/monitor/mongodb-monitor.sh来设置脚本执行的时间。
1.1.4 状态检查
可以用netstat –an | grep 27017 命令来查看程序是不在运行。
1.2 增加节点
在生产环境中,添加节点要进入主库中,use admin到admin库下,来执行
rs.add 命令如下图:
添加完节点需要,不需要初始化副本集,如添加节点使节点的总数变成基数,必须要添加仲裁者,在集群的节点宕机一半以上就会选举不了主节点,所以必须添加仲裁节点。
1.2.1 添加仲裁节点
仲裁者是一个不存储数据,不当主节点,只参加选举的节点。
添加仲裁节点要先在集群内的主机找个压力相对比较小的服务器,来搭建仲裁节点,下面来添加仲裁节点命令如下:
解压mongodb的tar.gz包。创建数据路径和日志路径:
mkdir -p /home/data
mkdir –p /home/logs
创建mongodb.conf文件来写入以下命令,
dbpath=/home/data 定义仲裁节点的数据路径
logpath=/home/logs/mongod.log 定义仲裁的日志路径
replSet=repset 和要加入集群的名称一致
fork=true 开启后台运行
port=30000 仲裁者端口号
(如果要添加的集群已开启用户认证,仲裁节点也必须要开启用户认证。)
启动仲裁节点,
./mongod –f /home/mongodb/mongodb.conf来启动仲裁
如果是一台机器上安装了两个mongodb服务,而不同端口号。
当要进入mongodb数据库时就要指定端口号如下:
./mongo –port 30000 进入仲裁节点。
在主节点上添加仲裁节点:
rs.addArd(“要添加的节点和端口”)来添加仲裁节点。
把仲裁节点关闭。开启用户认证,再开启节点。
1.3 删除节点
使用use admin进入admin库中执行以下命令
rs.remove命令来删除节点,如下图:
如出现ok 1证明删除成功。
1.4 节点权重的查看
在mongodb中无论要如何设置和更改一些配置都要进入admin库中,use admin
用rs.conf 命令来查看priority值:
1.5 设置权重值
设置节点权重值命令如下:
1) PRIMARY> config=rs.conf()
2)PRIMARY>config.members[3].priority=3
3)PRIMARY> rs.reconfig(config)
这些操作必须在Primary上进程。
[]中的3不是节点的id号,是rs.conf出来的顺序。
第二章 用户安全认证
2.1 创建秘钥
先创建一个管理用户(root),再给想要存储的库创建角色,比如(test库中的用户。)
要用户安全认证,是要通过秘钥来通信来保证数据库安全连接,用以下命令创建秘钥:
touch /home/mongodb/mongodb.key
在赋予权限
Chmod 600 mongodb.key
- openssl rand –base64 666 > /home/mongodb/mongodb.key
通信秘钥会重定向到mongodb.key文件中。把秘钥粘贴到其他服务器的同样文件下。
在启动文件中,写入以下内容
注意事项:(每台服务器的上面都要有一样的秘钥,和指定通信秘钥文件的位置。)
2.2 修改启动文件
开启用户认证选项:auth=true命令来开启mongodb数据库的用户认证。修改完重启mongodb服务。如下图
2.3 验证用户认证
在没有认证的时候是没法看库的容量的。如下图:
用以下命令来开启用户认证:
db.auth(“yitong”,”yitong123”)来认证用户如下图:
用 show dbs 来查看库
如能看到,证明认证完成。
2.4 添加用户
在mongodb中,默认是 没有用户的,我们要先添加一个超级管理员的用户
use admin 进入admin库中,
db.createUser(
{user:'user', 创建user超级用户
pwd:'passwd', 用户密码为 passwd
roles:[
{role:'userAdminAnyDatabase', db:'admin'} 赋予权限
]
})
如下图:
2.5 修改用户密码
在mongodb中,修改用户密码的命令如下:
db.changeUserPassword()如下图:
2.6 添加权限
Mongodb给用户追加权限是可以在用户创建的时候追加多种权限以下命令:
db.grantRolesToUser()
用户角色介绍如下:
1. 数据库用户角色:read、readWrite;
2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
4. 备份恢复角色:backup、restore;
5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
6. 超级用户角色:root以上所有用户的权限root用户都有
7. 修改用户密码:修改用户的密码changeUserPassword命令来修改。db.changeUserPassword("reporting", "SOh3TbYhxuLiW8ypJPxmt1oOfL")
第三章 命令行工具
3.1 命令介绍
在mongodb/mongo/bin/有好多的命令,下面主要介绍这些命令的用途:
Bosndump ----把Bosn文件转换为人类可读的格式包括json
Mongpdump---备份数据库的命令备份的格式为bson格式。
Mongorestore---恢复备份数据库的命令。
Mongoexport和mongoimport----导入或者导出josn csv tsv格式的数据,支持多种格式。
Mongosniff-----用于查看发给数据库命令的嗅探工具,通常会把bosn转换为人类可读的shell语句。
Mongostat ------与iostat类似,用来查看每秒的数据操作,以及服务器的连接数。
Mongotop ----与top类似 这个工具用来轮训mongodb 并且显示它在每个集群里话费的读取和写入数据的时间总数。
Mongoperf----帮助我们了解mongodb实例磁盘操作的情况。
Mongooplog------展示mongodb操作日志里的信息。
Mongos----是用来创建分布式所使用的命令。
3.2 删除数据库
删除数据库的命令如下:
db.dropdatabase() use到要删除的库,在库下执行此命令,建议删除之前要备份,或者确认是没有文件的库。
3.3 创建数据库
在mongodb中没有创建库,也没有cteate 创建命令,只要use到你要创建的库名称。必须我要新建一个dba库命令如下:
Use dba
然后直接插入数据就OK。
第四章 备份数据库
4.1 备份方式
4.1.1 传统备份
Mongodb的第一种备份方式,是mongodb自带的mongodump命令来备份数据库,使用:
Mongodump –h hostname –uroot –p密码 -d database –o dump。来实现备份,
-h 参数是让我们指定你要备份的是那个主机和IP端口
-d 是指定要备份那个库。如果不指定,则是备份所有的库。
-o 备份的文件放在那。
注意:(这样的备份是没有办法实时备份的,意思就是我们备份期间主库有写的操作在,也是不备份的。如果开启了用户认证,备份的时候需要添加用户名和密码。这个密码必须拥有备份权限。)
恢复数据库的命令为:
Mongorestore –h 127.0.0.1 –uroot –p密码 –o /dump如果mongodb数据库开启了用户认证再恢复的时候也是需要写出用户和密码的,而且必须要有恢复权限,mongodb用户权限。在第三章详细介绍过。
4.1.2 实时备份
想要实时备份必须加上-oplog参数,具体命令如下:
Mongodump –h localhost –oplog /tmp/dump (注意下,本人把备份的文件直接放在tmp目录下,是恢复不回来的,因此在tmp下创建了个dump目录才能恢复回来。)
恢复数据库的命令为:
Mongorestore –h 127.0.0.1 –oplog -o /dump
4.1.3 备份恢复到特定时间段
在上面说到我们可以通过oplog来实时备份,那再想一下mongodb副本集的工作原理,从节点同步主节点来工作,那是不是可以通过这个规则我们回到特定的时间呢?
下面来介绍恢复到特定时间的一种方式,
用mongodump –h hostname –oplog 来备份整个数据库。
用bsondump来查看备份出来的foo.bosn 来查看foo.bosn里面存放了多少数据。
可以用mongorestore –h hostname –oplogReplay –oplogLimit “数据中的timestamp”来恢复到数据特定的时间。
4.1.4 备份数据文件
这种备份方式必须要锁库才能备份,所以建议我们备份从库,把其中的一个从库锁上,不同步数据,再备份,锁库的命令如下:
锁库:db.fsyncLock()
解锁:db.fsyncUnlock()
备份数据文件,恢复比较快捷,备份相对简单。但是不支持这种做法,除非保证一条业务也没有。
第五章 数据回滚
5.1 数据回滚
5.1.1 数据回滚的造成
在主节点接受业务时,还没有写入异地从库时,(为这个业务取一个名称为22。)突然主节点故障宕机,但是22这个数据没还没有同步到异地从库,异地从库接替主节点,继续工作,那22这个数据在从库中是没有的。但是这时候如果原来的主节点排除了故障,需要主节点继续工作,这是就会出现接替不了主的情况。原因为之前的主节点有22这个数据,而异地从库没有22这个数据,只有19.20.21.23。从而会出来节点回滚的情况,两边节点同时回滚到21这个时间点,再同步数据,从而原来的主节点再接替为主节点。
5.1.2 节点回滚时的状态
节点回滚时节点状态为:RECOVERING 只要是这个状态的节点是为正在回滚,回滚成功后会在mongodb指定的data目录下有个rollbback 目录,当中储存着mongodb回滚的数据,我们需要使用mongorestore 命令来导进mongodb库中。
5.1.3 如回滚失败
一般情况下mongodb主节点承受不了太多数据回滚,如果回滚数据超过300MB,那么可能会回滚超过30分钟,回滚就会失败。对于回滚失败的节点,必须要重新同步。
最好的方式就是保持备份节点的数据尽可能最新。
如若回滚失败只能丢掉那一条数据将原来的主节点上的数据清除,再同步回来新的数据。
5.1.4 预防回滚
预防mongodb数据库回滚的方式,如下:
尽量不要频繁的切换主从。
人为测试双活尽量等切换完成再插入数据。
5.2 注释:
注意:默认情况下从节点是不让读取数据的,我们可以开启这个服务可以使用:SECONDARY>db.getMongo().setSlaveOk();命令开启读取功能。