对于Elasticsearch(ES),我了解并有经验。在我之前的公司,我们有一个相对大型的ES集群,以下是该集群的架构和一些调优手段的概述:
1. 集群架构
- 集群规模:我们的ES集群由15个节点组成,涵盖了数据节点和主节点。
- 索引数量:我们有30多个索引,根据不同的数据通道进行划分。每天根据日期递增创建新的索引,大约每天增加20个以上的索引。
- 分片数:每个索引有10个主分片,用于水平分布和并行处理数据。
- 数据大小:每个索引的大小受限制在150GB以内。
(根据实际的项目经验来说 如果没有就按照这个说就行,前提是你得理解技术细节 不然容易露馅)
2. 调优手段
2.1 设计阶段调优
- 基于日期模板创建索引:通过使用roll over API,我们按照日期模板创建新的索引,以便更好地管理和维护数据。
- 使用别名进行索引管理:通过别名来引用索引,而不是直接使用具体的索引名称,简化了索引切换和管理的过程。
- 定时force_merge操作:每天凌晨定时执行force_merge操作,以减少碎片并释放磁盘空间。
- 冷热分离机制:将热数据存储在SSD上,以提高检索效率,同时定期对冷数据进行shrink操作,以减少存储空间占用。
- 使用Curator进行索引的生命周期管理:通过Curator工具自动管理索引的创建、删除和归档等操作。
- 合理设置分词器:针对需要进行全文搜索的字段,选择合适的分词器以提高搜索质量和效率。
- 结合字段属性进行Mapping设置:在Mapping阶段,根据字段的需求和特性,设置是否需要检索、是否需要存储等属性。
2.2 写入调优
- 副本数设置为0:在写入数据之前暂时关闭副本,以提高写入性能。
- 关闭refresh_interval:在写入过程中,将refresh_interval设置为-1,禁用刷新机制,以减少刷新操作对写入性能的影响。
- 批量写入:使用bulk批量写入API,将多个文档一次性提交,减少频繁的网络开销和IO操作。
- 恢复副本数和刷新间隔:在写入完成后,恢复副本数和刷新间隔,以确保数据的可靠性和及时可见性。
- 自动生成ID:尽量使用ES自动生成的ID,避免额外的ID生成操作和性能消耗。
2.3 查询调优
-
禁用通配符查询:尽量避免使用通配符查询,因为它们会增加查询的复杂性和开销。
-
避免批量terms查询:对于包含大量terms的查询,尽量避免使用批量terms查询,以免影响查询性能。
-
合理使用keyword类型:尽可能将字段设置为keyword类型,充分利用倒排索引机制,提高查询效率。
-
基于时间范围进行索引选择:对于大量数据的情况,可以根据时间范围先确定索引,以减少需要搜索的索引数量。
-
设置合理的路由机制,在选择合理的路由机制时,可以考虑以下几个因素:
数据特点:根据数据的特点,选择适合的路由字段。例如,如果数据中包含地理位置信息,可以选择将地理位置作为路由字段,以便将具有相似地理位置的文档存储在相邻的分片上,提高查询效率。
查询需求:根据常见的查询需求,选择合适的路由策略。例如,如果经常根据时间范围进行查询,可以选择将时间作为路由字段,使具有相近时间的文档存储在相邻的分片上,以便快速定位需要查询的数据。
分片数量:考虑集群中的分片数量和规模,选择适当的路由策略。如果集群中的分片较少,可以使用哈希路由(默认路由策略),以确保数据均匀分布。如果集群中的分片较多,可以选择更具体的路由策略,以满足特定的查询需求。
理的路由策略,以实现数据的均衡分布和查询的优化。
2.4 其他调优
- 部署调优:优化硬件配置、网络拓扑和节点布局,以确保集群的性能和可靠性。
- 业务调优:根据具体业务需求和查询模式,优化查询DSL语句、索引设计和数据模型,以提高搜索效率和准确性。(偏向于具体的业务怎么设计)