这里写自定义目录标题
- ES调优
- 写入调优
- 批量操作
- 单个批次一次发送几十m左右的数据
- 写入数据时先关闭副本,写入后再开启副本
- 写入数据时禁止segment自动merge,禁止自动刷新写入后再开启
- 设置合适的分片
- 线程池大小优化
- 默认使用文档ID进行路由
- JVM设置
- 配置调优
- 常用配置
ES调优
写入调优
批量操作
单个批次一次发送几十m左右的数据
使用Bulk
写入数据时先关闭副本,写入后再开启副本
写入数据时禁止segment自动merge,禁止自动刷新写入后再开启
- 禁止自动刷新
“index”: {
“refresh_interval”: “-1” // 禁止自动刷新数据
} - 禁止自动merge
PUT /_cluster/settings
{
"transient" : {
"indices.store.throttle.type" : "none"
}
}
设置合适的分片
建议分片大小为50G左右;1GB堆内存对应20-25个分片
线程池大小优化
threadpool.index.size: 64 线程池大小(建议2~3倍cpu数)
默认使用文档ID进行路由
自带文档ID会导致每次都需要确认该文档是否存在
JVM设置
- 堆内内存设置不要超过32G,防止64位内存指针压缩技术对于大于32G的内存失效
- Lucene会使用大量的堆外内存,需要预留一般的内存给它。
- 避免交换内存 bootstrap.mlockall: true
配置调优
index.merge.scheduler.max_thread_count:1 #索引merge最大线程数
indices.memory.index_buffer_size:30% #内存
index.translog.durability:async #这个可以异步写硬盘,增大写的速度(可能会有数据丢失)
index.translog.sync_interval:120s #translog间隔时间
discovery.zen.ping_timeout:120s #心跳超时时间
discovery.zen.fd.ping_interval:120s #节点检测时间
discovery.zen.fd.ping_timeout:120s #ping超时时间
discovery.zen.fd.ping_retries:6 #心跳重试次数
thread_pool.bulk.size:20 #写入线程个数 由于我们查询线程都是在代码里设定好的,我这里只调节了写入的线程数
thread_pool.bulk.queue_size:1000 #写入线程队列大小
index.refresh_interval:300s #index刷新间隔
常用配置
cluster.name: estest 集群名称
node.name: “testanya” 节点名称
node.master: false 是否主节点
node.data: true 是否存储数据
index.store.type: niofs 读写文件方式
index.cache.field.type: soft 缓存类型
bootstrap.mlockall: true 禁用swap
gateway.type: local 本地存储
gateway.recover_after_nodes: 3 3个数据节点开始恢复
gateway.recover_after_time: 5m 5分钟后开始恢复数据
gateway.expected_nodes: 4 4个es节点开始恢复
cluster.routing.allocation.node_initial_primaries_recoveries:8 并发恢复分片数
cluster.routing.allocation.node_concurrent_recoveries:2 同时recovery并发数
indices.recovery.max_bytes_per_sec: 250mb 数据在节点间传输最大带宽
indices.recovery.concurrent_streams: 8 同时读取数据文件流线程
discovery.zen.ping.multicast.enabled: false 禁用多播
discovery.zen.ping.unicast.hosts:[“192.168.169.11:9300”, “192.168.169.12:9300”]
discovery.zen.fd.ping_interval: 10s 节点间存活检测间隔
discovery.zen.fd.ping_timeout: 120s 存活超时时间
discovery.zen.fd.ping_retries: 6 存活超时重试次数
http.cors.enabled: true 使用监控
index.analysis.analyzer.ik.type:”ik” ik分词
thread pool setting
threadpool.index.type: fixed 写索引线程池类型
threadpool.index.size: 64 线程池大小(建议2~3倍cpu数)
threadpool.index.queue_size: 1000 队列大小
threadpool.search.size: 64 搜索线程池大小
threadpool.search.type: fixed 搜索线程池类型
threadpool.search.queue_size: 1000 队列大小
threadpool.get.type: fixed 取数据线程池类型
threadpool.get.size: 32 取数据线程池大小
threadpool.get.queue_size: 1000 队列大小
threadpool.bulk.type: fixed 批量请求线程池类型
threadpool.bulk.size: 32 批量请求线程池大小
threadpool.bulk.queue_size: 1000 队列大小
threadpool.flush.type: fixed 刷磁盘线程池类型
threadpool.flush.size: 32 刷磁盘线程池大小
threadpool.flush.queue_size: 1000 队列大小
indices.store.throttle.type: merge
indices.store.throttle.type: none 写磁盘类型
indices.store.throttle.max_bytes_per_sec:500mb 写磁盘最大带宽
index.merge.scheduler.max_thread_count: 8 索引merge最大线程数
index.translog.flush_threshold_size:600MB 刷新translog文件阀值
cluster.routing.allocation.node_initial_primaries_recoveries:8 并发恢复分片数
cluster.routing.allocation.node_concurrent_recoveries:2 同时recovery并发数
使用bulk API 增加入库速度
初次索引的时候,把 replica 设置为 0
增大 threadpool.index.queue_size 1000
增大 indices.memory.index_buffer_size: 20%
index.translog.durability: async –这个可以异步写硬盘,增大写的速度
增大 index.translog.flush_threshold_size: 600MB
增大 index.translog.flush_threshold_ops: 500000