-
配置:
常用配置如下:配置示例
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" |
ns |
对应的集合命名空间,如:datacenter_release.order |
query |
操作所使用的查询条件 |
planSummary |
查询的执行计划(此处可以看到是否有用到索引和所用的索引名称) |
找到慢操作后,可以使用:db.killOp(opid)关闭慢操作