elastic stack 那些事【9】

集群调优

  1. elasticsearch.yml 中尽量只写必备参数其他通过api动态设置
  2. 参见文档 setup elasticsearch -》impotant elasticsearch configuration
  3. 随着es升级 很多网络流传的配置参数不再支持

基本参数设置

  1. cluster.name
  2. node.name
  3. node.master/node.data/node.ingest
  4. network.host 建议指定的内网ip 而不是偷懒设置为0.0.0.0
  5. discovery.zen.ping.unicast.hosts 设置为集群其他节点地址
  6. discovery.zen.minimum_master_nodes一般设定为2
  7. path.data/path.log
  8. 除上述参数外再根据需要再增加其他静态配置参数
  9. 动态设定的参数有transient和persistent两种,前者再集群重启后会丢失,后者不会,但是两种设置都会覆盖elasticsearch.yml的配置

jvm内存

  1. 不要超过31GB
  2. 余留一半给操作系统,用来做文件缓存
  3. 具体大小根绝存储的数量来估算,为了性能,在内存和数据量间有一个建议的比例

    1. 搜索类项目的比例建议在1:16以内
    2. 日志类项目比例在1:48 - 1:96
  4. 假设总数据量大小为1TB 3个node 1副本 那么每个node存储的数量为666GB,即700GB,预留20%,每个node存储850GB数据
  5. 如果是搜索类,每个node内存大小为850GB/16=53GB 大于31GB 31*16=496 即每个node最多存储496GB数据 即最少需要5个node
  6. 如果是日志类项目 每个node内存大小为850GB/48=18GB因此三个节点足够

写性能优化

目标是增大写的吞吐量eps
客户端 多线程写
es 在高质量数据建模的前提下 主要在refresh translog flush 之间做文章

  1. 降低refresh频率

    1. 增加refresh_interval 降低实时性 增大每次refresh文档处理数,默认为1s 设置为-1 禁止自动refresh
    2. 增加index buffer size 参数为indices.memory.index_buffer_size 静态参数 需要设定在elasticsearch.yml 默认为10%
  2. 降低translog写磁盘的频率 提高写效率 但是 降低了灾备的能力

    1. index.translog.durability 设置为async index.translog.sync_interval设置需要的大小 例如 120s那么translog每120s写一次磁盘
    2. index.translog.flush_threshold_size 默认为512mb 即translog超过大小时会触发一次flush,那么调大该大小可以避免flush发生
  3. 设置副本数0 写入完毕后再增加
  4. 合理设计shard数 保证shard均匀分布在集群上 充分利用资源

    1. index.routing.allocation.total_shards_per_node限定每个索引在每个node上可分配的总主副分片数
    2. 5个node某索引有10个主分片 1个副本 上述值该设置为多少?

      1. (10+10)/5=4
      2. 实际设置5个 放置在node下线时 分片迁移失败

读优化

  1. 高质量的数据建模是优化的基础
  2. 将需要通过script脚本动态计算的值提高准备好作为字段存储在文档中
  3. 尽量使得数据模型贴近业务模型

设定shard数

  1. es性能是线性扩展的 只需要测出一个shard的性能指标,然后根据需求算出需要几个shard,例如单个shard写入eps是10000 那么需求是50000 则需要5个shard
  2. 测试单个shard

    1. 搭建与生产相同配置的单节点集群
    2. 设定一个单分片零副本索引
    3. 写入实际生产数据进行测试 获取性能指标
    4. 针对数据进行查询请求 获取读性能指标
    5. 压测用具可选esrally
  3. 搜索场景 单个shard大小不要超过15gb,如果是日志场景 单个shard不要超过50GB shard越大 查询性能越低
  4. 此时只要估算出索引总数居大小再除以单个shard大小也可以得到分片数

你可能感兴趣的:(java)