0. 手把手教你作中间件、高性能服务器、分布式存储技术交流群nginx
手把手教你作中间件、高性能服务器、分布式存储等(redis、memcache、nginx、大容量redis pika、rocksdb、mongodb、wiredtiger存储引擎、高性能代理中间件),git地址以下: https://github.com/y123456yz/middleware_development_learninggit
Mongodb数据库版本包含企业版本和社区版本,他们的区别是企业版本相比有更多功能,使用企业版本必须购买付费,因此mongodb部分核心功能没有开源。为了加强mongodb集群稳定性,企业须要对开源版本内核进行二次开发,主要包括如下功能模块的开发(增长如下功能后,会有很好的收益):github
开发背景:mongodb社区版本只有mongod有读写时延统计,没有各类详细时延统计功能,同时mongos没有时延统计,例如想看insert、update、delete、find操做的各类详细时延统计,开源版本没有该功能。redis
解决办法:给各类增、删、查、改操做增长详细的平均时延、最大时延等统计。sql
收益:1. 避免扯皮(例如以前线上某个业务线有一次估值,客户端时延提高了数倍,业务方抖动厉害,可是业务方时延监控包括了调用mongodb的时延及其余业务逻辑,这时候就区分不出来是mongodb抖动引发仍是其余业务逻辑抖动引发)。2. 主动发现mongodb抖动问题,没有该功能前,mongodb抖动彻底只能靠业务方发现,或者经过mongodb慢日志发现,可是mongodb慢日志记录得是100ms以上的操做,不能精确的反映各类时延问题。mongodb
开发背景: 因为mongos代理后端能够由多个sharding分片,例如mongos后端有50个sharding分片,若是我要分析整个mongodb集群的慢日志信息,那么就必现去分析后端50个sharding的慢日志,因为慢日志在每一个sharding的主、从上均可能产生,若是每一个sharding分片是一主两从架构,那么久必现分析3*50个mongo数据库实例。分析过程复杂繁琐。数据库
解决办法: 因为代理默认部署就3个实例,直接在mongos代理拦截全部流量,记录下和后端sharding的详细慢日志便可。后端
收益:简化了慢日志收集分析过程,能够更快速的发现不合理的查询、写入等引发的慢日志。服务器
开发背景: mongodb普通用户权限默认拥有全部操做权限(包括删库、删表、建索引等),除非在建立帐号的时候经过privileges来指定actions,若是经过privileges来指定actions会很是麻烦,由于mongodb有数百个不一样actions操做。此外,业务方还得根据本身实际状况来梳理代码使用的action操做,若是想增长某种action,还得提各类申请添加,限制了业务方使用灵活性。架构
解决办法: mongodb中增长普通用户权限控制并对各类危险操做进行过滤,只要是普通用户访问mongodb数据库,就禁止其删库、删表、建库、建表、建索引等危险操做。
收益: 经过在mongodb中增长普通用户权限控制、危险操做过滤,加强了mongodb权限控制及稳定性功能,同时也使得业务方能够随意使用各类不一样的action,使用也更加灵活。
开发背景: 数据库管理人员具备数据库root权限,拥有删库、删表等危险操做权限,若是误操做,将会带来巨大损失。若是某个库被恶意删除,怎么肯定是由那个用户删除的?经过那台客户端登陆的,何时作了该操做?
解决办法: 增长危险操做日志审计功能,记录这些危险操做的详细信息,包括用户、IP地址、key信息等。
收益: 快速定位是由哪位管理员恶意操做引发。此外,若是是业务方使用了删库、删表的操做,一样会记录下整个详细操做信息。
开发背景: 场景1. 业务方感受某个数据丢了,怀疑是数据库丢数据了。可是mongodb管理员以为mongodb很稳定,不存在丢数据的状况,管理员以为是客户端本身删除了,到底是业务方本身删的仍是mongodb丢数据呢? 场景2. 业务方在某个时间段作了几个误操做,误删除了一些数据,想找出在这个时间段内误删除的具体数据。
解决办法: 把全部的增、删、改操做过程详细记录下来。
收益: 1. 避免扯皮。2.业务方想要的任意时间段的操做数据均可以获取出来,便于他们进行问题分析排查。
6. 给mongodb增长热备功能
开发背景: mongodb社区版本没有热备功能,若是须要备份数据库数据,须要对某个Mongod实例下线进行冷备。或者经过mongodump工具进行主从数据备份(该工具就是模拟mongodb的slave先作全量数据同步,而后拉取Oplog进行增量同步)。若是是冷备,须要停机某个副本,等cp拷贝整个mongodb数据完成后,而后在继续上线,这种备份方式须要下线实例对业务影响比较大。若是是经过mongodump方式模拟slave来拉取数据,在全量数据拉取过程当中,会占用较大带宽,业务方时延会有较大抖动。此外,经过mongodump工具拉取数据很是慢,线上拉取400G数据须要10个小时左右,若是须要增长一个slave,经过这种方式彻底不可接受。
解决办法: 借助wiredtiger存储引擎机制,增长热备功能。
收益: 1. 热备期间对业务影响较小。2. 备份数据时间下降百倍数量级,例如400G数据经过mongodump方式须要10小时,可是经过热备方式只须要几分钟便可。
若是对mongodb数据库和wiredtiger存储引擎源码感兴趣,能够参考以下注释:
https://github.com/y123456yz/reading-and-annotate-mongodb-3.6.1