Elasticsearch 是一个强大的分布式搜索和分析引擎,用于存储、检索和分析大规模数据。为了获得最佳性能、稳定性和可伸缩性,以下是Elasticsearch 的一些最佳实践。
集群规划
节点数量
- 在构建 Elasticsearch 集群时,节点的数量和分布是关键因素。通常建议使用奇数个节点,以便更好地处理主节点选举和故障转移。考虑一个具有 3 个主节点的集群,其中 2 个节点失败,仍然可以保持功能正常。
- 避免单节点集群,因为这会导致单点故障。
分片和副本
分片是数据在集群中的水平划分。在创建索引时,根据数据量和查询负载选择适当的分片数量,通常不超过节点数量的两倍。然后,为了保障数据的可用性,设置足够的副本数,但不要过多,以避免资源浪费。示例如下:
PUT /my_index
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1
}
}
索引设计
分片和副本设置
- 在创建索引时,根据数据量和预期查询负载来选择合适的分片数量。
- 对于热门索引,可以适度增加副本数量以提高查询性能。
索引字段
- 合理选择字段类型,避免使用不必要的复杂类型,例如对于精确值,使用 keyword 类型,对于全文本搜索,使用 text 类型。示例如下:
PUT /my_index { "mappings": {"properties": { "product_name": { "type": "text" }, "category": { "type": "keyword" }, "price": { "type": "float" } } } }
- 关闭不需要索引的字段,以减小索引大小,提高性能。
写入操作
批量写入
使用批量 API 进行写入操作,以减少网络开销。在高吞吐量写入场景中,可以适度增加 Refresh 间隔,减少索引刷新操作,提高写入性能。示例如下:
POST /my_index/_doc/_bulk
{ "index": {}}
{ "field1": "value1" }
{ "index": {}}
{ "field2": "value2" }
索引刷新
避免频繁的索引刷新,可以适当调整 Refresh 间隔以平衡写入和查询性能。示例如下:
PUT /my_index/_settings
{
"refresh_interval": "30s"
}
查询优化
查询性能
-
使用查询DSL进行复杂查询,以充分利用 Elasticsearch 的强大功能。
-
使用索引别名和索引模板来优化查询,示例如下:
GET /my_index/_search { "query": { "bool": { "must": [ { "match": { "product_name": "apple" }}, { "range": { "price": { "gte": 100 }}} ] } } }
分页查询
使用游标(Scroll)进行大数据量分页查询,避免深度分页带来的性能问题。示例如下:
POST /my_index/_search?scroll=5m
{
"query": { "match_all": {}},
"size": 100
}
硬件和监控
硬件选择
- 选择高性能硬件,特别是快速的磁盘和足够的内存。
- 使用 SSD 硬盘来提升索引和查询性能。
监控和警报
- 设置监控指标,如集群健康、节点状态、资源使用等。
- 使用监控工具持续监测集群,并设置警报以便在出现问题时能及时响应。
安全性
认证和授权
- 启用安全性特性,使用用户名密码进行认证。
- 使用角色和权限来限制用户的访问权限。
加密通信
启用 TLS/SSL 加密以保障数据在传输过程中的安全性。
备份和恢复
定期备份索引数据,确保在意外情况下能够快速恢复数据。