赞
踩
目录
MongoDB 作为一款广受欢迎的现代文档数据库,其高可用性(High Availability, HA)、高性能(High Performance)和高可扩展性(High Scalability)是其核心特性,使得它在各种大规模数据处理场景中表现出色。
MongoDB 有如下特点:
下面来分别介绍下"三高",高可用、高性能、高可扩展的原理。
应用数据集的大小在飞速增加。传感器技术的发展、带宽的增加,以及可连接到因特网的手持设备的普及使得当下即便很小的应用也要储存大量数据,量大到很多数据库应付不过来。
MongoDB 从设计之初就考虑扩展的问题。采用了面向文档的数据模型使其可以自动在多台服务器之间分割数据,进行数据分片(sharding)。还可以平衡集群数据和负载,自动重排文档,这样只需要在集群中添加新机器,然后让数据库处理接下来的事。
分片是 MongoDB 实现水平扩展的关键技术,通过将数据切分为多个分片(shards),每个分片可以是一个副本集,分散存储在不同的服务器上。
分片通过分片键(shard key)将数据均匀分布到各个分片,客户端通过查询路由器(mongos)透明地访问分片数据,实现对大规模数据集的高效管理和查询。
MongoDB 使用 MongoDB 传输协议作为与服务器交互的主要方式。它对文档进行预分配数据文件,用空间获取性能稳定。默认的存储引擎中使用了内存映射文件,将内存管理工作交给操作系统处理。
那什么事预分配数据文件呢?当 MongoDB 需要存储新的数据时,它不会等到数据实际写入时才去请求磁盘空间,而是提前在数据文件中预留一定的空间。这意味着在写入数据之前,MongoDB 会创建或增大数据文件,使其包含足够的未使用的空间来接纳预期的写入操作。预分配文件减少了频繁的文件扩展操作,减少了磁盘I/O。
MongoDB 的高性能还体现在索引方面,索引使用 B-Tree 结构,包含了单建索引、复合索引、多键索引、TTL索引、主键索引等等,数据是数据库系统必不可少的部分,通过合理创建和使用索引来加速查询性能。
MongoDB 采用了异步非阻塞 I/O 模型,利用异步处理避免线程阻塞等待 I/O 完成,利用非阻塞 I/O 减少线程上下文切换,从而实现高效的数据读写操作,提升系统的并发处理能力和资源利用率。
MongoD 的副本集模式可以设置读扩展,默认情况下,客户端从 Primary 读取数据,当负载为读取密集型时,可以通过配置将读取操作发送到 Secondary 节点上,减轻主节点的压力,提升查询性能。
除了读扩展,MongoDB 支持数据分片(Sharding),能够将大型数据集水平分割并在多个服务器上分布存储,实现数据和处理能力的水平扩展。随着数据增长或负载增加,可以通过添加更多分片节点来分散负载,保持高性能。分片原理如图:
另外,MongoDB 还具有高效的写入性能,支持批量插入、更新删除操作,减少了网络交互次数。MongoDB 的存储引擎采用类似日志结构的记录方式,写入操作通常为追加写入,降低了磁盘随机写入的开销。
MongoDB 的复制工具称为副本集(replica set),它可提供自动故障转移和数据冗余。副本集包含一个主节点(Primary)和多个从节点(Secondary)。主节点接受所有写入操作并将数据变更同步到从节点,形成数据的多副本,确保即使主节点故障,数据也不会丢失。
从节点可处理读请求,通过配置读偏好(Read Preference),应用程序可以根据需要将读操作定向到主节点或从节点,实现读负载均衡和高可用读取。
数据一致性:写操作默认要求至少写入大多数节点(包括主节点)才视为成功,确保在主节点故障后,新选举出的主节点能够接续之前的状态,保持数据一致性。
水平扩展:对于海量数据,MongoDB 支持分片技术,将数据分散存储在多个分片集(Shard)中,每个分片集又是一个副本集。分片能够水平扩展存储容量和处理能力,分散查询负载,进一步提高系统的可用性和性能。
监控与告警:能够监控运行状态,并在有问题时发出告警。
综上所述,MongoDB通过副本集实现高可用性,确保数据持久性和服务连续性;通过内存优先、索引优化等技术提供高性能数据访问;通过分片技术实现数据的水平扩展,支持大规模数据处理和弹性扩容。这些特性共同构成了MongoDB高可用、高性能、高可扩展的特性组合,使之成为处理现代大规模数据应用的理想选择。
往期经典推荐
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。