Mongodb一些往事

Posted 企鹅狗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mongodb一些往事相关的知识,希望对你有一定的参考价值。

处理这种大数据落地的场景,要考虑两点:


  1. 怎么提高性能,减少落地所需要的总时间

  2. 异常恢复,程序异常后能从断点恢复


提高性能


首先要分析耗时的环节、性能的短板在哪里,要把所有关键环节的耗时记录下来,在我们的场景里面,有几个关键环节:


1).去供应商通过sdk获取数据

2).数据解析和清洗转化,里面涉及到用已经有的数据去补全一些字段

3).数据写入mongodb


去供应商获取数据首先要看sdk机制,是否允许多个连接或者多个登录,如果可以的话,可以多线程并行,我们这里是不允许的,所以并行是不允许的,但有个地方是可以做的,就是批量获取数据到本地,我们知道网络传输肯定比本地处理慢很多,所以尽量设计成批量获取。


数据解析和清洗转化,基本上要求放在内存中处理,用到list、map等数据结构,这里要注意的有两点,一点是每次处理完要清空这些数据结构,因为确实很占内存;另外一点就是用到本地的数据,例如股票代码表,根据代码补充名称,需要预加载这部分数据到内存,否则每次都去查数据库,也会影响性能和稳定性。


数据写入mongodb原则上采用批量插入,在大数据场景下基本不做update,如果需要update,可以先批量删除,然后再insert,因为update肯定会涉及到查询,批量的优势就没有了。另外在批量插入也不是一次性越多越好,mongodb对于插入操作会先放在内存,一次太多,让数据在网络传输和mongodb的内存中停留太久时间,很容易因为异常丢数据,一次性插入多少,需要根据网络条件、机器配置自行测试,我们在内网下,16G的mongodb节点,一次性插入的记录数不会超过1W。


异常恢复


大数据落地的过程是一个很长期的过程,在这个过程中经常会出现升级程序、程序崩溃、操作系统被重启、网络中断、mongodb集群维护等情况,而我们的领域是金融产品领域,对于数据的准确性要求极高,对于1天的数据,几千只股票,如果在同步一半的时候挂掉了,要怎么处理才合适呢?


一般的做法,这一天的数据删掉重来,但是你发现同步一天就要一个晚上,删掉重来浪费时间。


至于其他的对比数据校验、update就不要提了,更多的时候还不如删掉重来快。


我们的做法是针对每天每只股票的同步状态加个记录,同步前,开始同步,同步完毕,如果中断了,那么把这一天股票代码全部拉出来,同步完的,直接忽略,否则删掉这天这只股票的数据,重新同步,这样就保证最大限度保证准确性同时也不浪费时间。


程序大概跑了半个月的样子,发现单个节点不够用了,于是启用mongodb自动分片集群。


mongodb牛逼之处在于只要你内存和磁盘足够多,它就不会挂,而且它还自带数据压缩,能做到压缩70%的压缩率,我们当时的索引数据就500G了。


自动分片


在做自动分片集群的时候,首先要搭建副本集,一主一备一仲裁,保证一个副本集有单数节点,这样主节点挂掉从节点能被选作主节点。我们第一次副本集搭建了4个,每个副本集两台机器,每台机器上一个数据节点一个仲裁节点,数据节点只要挂掉一个都还能选举。在一个mongodb自动分片集群有几个角色:


1)mongos,对外暴露的连接客户端,一个mongodb自动分片集群可以有多个mongos给应用层调用

2)配置集群,副本集架构,存储整个集群的配置信息

3)数据集群,副本集架构,存储整个集群的实际数据


在搭建好一个初步的结构后,你想要加机器扩容,你只需要执行一个mongodb命令添加机器即可,不需要动配置,它的方便主要体现在两个方面:


1)在副本集里面加从节点,只需要添加节点就可以了,数据初始化和同步会自动做,这一点比mysql强多了,详细mysql添加一个从节点有多麻烦;

2)在自动分片集群里面添加一组数据副本集也只要执行一个命令就可以了,添加后数据平衡器会基于数据分布规则把其他分片的数据同步到这个新的副本集来,这样保证整个分片的数据按数据分布规则分布(基于hash的均匀分布、基于key的range分布等等)


鉴权


mongodb自带鉴权功能,方式跟mysql差不多,不过对于版本3,默认是不开鉴权,因为配置需要自己配置,很多人不知道鉴权怎么配置,这就导致大部分mongodb数据可以免登陆进去,特别当你放在公有云上的时候,基本就暴露给外面,只要扫描端口就能扫到你用的是mongodb然后进去......这就是去年爆发的mongodb安全问题。


在数据量小的时候使用鉴权没有什么问题,我们的场景是这个大数据集群对线上开放,结果出现了一个坑,就是经常出现连接超时,最后发现鉴权是很耗费性能,当出现并发高的时候整个集群因为鉴权被拖死,最后没有办法,我们只好去掉鉴权,改用网络隔离,针对外面调用,以sdk形式提供,在sdk层做鉴权。


写到这里,mongodb已经在云财经正式商用2年多了,我们用mongodb来落地过千亿的数据,大量的离线计算也是基于mongodb,想起当年刚刚准备用这套方案,去中国科学院深圳先进院跟一个博士交流,他说mongodb不靠谱,他熟读mongodb代码,去海外交流过,有很多bug,会丢数据,当时只是碍于一点就是要我们拿100W出来组建联合实验室,才没让他们搞,如果我们当时不是看在钱的份上,估计这一套东西也不会真的出来,所以在技术上,真理还是得靠实践去检验,没有大规模应用就没有发言权。


完。


以上是关于Mongodb一些往事的主要内容,如果未能解决你的问题,请参考以下文章

mongodb的一些小总结

MongoDB中的一些坑(最好不要用)

mongodb的一些技术点

MongoDB基础以及一些聚合操作

MongoDB基础以及一些聚合操作

MongoDB基础以及一些聚合操作