建云科技网站首页,成都游戏开发,广告平台对接,公司有网站域名 如何做网站mongodb问题分析
现状
表的个数#xff1a;
生产上常用的表就10来个。
sharding cluster replica set方式部署#xff1a;
9个shard server#xff0c; 每个shard server 1主2从#xff0c; 大量数据写入时或对大表创建索引时#xff0c;可能有主从复制延迟问题。实…mongodb问题分析
现状
表的个数
生产上常用的表就10来个。
sharding cluster replica set方式部署
9个shard server 每个shard server 1主2从 大量数据写入时或对大表创建索引时可能有主从复制延迟问题。实测下来20亿表的索引创建导致主从延时4小时因为从表在建索引的时候会停掉主从复制。
一个shard server挂掉恢复起来很慢一般要半个小时。而且一个shard server挂掉目前会导致整个集群不可用此点需要定位。
一个shard server里的master挂掉剩下2个从是可以选出一个master出来的只不过选举中间不能写只能读。另外一个shard server里的三个节点是分散在3个AZ的所以断AZ的情况下可靠性是有保障的。
平时做需求会有加索引的要求但是你对一张百亿级别的表做索引这个耗时是很长的哪怕放到晚上做也要5~6个小时之久。万一晚上没做完第二天就可能影响replica set里从节点的复制操作。
还有业务上大量使用事务加剧了主从复制延迟情况下的集群负担造成mongodb连接池和处理线程的耗尽并波及到incoming request的处理最后导致整个docker都处于不健康状态。
我们的业务特点是读优先写慢一点、不及时都可以容忍。
问题清单
一个shard server挂掉可能导致整个集群不可用
是我们使用的方法问题还是shard server真的就完全不可用了因为shard server内部是一主二从且为多AZ分布理论上完全可以通过降低C一致性来保证A可用性不会说完全不可用。在这个基础上我个人认为双活的意义可能不是很大双活只是为了提高可用性。
数据量继续以每月千万级的规模增长下如何保证业务查询效率不降低
增加分片但增加分片时尽量不要引发大量的数据均衡。
业务逻辑大量使用事务有没有问题
mongo的事务本质上是一个分布式事务效率不高遇到异常大概率要成为瓶颈。需要从业务层面评估是否确实需要事务能不能通过修改表结构减少事务的使用。
因业务需要对大表加索引如何降低对集群的影响
索引是提升查询效率的重要手段属于以空间换时间这种行为是不可避免的。那么如何降低建索引对集群的影响。
核心要素主从复制延时
主从复制延时应该是不可避免的因为本身从机把oplog拉到本地redo就是异步的在正常情况下这个时间差不会很大好像就1~2s。但如果有以下几点
因为大量写入导致的主机cpu、io负载很高网络异常时延增加从机在忙着干其它事比如创建索引
这个时延就可能扩的很大。
大量写入及随后的自动均衡、针对大表建索引都会导致第一个情况发生。
主从时延大对于强调一致性的系统来说影响很大不仅仅是各节点数据不一致的问题这个要看业务是否有强一致性诉求还会影响读写操作本身。因为对这样的系统而言写入成功的标准往往不是单点写入成功就行而是要半数以上的节点写入成功主从延时大可能会导致写操作挂住或失败而大量的写失败或挂住又会影响读的可用性一方面是连接数和线程数的消耗另一方面是读可能依赖于写比如readConcern里的majority为避免脏读要求读的是大部分节点写入的数据。
突破口
主从复制延时的解决
要考虑几点
尽量减少主从复制延时发生的概率降低主从复制延时对业务的影响主从复制延时后的恢复时间要尽可能短。
解决思路
mongodb备份/ 新增分片的数据均衡/ 大表建索引/ 大量数据不均衡写入/ 慢SQL 这些因素的混合影响前三者如何把时间错开修改readPreference做到读写分离由此带来的数据非最新、不全、不同人做相同的查询结果可能不一样等等要有心里准备。另外如果开启了自动均衡由于还未结束或者异常终止的chunk迁移secondary返回的可能是有缺失或者多余的数据 。但这里有个问题读写分离是不是就能降低主从复制延时的影响需要测试设置writeConcern的wtimeout事务失败后的重试保证恢复手段将从节点隐藏使事务尽快结束
事务的必要性
首先假如用嵌套文档解决了表与表之间的关联性因为mongo里记录级的修改都是原子的是不是就可以不需要事务了
第二如果后面要改成从机读这样读到的数据本身就没法保证一致性取决于主从复制的速度 当前这么广泛的事务使用还有必要吗
高可用
我理解跟ES一样要考虑几个点
异常情况下的master选举要能启动否则集群只读replica要够确保异常情况下数据尽量不丢失shard受损的情况下的行为是怎样的AZ恢复后的双master脑裂风险
参考该文。