mongodb常用配置及维护

  • 配置:
    常用配置如下:

    配置示例

    net:

     port: 27017 ##监听端口

    systemLog:

       destination: file

       path: "mongod.log" ##日志文件存放位置

       logAppend: true ##追加模式写日志

    storage:

       engine: wiredTiger ##数据引擎类型,强烈推荐wiredTiger

       dbPath: /data/soft/mongodb-3.2.1/data ##数据存放位置

       journal:

          enabled: true ##生产环境强烈推荐打开

       wiredTiger:

          engineConfig:

             cacheSizeGB: 2 ##引擎缓存大小,3.4版本开始,默认值为:(内存的一半-1G)或256M,取最大的那个

             statisticsLogDelaySecs: 3600 ##日志刷新间隔

             journalCompressor: snappy ##日记压缩方式,允许的值:none,snappy,zlib

             directoryForIndexes: false ##子目录存储索引和数据

          collectionConfig:

             blockCompressor: snappy ##数据文件压缩方式,允许的值:none,snappy,zlib

    processManagement:

       fork: true ##后台方式运行数据库进程

    replication:

      oplogSizeMB: 2048 ##副本集操作日志大小,值越大,允许的宕机时间就越多,否则一旦某台机器宕机时间过大,会导致超过操作日志大小的那部分数据无法同步

      replSetName: candao_release ##副本集名称

    sharding:

      clusterRole: shardsvr ##分片群集中的身份

    security:

       keyFile: /data/soft/mongodb-3.2.1/mongo-key ##集群间用于通信的安全密钥文件

       clusterAuthMode: "keyFile" ##集群认证模式

       authorization: "enabled" ##是否开启用户认证

  • 客户端的读写策略:
    用户端访问分片的 mongos 跟访问单个 mongod 类似,所有 mongos 是对等关系,用户访问分片集群可通过任意一个或多个mongos。
    mongos 本身是无状态的,可任意扩展,集群的服务能力为『Shard服务能力之和』与『mongos服务能力之和』的最小值。
    访问分片集群时,最好将应用负载均匀的分散到多个 mongos 上。

    所有官方的driver都支持以 Connection String 的方式来连接 MongoDB 副本集或分片集群。
    Connection String的格式: mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

    • mongodb:// 前缀,代表这是一个Connection String
    • username:password@ 如果启用了鉴权,需要指定用户密码
    • hostX:portX 多个 mongos 的地址列表
    • /database 鉴权时,用户帐号所属的数据库
    • ?options 指定额外的连接选项,在options里添加readPreference=secondaryPreferred即可实现读请求优先到Secondary节点,从而实现读写分离的功能。更多读选项
    • readPreference值说明:

  • primary 默认值,所有请求都从primary读取
    primaryPreferred 所有请求都从primary读取,当primary不可用时, 从secondary读取
    secondary 所有请求都从secondary读取
    secondaryPreferred 所有请求都从secondary读取,当secondary不可用时, 从primary读取
    nearest 所有请求都从最近(通信延迟最低)的成员读取,而不管其类型为primary或secondary


写策略:
    写策略有如下参数字段: { w: <value>, j: <boolean>, wtimeout: <number> }

  • w

    指定本次操作需要写入到集群的多少台机器后才算写入成功,默认值:1

    当w>1时,本次写入需要给定值数量的机器都返回成功后本次写入才算成功 w=majority时,写到大多数机器才算成功(性能会有所影响),这个值根据副本集内有投票权的机器数量决定(数量足够完成一次选举),适合对可靠性要求非常高的场景
    j

    标识是否需要将本次写入同步到日记文件后才算成功

    wtimeout

    本次写入的超时时间

    在JAVA客户端驱动内,可以这样指定写策略: MongoClient.setWriteConcern(WriteConcern.xxxx);

  • 备份

  • 文件快照 文件快照是最简单的备份方法,不过需要文件系统本身支持快照技术,以及配置中打开了日记功能(journal) 参见:如何创建文件快照
    复制data目录 在没有文件快照支持的情况下,可以使用这种试,注意复制时,需要禁止数据库的写入 可以使用如下命令:db.fsyncLock()/db.fsyncUnlock()对数据库进行锁定和解锁 恢复时,只需要把原目录删除或移走,然后将备份的文件放到数据目录既可。
    mongodump 官方提供的一种备份工具,速度较慢,但可以单独备份指定的库或集合。

    目前我们的备份脚本如下:

    #!/bin/sh

    DATE=`date +%Y%m%d`

    DEL_DATE=$(date -d '-3 days' "+%Y%m%d")

    HOST=127.0.0.1

    PORT=27017

    USER=root

    PASSWORD=密码

    DATA_DIR="/data/soft/mongodb-3.2.1/data"

    BACKUP_PATH="/data/mongodbbackup/$DATE"

    LOG_FILE="/data/mongodbbackup/mongoback.log"

    DEL_PATH="/data/mongodbbackup/${DEL_DATE}/"

    date +%Y%m%d%H%M >>$LOG_FILE

    echo "创建备份目录$BACKUP_PATH ..."

    mkdir -p $BACKUP_PATH

    #第一步锁表

    lock()

    {

    echo "db.fsyncLock()"|  ./mongo  --host $HOST --port $PORT -u $USER -p $PASSWORD  admin

    }

    execute()

    {

      lock

      if [ $? -eq 0 ]

      then

        echo "mongodb lock successfully!" >>$LOG_FILE

      else

        echo "mongodb lock fail!" >>$LOG_FILE

      fi

    }

    execute

    #第二步备份

    back()

    {

    rsync -av $DATA_DIR $BACKUP_PATH/

    }

    execute()

    {

      back

      if [ $? -eq 0 ]

      then

        echo "mongodb back successfully!" >>$LOG_FILE

      else

        echo "mongodb back fail!" >>$LOG_FILE

      fi

    }

    execute

    #第三部解锁

    unlock()

    {

    echo "db.fsyncUnlock()"|  ./mongo  --host $HOST --port $PORT -u $USER -p $PASSWORD  admin

    }

    execute()

    {

      unlock

      if [ $? -eq 0 ]

      then

        echo "mongodb unlock successfully!" >>$LOG_FILE

      else

        echo "mongodb unlock fail!" >>$LOG_FILE

      fi

    }

    execute

    #删除历史数据

    rm -rf $DEL_PATH

     

    #将以上脚本保存为backup.sh,在命令行输入:

    $>crontab -e

    #在打开的文件中输入:

    0 3 * * * sh /data/soft/mongodb-3.2.1/bin/backup.sh  #每天凌晨3点执行备份

    #保存并退出

  • 性能监控
    a.打开数据库profiling:db.setProfilingLevel(level, slowms)

level integer 0关闭profiling,1仅输出慢操作,2输出所有操作(影响性能)
slowms integer 大于等于此值,则会被判定为慢操作

b.耗时操作的处理:
   查看当前操作:db.currentOp(),可以传ture或者一个查询对象做为参数
      当传ture时:只统计未关闭连接的操作和系统操作 
      当传对象时:和普通查询一样,返回匹配的操作结果
      返回值:
          重点关注以下几个参数:

opid
操作ID
secs_running
已运行时间
op
操作类型,可能的值有:

"none"
"update"
"insert"
"query"
"getmore"
"remove"
"killcursors"

ns
对应的集合命名空间,如:datacenter_release.order
query
操作所使用的查询条件
planSummary
查询的执行计划(此处可以看到是否有用到索引和所用的索引名称)

   找到慢操作后,可以使用:db.killOp(opid)关闭慢操作

猜你喜欢

转载自blog.csdn.net/u011311514/article/details/81168972