腾讯云 ES 采用分布式架构,索引数据通过分区算法,分割为多个数据分片(shard),平均的分布在集群的多个节点上。通过节点和数据分片的能力,可以线性的扩展索引数据写入查询的吞吐,这个是传统的单实例数据库所不具备的。由于健康码系统内部的数据,随着疫情的进展会持续的增长且很难预测数据的最终量级,需要能比较灵活的增加 ES 的存储空间。在用户自建的集群上,如果需要节点的配置升级,通常需要采购插拔新的存储设备,或者需要将新的节点加入到集群中,等待数据从老的节点上进行迁移。这个过程通常会持续小时到天之久,通常由集群的数据规模所决定。腾讯云 ES 构建于基础 IaaS 层之上,使用 CVM 及 CBS 云硬盘,具有一定的存储计算分离能力。存储空间可以动态的扩展,对于 ES 节点来说完全是透明的,无感知的。类似健康码这样的数据规模不断增长的需求,一次存储空间的扩展操作从过去的小时或天的级别降低到了秒级,且所有的集群变更操作都可以在腾讯云控制台上进行,极大的降低了集群配置变更的运维复杂度,把后台业务人员从繁重的运维工作中解脱出来。
腾讯云 ES 服务支持多可用区容灾的功能,当一个可用区因为机房电力、网络等故障的原因导致不可用时,另外一个可用区的节点仍然能稳定、不间断的提供服务,保障客户业务的可靠性。这也是基于 ES 的分布式原理,当用户选择使用支持多可用区容灾的腾讯云 ES 集群后,系统会为用户在多个可用区部署节点,且节点会平均的部署到各个可用区机房中。由于索引数据是可以进行分片,且设置副本。根据 ES 的分片分配原理,所有的分片及副本会平均的分布在所有的节点之上。这就保证了,如果设置的副本数和可用区数目一致,当有一个节点乃至一个可用区机房不可用,剩余节点中的分片仍是一份完整的数据,且主从分片可以自动切换,集群仍然可以持续的对外提供写入查询服务。
防疫工作机构及人员需要每天及时掌握疫情的防控情况,需要不定时的对数据进行汇总分析查询。然而,在全国海量的防疫数据场景下,集群很容易由于不严谨的聚合分析语句导致大量的数据在节点内存中进行分桶,排序等计算,从而使节点发生 OOM 的问题,造成节点乃至整个集群的雪崩。为了防止此类情况发生导致的集群不可用,腾讯云 ES 在存储内核上开发了基于实际内存的熔断限流机制。当集群发现部分节点的 JVM 使用率超过设定的熔断阀值,会进行服务降级,梯度的拦截部分查询的请求,直至 JVM 使用率超过 95%会最终熔断,阻止所有的查询请求。这个熔断的请求拦截机制会覆盖 Rest 层及 Transport 层,通过将熔断提前至 Rest 层,可以尽早的将请求进行拦截,降低集群在熔断状态下的查询压力。通过这些措施,保证了健康码小程序海量查询下的服务可用性及查询性能。
4、数据安全,万无一失
近年来,海内外数据泄露事件频出。健康码系统使用的腾讯云 ES 在安全方面做了最高级别的优化,包括支持配置内外网访问黑白名单,支持集群权限认证功能。极大的提高了数据的安全性。并且,不同用户集群之间通过 VPC 进行网络隔离,杜绝了潜在的黑客入侵的风险。 腾讯云 ES 支持基于 COS 的增量数据备份功能,用户可以通过 ES 原生的索引生命周期管理功能,定时增量的备份底层的数据文件到腾讯云对象存储 COS。当需要的时候,可以随时将数据备份恢复至任意的集群,保证了数据的安全可靠性,做到数据的万无一失。结语:腾讯防疫健康码目前已广泛应用于机场、火车站、高速公路、商业区、小区等防疫检查卡口,有效帮助卫生防疫部门全面排查疑似患者,阻击疫情的快速传播。健康码能如此稳定安全的支撑 10 亿级别的数据访问,腾讯云 ES 在数据搜索查询、高并发、弹性扩展以及安全领域的技术功不可没,后续腾讯云将继续针对用户需求,不推打磨技术和产品,为更多用户提供稳定安全可靠的 Elasticsearch 服务。 推荐阅读:腾讯万亿级 Elasticsearch 技术解密