刘云汉 郭继光
(中国电子科技集团公司电子科学研究院 北京市 100041)
卫星影像数据文件大小不一,具有多时态、大数据量,且随时间延长,数据量不断增加的特点,单台服务器内存、CPU 资源难以支撑海量数据的存储和高效访问。MongoDB分片复制集群,将数据分散到不同的MongoDB 节点,具有负载均衡、故障切换和故障恢复等特点,适合存储卫星影像等海量小文件数据,能够提供更大的读写吞吐量。
MongoDB 高可用集群有主从复制(Master-Slaver)、副本集(Replica Set)和分片(Sharding)模式三种部署模式。如表1 所示。
表1:分片、副本集集群对比
主从复制(Master-Slaver)模式不推荐使用,主节点宕机不能自动恢复。
Replica Set 模式取代了 Master-Slaver 模式,是一种互为主从的关系。Replica Set 将数据复制多份保存,不同服务器保存同一份数据,在出现故障时自动切换,实现故障转移,在实际生产中非常实用。Replica Set 是mongod 的实例集合,它们有着同样的数据内容。包含主节点(Primary)、副本节点(Secondary)和仲裁者(Arbiter)三类角色。一个复制集群只有一个主节点,主节点接收所有写请求,读请求可以通过配置均衡分配到主节点和副本节点。通过数据复制实现副本节点和主节点的数据同步,当主节点挂掉时,会从副本节点中选取一个作为主节点,复制集群中节点的数量应为奇数。
Sharding 模式适合处理大量数据,它将数据分开存储,不同服务器保存不同的数据,所有服务器数据的总和即为整个数据集。
Sharding 模式追求的是高性能,而且是三种集群中最复杂的。在实际生产环境中,通常将 Replica Set 和 Sharding两种技术结合使用。
MongoDB Sharding 分片复制集群适用于存储海量数据、瞬间并发读写高的场景。其主要有以下特性:
(1)故障切换:Sharding 集群中每个分片节点采用ReplicaSet 集群来实现高可用性,当某个分片节点的复制节点出现故障时,可自动切换至副本节点,从而避免单点故障造成数据丢失或影响数据库服务。
(2)负载均衡:分片复制集群会将不同分片部署到不同服务器上,Sharding 集群通过数据分片机制将数据均匀分布到多个数据节点上,减少了单机数据存储量,提高数据存储总量。通过设置多个mongos 节点,通过mongos 节点上配置的负载均衡机制,促使每个 shard 节点上的数据块大小趋于平衡,减小单一节点的读写压力。
(3)故障恢复:Sharding集群中,每一个数据分片(shard)被部署成 ReplicaSet 模式,分片复制集群具有备份、自动容错转移、自动恢复能力,能够实现数据存储服务的高可用。
如图 1 所示,mongodb 的集群架构主要由3 部分组成:配置服务服务器集群,路由节点服务器集群,分片+复制服务器集群。
图1:Mongodb 集群的分布式架构
(1)路由进程 (Route Process):路由进程是一个mongos 实例,是数据库集群请求的入口,负责将数据请求转发到对应的Shard 服务器上。实际部署时,通常配置多个Mongos 节点,防止其中一个挂掉导致整个集群无法响应的情况。
(2)配置服务器(Config Server):存储所有数据库元信息(路由、分片)的配置。Mongos 节点本身不存储分片服务器和数据路由信息,只是缓存在内存里。Mongos 第一次启动或重启后会从配置服务器加载配置信息,如果配置信息变化,配置服务器会将变化信息通知路由服务器。实际部署时,为防止配置信息的数据丢失,通常配置多个配置服务器。
(3)分片服务器(Shard Server):分片服务器是存储实际数据的地方,也称为分片节点。每个分片节点可以是一个 mongod 实例,也可以是一组 mongod 实例构成的复制集。
MongoDB 基于MongoDB 文档数据库和其内置的GridFS 实现文件数据的统一管理。
(1)对于<16M 的数据文件,转换为二进制,直接插入数据库,使用Binary数据类型存储。MongoDB的操作如下:
(2)对于≥16M 的大文件,使用GridFS 文件系统存储。GridFS 将大文件对象分割成多个小的chunk(256K 文件片段),以两个集合配合的方式存储。其中fs.files 集合存储文件名称、文件大小、文件片段数量、文件存储时间等文件元数据信息;fs.chunks 集合存储文件实际内容。GridFS 文件操作如下:
通过MongoDB 存储文件将数据库与文件绑定,可通过检索数据库获取文件,避免文件位置变化导致文件丢失。
海量数据存储需要通过数据分片来应对高吞吐量和大数据量,当集群主机性能到达瓶颈时可以通过水平扩展提高存储容量和吞吐量。
MongoDB 的自动分片是将数据库中的集合数据按照一定的规则切分成若干小块,这些分片的数据写入和读取统一由mongos 管理,路由会依据shard key 的分片规则找到对应的分片。
3.2.1 片键选择方式
最常用的数据分片方式有三种:升序片键、随机分发的片键和基于位置的片键。
(1)升序片键:升序片键通常有点类似于"date"字段或者是ObjectId,是一种随着时间稳定增长的字段。缺点:例如ObjectId 可能会导致接下来的所有的写入操作都在同一块分片上。
(2)随机分发的片键:随机分发的片键可以是用户名,邮件地址,UDID,MD5 散列值或者数据集中其他一些没有规律的键。缺点:MongoDB 在随机访问超出RAM 大小的数据时效率不高。
(3)基于位置的片键:基于位置的片键可以是用户的IP、经纬度、或者地址。这里的"位置"比较抽象,不必与实际的物理位置字段相关。
3.2.2 片键选取规则
(1)片键限制:片键不可以是数组。文档一旦插入,其片键就无法修改了。要修改文档的片键值,就必须先删除文档。
(2)片键的势:选择一个值会变化的键非常重要,即值很多,随着数据量的增大可以分出更多的片键。分片在势比较高的字段上性能更佳。
综上所述,卫星影像数据存储采用卫星编号作为分片键。分片的语句定义如下:
对数据库启用分片:sh.enableSharding (“satsjdb”);
为验证MongoDB 分片集群的性能,通过3 台机器搭建MongoDB 分片集群,机器的配置如表2 所示。
表2:配置表
4.2.1 MongoDB 高可用测试
基于上述搭建的高可用集群,测试分片复制集群的负载均衡和故障切换性能。
(1)执行插入程序插入千万级数据,执行db.test.getShardDistribution()指令查看集合数据的分布情况。如图2所示。
图2
(2)执行指令停掉21 服务器上分片1 的服务,查看分片状态如下:21 上分片1 的节点状态变成not reachable;22上分片1 的节点状态变成PRIMARY;执行分片1 上数据的读写操作,能够正常响应。如图3 所示。
图3
结论:数据能够根据分片键均匀分布到分片节点上;当某个分片的主节点宕机时,副本节点能够自动切换为主节点;某个路由服务或配置服务器停止时,客户端能够正常访问数据库,整个集群在测试过程中均稳定无差错运行。
4.2.2 MongoDB 集群扩容测试
新增三台服务器,组成分片4,执行指令为admin 数据库绑定shard4,执行操作如下:
db.runCommand({addshard:"shard4/10.17.2.24:22004,10.17.2.25: 22004,10.17.2.26:22004"});
通过指令查看集合数据的分布情况如图4 所示。
图4
结论:新加分片后,数据会根据分片键将数据迁移至分片4,并实现数据在4 个分片的均匀分布;可通过扩充服务器实现集群存储容量的水平扩展。
MongoDB 分片复制集群基于自动分片机制,不同的分片之间可以负载均衡,具有高并发、高可靠性和高效扩展存储等特点。能够实现海量小文件和大文件的统一存储管理,数据的访问效率优于传统的关系型数据库,能够满足遥感影像数据的存储访问需求。