mongodb常用配置及维护
-
配置:
常用配置如下:配置示例net:port: 27017##监听端口systemLog:destination: filepath:"mongod.log"##日志文件存放位置logAppend:true##追加模式写日志storage:engine: wiredTiger##数据引擎类型,强烈推荐wiredTigerdbPath: /data/soft/mongodb-3.2.1/data##数据存放位置journal:enabled:true##生产环境强烈推荐打开wiredTiger:engineConfig:cacheSizeGB: 2##引擎缓存大小,3.4版本开始,默认值为:(内存的一半-1G)或256M,取最大的那个statisticsLogDelaySecs: 3600##日志刷新间隔journalCompressor: snappy##日记压缩方式,允许的值:none,snappy,zlibdirectoryForIndexes:false##子目录存储索引和数据collectionConfig:blockCompressor: snappy##数据文件压缩方式,允许的值:none,snappy,zlibprocessManagement: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/shDATE=`date+%Y%m%d`DEL_DATE=$(date-d'-3 days'"+%Y%m%d")HOST=127.0.0.1PORT=27017USER=rootPASSWORD=密码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_FILEecho"创建备份目录$BACKUP_PATH ..."mkdir-p $BACKUP_PATH#第一步锁表lock(){echo"db.fsyncLock()"| ./mongo--host $HOST --port $PORT -u $USER -p $PASSWORD admin}execute(){lockif[ $? -eq0 ]thenecho"mongodb lock successfully!">>$LOG_FILEelseecho"mongodb lock fail!">>$LOG_FILEfi}execute#第二步备份back(){rsync-av $DATA_DIR $BACKUP_PATH/}execute(){backif[ $? -eq0 ]thenecho"mongodb back successfully!">>$LOG_FILEelseecho"mongodb back fail!">>$LOG_FILEfi}execute#第三部解锁unlock(){echo"db.fsyncUnlock()"| ./mongo--host $HOST --port $PORT -u $USER -p $PASSWORD admin}execute(){unlockif[ $? -eq0 ]thenecho"mongodb unlock successfully!">>$LOG_FILEelseecho"mongodb unlock fail!">>$LOG_FILEfi}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)关闭慢操作
浙公网安备 33010602011771号