yjiang's cake

mongodb监控与索引优化工具 -- dex

监控

#连接mongo客户端,执行  
db.setProfilingLevel(1)   #开启prifile监控, 0 关闭,1 记录慢命令,2 记录全部
db.getProfilingLevel()    #查看当前监控等级
db.system.profile.find()  #查看监控日志

索引优化工具 -- dex

1. pip install dex 
2. 连接mongo shell, 执行` db.setProfilingLevel(1) `开启监控,等待监控几天生成日志
3. 运行 dex -p mongodb://myUser:myPass@myHost:12345/myDb 查看有待优化的字段

mongo_dex

执行后如上图,工具会生成建议的索引优化命令,在mongo shell里执行即可.

mongo副本集安全认证

普通实例下开启mongo认证只需增加--auth参数来启动即可,但是运行在副本集状态下时,与普通模式有点区别:

  • 副本集模式需要使用key来认证,参数 --keyFile;并且增加此参数后将自动启用用户认证;
  • 使用key认证则必须指定log文件,参数 --logpath

使用openssl生成key文件

openssl rand -base64 580  > mongo_rst.key 
chmod mongo_rst.key 300    # key文件权限必须为 x00 ,即用户组及其它无任何权限,例如300

示例

mongod --replSet myrst --dbpath=/opt/mongo/db1/ --port 30001 --keyFile /opt/mongo/mongo_rst.key --bind_ip=127.0.0.1,192.169.0.2 --logpath=/opt/mongo/logs/rst1.log

mongo副本集本地测试启动脚本

#!/bin/sh
function command(){
    ###################################
    rst_name=myrst
    port=3000$1                                                                                                                                                                                                   
    log_path=/opt/mongo/logs/rst$1.log
    bind_ip=127.0.0.1
    key_file=/opt/mongo/mongo_rst.key
    db_path=/opt/mongo/db$1/
    ###################################
    nohup mongod --replSet $rst_name --dbpath=$db_path --port $port --keyFile=$key_file --bind_ip=$bind_ip --logpath=$log_path > /dev/null 2>&1 &
}
command 1
command 2
command 3

mongo副本集

自己为了测试方便,使用一台机器,将mongo执行在不同端口,并指定了多个目录存放数据

环境准备

  • 安装mongodb,此处不再赘述

  • 创建数据存放目录,例/tmp/mongo/db1/

  • mongo_repset_1

  • 以副本集方式启动mongo服务,根据环境不同可能运行的命令也不相同,但参数都一样

开启各节点服务

28017端口需要提供WEB管理工具,因此不能占用 只有两个节点时,副本集将不具备真正的故障转移能力,故而官方推荐的副本集是至少3个节点.

mongod --replSet {repset_name} --dbpath=/tmp/mong/db1/ --port=30001 > /dev/null 2>&1 & 
mongod --replSet {repset_name} --dbpath=/tmp/mong/db2/ --port=30002 > /dev/null 2>&1 & 
mongod --replSet {repset_name} --dbpath=/tmp/mong/db3/ --port=30003 > /dev/null 2>&1 &
mongod --replSet {repset_name} --dbpath=/tmp/mong/db4/ --port=30004 > /dev/null 2>&1 & #作为仲裁节点,没有仲裁节点无法实现自动切换主从

参数说明: --replSet 以副本集方式运行服务 --dbpath 指定数据存放路径 --port 指定端口

写入配置
service mongodb start #启动服务 
mongo #执行cli工具 
use admin # 
rs.initiate({'_id':'myrst', 'members':[{'_id':0,'host':'127.0.0.1:30001','priority':2}, {'_id':1,'host':'127.0.0.1:30002','priority':1}, {'_id':2,'host':'127.0.0.1:30003','priority':1}, {'_id':3, 'host':'127.0.0.1:30004','priority':1,'arbiterOnly':true}] });
# priority:1 设置优先级, 'arbiterOnly':true 设为仲裁节点

此时将看到如图所示,即表示成功运行

mongo_repset_2

后面登陆副本集的mongo客户端,需要加端口 mongo --port 30001
本地副本集启动脚本

查看运行状态

rs.status()

添加新节点/仲裁节点

  1. 增加新的副本集服务

    mongod --replSet {repset_name} --dbpath=/tmp/mong/db1/ --port=30001 > /dev/null 2>&1 &

  2. 登陆主节点client,进行如下操作

    mongo --port 30001 use admin rs.add("127.0.0.1:30004") #添加新节点 rs.addArb("127.0.0.1:30004") # 添加仲裁节点

删除节点

  1. 查找原有副本集并kill掉其进程

  2. 登陆主节点client,进行如下操作

    mongo --port 30001 use admin rs.remove("127.0.0.1:30004")

设置子节点可读写

rs.slaveOk()

 重新进行主节点选举

     rs.stepDown()

 重新设置节点优先级

此功能亦可实现节点的强制切换

方式1 提高某一节点优先级
config=rs.conf()
config.members[1].priority=2
rs.reconfig(config)
方式2 全部重设
config={"members" : [
   {"_id" : 0,"host" : "127.0.0.1:30001", priority : 1},
   {"_id" : 1,"host" : "127.0.0.1:30002", priority : 2},
   {"_id" : 2,"host" : "127.0.0.1:30003", priority : 1},
   {"_id" : 3,"host" : "127.0.0.1:30004", priority : 1, 'arbiterOnly':true}
]}
rs.reconfig(config)

mongo

全局用户认证

1. admin表增加用户admin
    db.addUser({'admin','admin'});
2. 使用全局用户认证登陆
    mongo {ip}/{dbname} -u {username} -p {password} --authenticationDatabase admin

添加删除用户

1. use db_name
2. db.createUser({user:'username', pwd:'passwd', roles:['readWrite', 'dbAdmin']})
# 2.5版开始已启用addUser()
3. db.dropUser('username')

点此查看官方添加用户文档

导入导出

导出
mongodump --authenticationDatabase=dbname -u username -p passwd -d dbname -o out_path --port 30000

导入
mongorestore -d dbname db_file_path

点此查看官方备份恢复文档

Copyright © 2016 yjiang's cake

返回顶部