集群调优
- elasticsearch.yml 中尽量只写必备参数其他通过api动态设置
- 参见文档 setup elasticsearch -》impotant elasticsearch configuration
- 随着es升级 很多网络流传的配置参数不再支持
基本参数设置
- cluster.name
- node.name
- node.master/node.data/node.ingest
- network.host 建议指定的内网ip 而不是偷懒设置为0.0.0.0
- discovery.zen.ping.unicast.hosts 设置为集群其他节点地址
- discovery.zen.minimum_master_nodes一般设定为2
- path.data/path.log
- 除上述参数外再根据需要再增加其他静态配置参数
- 动态设定的参数有transient和persistent两种,前者再集群重启后会丢失,后者不会,但是两种设置都会覆盖elasticsearch.yml的配置
jvm内存
- 不要超过31GB
- 余留一半给操作系统,用来做文件缓存
具体大小根绝存储的数量来估算,为了性能,在内存和数据量间有一个建议的比例
- 搜索类项目的比例建议在1:16以内
- 日志类项目比例在1:48 - 1:96
- 假设总数据量大小为1TB 3个node 1副本 那么每个node存储的数量为666GB,即700GB,预留20%,每个node存储850GB数据
- 如果是搜索类,每个node内存大小为850GB/16=53GB 大于31GB 31*16=496 即每个node最多存储496GB数据 即最少需要5个node
- 如果是日志类项目 每个node内存大小为850GB/48=18GB因此三个节点足够
写性能优化
目标是增大写的吞吐量eps
客户端 多线程写
es 在高质量数据建模的前提下 主要在refresh translog flush 之间做文章
降低refresh频率
- 增加refresh_interval 降低实时性 增大每次refresh文档处理数,默认为1s 设置为-1 禁止自动refresh
- 增加index buffer size 参数为indices.memory.index_buffer_size 静态参数 需要设定在elasticsearch.yml 默认为10%
降低translog写磁盘的频率 提高写效率 但是 降低了灾备的能力
- index.translog.durability 设置为async index.translog.sync_interval设置需要的大小 例如 120s那么translog每120s写一次磁盘
- index.translog.flush_threshold_size 默认为512mb 即translog超过大小时会触发一次flush,那么调大该大小可以避免flush发生
- 设置副本数0 写入完毕后再增加
合理设计shard数 保证shard均匀分布在集群上 充分利用资源
- index.routing.allocation.total_shards_per_node限定每个索引在每个node上可分配的总主副分片数
5个node某索引有10个主分片 1个副本 上述值该设置为多少?
- (10+10)/5=4
- 实际设置5个 放置在node下线时 分片迁移失败
读优化
- 高质量的数据建模是优化的基础
- 将需要通过script脚本动态计算的值提高准备好作为字段存储在文档中
- 尽量使得数据模型贴近业务模型
设定shard数
- es性能是线性扩展的 只需要测出一个shard的性能指标,然后根据需求算出需要几个shard,例如单个shard写入eps是10000 那么需求是50000 则需要5个shard
测试单个shard
- 搭建与生产相同配置的单节点集群
- 设定一个单分片零副本索引
- 写入实际生产数据进行测试 获取性能指标
- 针对数据进行查询请求 获取读性能指标
- 压测用具可选esrally
- 搜索场景 单个shard大小不要超过15gb,如果是日志场景 单个shard不要超过50GB shard越大 查询性能越低
- 此时只要估算出索引总数居大小再除以单个shard大小也可以得到分片数
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。