如传统的关系数据库 MySQL,在事务型应用及多业务多表关联查询方面有着出色的表现,但是面对健康码系统复杂繁多的数据类型,特别是文本关键字搜索能力时显得捉襟见肘。腾讯云 ES 基于 lucene 查询引擎构建,通过倒排索引结构,可以快速的通过搜索关键字找到所需要的记录,在万亿级海量数据规模性,依然能达到毫秒级的查询响应。相比于使用传统关系型数据库的 like 命令进行匹配查找,搜索查询效率提升了近百倍。
倒排索引结构
对于比较热门的 NoSQL 类产品 MongoDB,虽然和 ES 一样,能满足多样化的数据类型的支持,且可以根据业务的需要随时动态的增加字段且不影响业务正常的查询写入,但是同样缺少文本关键字的检索能力。且相比于 ES 来说,缺少海量数据的分析聚合能力及图形化的 UI 组件。腾讯云 ES 通过 doc_value 列存结构及聚合框架,支持包括按关键字分桶、时间分桶、距离分桶、求平均值、求和、求地理位置边界等等,多达 60 种聚合算子。
配合 kibana 组件的 UI 能力,可以通过图形化的方式进行海量数据的分析。同时,通过配置图形报表等形式,简化运营分析人员的开发复杂度,最终能使防疫相关的部门及人员,通过 ES 的数据分析能力,做到对于疫情防控的情况了如指掌。
在海量数据的存储方面,虽然相当多的大数据产品,如 hive 数仓、Hbase 等,拥有海量的数据存储能力,且具备一定的数据分析能力,但是相比于 ES 来说,不仅整个技术栈及架构比较重,需要维护的开源组件繁多,通常需要一支专门的运维团队进行集群的日常维护。对于开发人员来说,开发方法及接口较为复杂,对于初次接触大数据平台的开发者来说需要具备相当多的基础知识后才能开始上手开发。
腾讯云 ES 采用分布式架构,索引数据通过分区算法,分割为多个数据分片(shard),平均的分布在集群的多个节点上。通过节点和数据分片的能力,可以线性的扩展索引数据写入查询的吞吐,这个是传统的单实例数据库所不具备的。
由于健康码系统内部的数据,随着疫情的进展会持续的增长且很难预测数据的最终量级,需要能比较灵活的增加 ES 的存储空间。在用户自建的集群上,如果需要节点的配置升级,通常需要采购插拔新的存储设备,或者需要将新的节点加入到集群中,等待数据从老的节点上进行迁移。这个过程通常会持续小时到天之久,通常由集群的数据规模所决定。
腾讯云 ES 构建于基础 IaaS 层之上,使用 CVM 及 CBS 云硬盘,具有一定的存储计算分离能力。存储空间可以动态的扩展,对于 ES 节点来说完全是透明的,无感知的。类似健康码这样的数据规模不断增长的需求,一次存储空间的扩展操作从过去的小时或天的级别降低到了秒级,且所有的集群变更操作都可以在腾讯云控制台上进行,极大的降低了集群配置变更的运维复杂度,把后台业务人员从繁重的运维工作中解脱出来。
腾讯云 ES 服务支持多可用区容灾的功能,当一个可用区因为机房电力、网络等故障的原因导致不可用时,另外一个可用区的节点仍然能稳定、不间断的提供服务,保障客户业务的可靠性。
这也是基于 ES 的分布式原理,当用户选择使用支持多可用区容灾的腾讯云 ES 集群后,系统会为用户在多个可用区部署节点,且节点会平均的部署到各个可用区机房中。由于索引数据是可以进行分片,且设置副本。根据 ES 的分片分配原理,所有的分片及副本会平均的分布在所有的节点之上。这就保证了,如果设置的副本数和可用区数目一致,当有一个节点乃至一个可用区机房不可用,剩余节点中的分片仍是一份完整的数据,且主从分片可以自动切换,集群仍然可以持续的对外提供写入查询服务。