Primary Shard(主分片)
Primary Shard(主分片)是索引数据存储的基本单位,承担着数据写入和查询的职责。以下是关于Primary Shard的一些关键点:
1. 数据分布:每个索引在创建时会被分成多个主分片,这些主分片分布在不同的节点上,以此来实现数据的分布式存储和水平扩展。主分片的数量在索引创建时设定并且之后不能更改。
2. 数据写入:当新的文档被写入Elasticsearch时,首先会被写入到对应的主分片中。这个过程涉及到文档的索引、分析以及存储。
3. 容错机制:主分片的存在也提供了故障恢复的能力。如果某个节点发生故障,其上的主分片可以在其他节点上通过副本分片(Replica Shard)自动重新分配,保证数据的可用性。
4. 查询路由:查询操作首先会路由到相关的主分片或其副本上执行,然后汇总结果返回给客户端。这意味着查询负载可以被主分片及其副本共同分担,提高了查询效率。
5. 数据恢复与再平衡:在集群扩容或缩容时,Elasticsearch会自动对主分片进行再平衡,以优化数据分布。此外,在节点故障后,未分配的主分片会触发故障转移机制,确保数据的完整性和服务的连续性。
6. 不可变性:一旦主分片中的数据被写入,它就被视为不可变的。任何更新或删除操作实际上都是通过新增一个文档版本来实现的,旧版本的文档最终会在段合并过程中被标记为已删除。
ElasticSearch 索引设计
1. 基于时间对Index进行分割
根据时间间隔与数据产生时间将数据写入不同的Index中,为了易于区分,会在Index的名字中加上对应的时间标识。
常见的间隔有小时、天、周和月:先考虑总共要存储多久的数据,然后选一个既不会产生大量Index又能够满足一定灵活性的间隔,比如你需要存储6个月的数据,那么一开始选择“周”这个间隔就会比较合适。考虑业务增长速度:假如业务增长的特别快,比如上周产生了1亿数据,这周就增长到了10亿,那么就需要调低这个间隔来保证有足够的弹性能应对变化。
2. 分片与副本策略
合理分配分片数量,过多的分片会增加管理和查询的复杂度,太少则可能限制水平扩展能力。Elastic专家根据经验总结出来大家普遍认为:单个Shard的存储大小不超过30GB。
评估分片数量:单个Index的Primary Shard个数 = k * 数据节点个数。(key为小整数:1~2)
合理设置副本,一个或多个副本可以提供高可用性和负载均衡。
3. 映射定义(Mapping)
生产环境下需要禁用动态映射,明确定义字段的数据类型,避免动态映射可能导致的性能问题和数据不一致。使用合适的数据类型,例如使用keyword类型存储精确值,使用text类型并配合分析器处理全文搜索。应用字段长度限制,避免过大的文档导致内存溢出。利用norms、doc_values等属性优化存储和查询性能。
4. 分析器(Analyzer)
分词器的主要作用将用户输入的一段文本,按照一定逻辑,分析成多个词语的一种工具,顾名思义,文本分析就是把全文本转换成一系列单词(term/token)的过程,也叫分词。
根据内容选择合适的分析器,创建索引时指定分词器,搜索时指定analyzer查询参数。
5. 索引模板(Index Templates)
把已经创建好的某个索引的参数设置(settings)和索引映射(mapping)保存下来作为模板,在创建新索引时,指定要使用的模板名,就可以直接重用已经定义好的模板中的设置和映射。
如果你需要每间隔一定的时间就建立一次索引,你只需要配置好索引模板,以后就可以直接使用这个模板中的设置,不用每次都设置settings和mappings。
6. 生命周期管理(ILM)
设定索引的生命周期策略,自动进行滚动、归档和删除,管理索引的存储和成本。
所以,前期投入时间进行细致的索引设计是必要的,它不仅能够提升系统的整体性能,还能简化后续的维护工作,降低长期运营成本,确保系统稳定可靠地服务于业务需求。
参考:6000+字讲透ElasticSearch 索引设计 -阿里云开发者社区 (aliyun.com)