开源数据库 MongoDB 专场
MongoDB疑难杂症分析及优化
阿⾥里里云数据库技术
张友东(林林⻘青)2016.10.15
关于我
{
Name: “张友东”,
Company: “阿⾥里里云”,
Position: “技术专家”,
Projects: [“TFS”, “Redis”, “MongoDB”]
Contacts: {
Email: “linqing.zyd@alibaba-inc.com”,
Weibo: “@HUST张友东”
}
}
主要内容
• Driver 使⽤用问题
• 连接池⼤大⼩小如何配置?
• 如何⼲干掉⻓长(慢)请求?
• 复制集问题
• 如何连接复制集?
• 备同步为什什么跟不不上?
• 备节点阻塞很⻓长时间?
• Shared Cluster 问题
• 什什么时候该分⽚片?
• 为什什么分⽚片负载不不均衡?
案例例均源⾃自 MongoDB 云数据库
扫码了了解更更多…
慎⽤用 local、admin
• local:存储节点⾃自身配置信息,数据不不会被同步,重要的数据不不
要存储在 local 数据库,避免数据丢失
• admin:存储⽤用户、⻆角⾊色等管理理信息,写⼊入时会加 DB 级别互斥写
锁,业务数据不不要存储在 admin 数据库,影响性能
database
admin
other
lock
DB 锁
⽂文档锁
insert / s
13500
42600
wiredtiger 引擎
sysbench 16线程 insert
https://yq.aliyun.com/articles/7424
合理理配置连接数
• thread per connection ⽹网络服务模型
• 每个线程需要1MB 的栈空间
• ⼤大量量连接时,线程切换开销⼤大
• 限制连接数资源
client
client
client
mongod
thread
thread
thread
• mongod 配置 net.maxIncomingConnections 参数
• Driver通过 Connection String URI 的 maxPoolSize 参数来配
置连接池⼤大⼩小
https://yq.aliyun.com/articles/59283
避免使⽤用短连接
connect
connect
connect
auth
request1
request2
requestN
close
auth
auth
request1
request2
close
close
• 短连接增加额外的 connect、auth、
close、线程创建及销毁开销
• MongoDB 鉴权性能问题,优化后性能提
示10+倍
https://yq.aliyun.com/articles/35148
⼲干掉⻓长(慢)请求
• 客户端发起耗时请求,如遍历
集合、建索引、mapreduce、
aggregation 等,主动断开连
接后,后端的请求仍然在执⾏行行
• currentOp + killOp 中⽌止后端正
在运⾏行行的请求
killOp原理理:⻓长时间执⾏行行的请求会设置检
查点,发现有 kill 操作就会主动退出
killOp 后,请求执⾏行行到
checkForInterrupt()就会退出
while (!createIndexFinished) {
createIndexForOneElement();
checkForInterrupt();
}
https://yq.aliyun.com/articles/6647
控制集合数量量
• wiredtiger引擎特性
• 每个集合对应⼀一个物理理⽂文件,每个索引对应⼀一个物理理⽂文件
• listDatabases 时,需要遍历所有的集合及索引,逐个获取物理理⽂文件⼤大⼩小信息
• 问题及优化
• 物理理⽂文件太多,数据库管理理开销增加,影响性能,建议启⽤用
storage.directoryPerDB选项,尽量量让物理理⽂文件分散到多个⽬目录。
• listDatabases 开销太⼤大,导致监控系统⽆无法正常⼯工作,还可能影响到主备同步
(全量量同步时,会先 listDatabases 拉取 DB 列列表,设置的超时时间为30s)
• 如果⼀一定需要⼤大量量的集合,可考虑使⽤用 mmapv1或 rocksdb 引擎
https://yq.aliyun.com/articles/58531