MongoDB在360的应用与实践之架构篇

2020-05-22 00:00:00 拆分 数据 集群 节点 分片

女主宣言:

本文来自于8月9日360内部 "web技术之夜"的分享内容,本次分享主要介绍了MongoDB主要特性、MongoDB的部署架构及MongoDB的应用实践。


MongoDB简介

MongoDB是一个基于文档的分布式文件存储数据库,旨在提供可扩展的高性能数据存储解决方案。其高性能,易部署,易使用,存储方便的特点使其深受广大开发者喜爱。

MongoDB主要特性

高性能:单点压测TPS:10w+

高可用:由于网络问题、机器重启或其他问题导致主库不可用时,集群会触发选举以选出新的主节点继续提供服务

一致性:提供fsync,journal刷盘策略及{ w: <value>, j: true/false , wtimeout: n }写策略保证数据一致性。如果集群选举导致数据不一致时,待原主节点添加至集群时,多出来的数据将以BSON格式导出到rollback文件中,以保证数据一致性。

强压缩:支持snappy及zlib压缩模式,可提供2-7倍压缩比

分布式:基于文档的分布式数据存储系统,提供容量及读写扩展

文档化:基于json化的文档记录格式,字段自由增减,3.0后默认文档级别锁

部署架构

单点:所谓的单点就是仅起一个mongod进程提供服务。

• 特点:资源消耗少,部署简单,管理方便,但故障恢复成本较高

集群:多台服务器共同提供服务,以数据冗余的方式提供高可用的服务。常用的集群部署架构有以下两种:

• 副本集(replset set)副本集是一组包含相同数据的mongod服务,架构图如:

  1. 说明:Primary及Secondary节点用于保存数据,Aribter节点不包含数据,仅用于投票。MongoDB引入大多数原则以防止脑裂现象,发起选举的节点必须获取大多数节点的同意才能升级为主节点。如果数据重要的话,可以将Aribter节点替换为数据节点,增加数据冗余以提高集群的可用性及容错性。(QConf相关介绍见第四部分)
  2. 特点:资源消耗少,使用及后期运维方便
  3. 限制:集群的存储容量及TPS受限于单台服务器常见
  4. 问题 A) 现象:not master

原因: a) 连接集群时,没有指定replset参数。驱动以replset参数连接集群时,可自动识别副本集中的主从节点。

b) 集群异常,尚未选举生成主节点。可通过rs.status()命令查看stateStr字段确认。

B) 现象:cursor timeout(以PHP语言为例)

原因: a) 游标超时:$cursor->timeout(xxx); 根据业务需要设置游标超时时间,-1表示游标不超时

b) 数据库慢查,游标生命周期内,数据没有返回。

• 分布式集群(monogs):mongos是MongoDB提出的通过对数据和访问的水平拆分以应对大数据量和高吞吐量应用的数据存储系统的解决方案。通过对数据和访问的水平拆分以满足大数据量和高吞吐量的应用场景。架构图如:

1.节点说明:

• shard:每个shard保存集群的部分数据,合并后构成一份完整的数据集。线上环境中,Shard建议部署为一个副本集以提供数据冗余及高可用。

• mongos:查询路由,将查询及更新操作路由至集群相应shard分片,并将执行结果反馈给用户或应用程序。

• config:存储集群的元数据信息。3.2+开始,config服务器由镜像模式(SCCC)升级为副本集模式(CSRS),以利用标准的副本集的读取和写入协议处理分片的配置元数据,保证config的高可用及数据一致性。

2.特点:结构复杂、弹性扩展、弹性容量

3.分片规则:mongos部署时,需要根据业务场景选择合适的分片键(shard key)以决定mongos如何进行数据切分后存储在对应chunk(chunk是mongos数据存储的小单元)。常见的分片规则有三种:HASH分片、RANGE分片及ZONE分片。

  1. HASH分片:hash分片使用单字段的hash函数作为分片键跨分片集群拆分数据。

数据拆分如图:


• 注意:hash分片下chunk中存储的是hash值而不是真实的值。

• 特点:数据分布均匀

• 适用场景:高效等值查询

2.RANGE分片:range分片依据分片规则将涉及到的数据划分成连续范围的chunk。

数据拆分如图:

• 说明:chunk中存储的数据就是真实的数据。

• 使用场景:范围查询

• 注意点:如果分片键选择不合适的话,容易产生热点数据,形成特大块,导致mongos集群均衡失败。因此基数太小,单个值出现频率太高,单调递增或单调递减等则不适用RANGE分片

3.ZONES分片:自定义区域切片。通过对分片键的特定范围进行标记,并将这些标记与shard关联,实现数据的定向存储。数据拆分如图:


• 使用场景:基于硬件性能差异的数据拆分存储、特定地理位置数据与应用服务近

• 注意事项:区域覆盖的范围包含下界不含有上界;区域不可共享范围亦能有交叉范围数据均衡• Banlancer是一个监控每个分片chunk数量的后台程序,尝试在shard分片间均衡chunk块。

• 数据均衡过程对用户和应用程序完全透明。某些情况下,特别是当数据增长缓慢切数据迁移会影响性能时,可通过设置时间窗确保Banlancer仅在特定时间处于活动状态。设置时间窗命令:

db. getSiblingDB('config') .settings.update( { _id : "balancer" }, { $set : { activeWindow : { start : " <start-time> ", stop : " <stop-time> " } } }, {upset : true} )

QConf介绍

QConf介绍:QConf是奇虎360提供的基于Zoopeeper的配置管理服务,旨在替代传统的配置文件。

详情见: https://github.com/Qihoo360/QConf。

QConf机制:用户或应用程序通过QConf获取集群可用配置信息,然后通过配置信息直连到集群。


QConf vs LVS

QConfLVS优点:应用透明,配置缓存,直连应用透明,简单通用

缺点:业务机器必须部署Agent请求转发建议:高并发、长连接业务优先使用QConf;开源框架及无法安装Agent类业务建议VIP。

本文主要概括了MongoDB常用特性及架构特点,下一篇我们将分享关于MongoDB常见优化及问题的相关内容,敬请期待~

扫描下方二维码了解更多内容

aHR0cDovL3dlaXhpbi5xcS5jb20vci96anNiQTRYRVROZ3pyY0ZnOTI3Yw== (二维码自动识别)

相关文章