节点规划
- 数据节点 :只存储索引数据和数据查询
node.master: false node.data: true
- Master节点:不存储任何索引数据。该node主要协调各种创建索引请求或者查询请求,将这些请求合理分发到相关 的node服务器上
node.master: true node.data: false
- 只读节点:不会被选作主节点,也不会存储任何索引数据。该服务器主要用 于查询负载均衡。在查询的时候,通常会涉及到从多个node服务器上查询数据,并请 求分发到多个指定的node服务器,并对各个node服务器返回的结果进行一个汇总处理, 最终返回给客户端。
node.master: false node.data: false
关闭data节点服务器中的http功能
针对ElasticSearch集群中的所有数据节点,不用开启http服务。将其中的配置 参数这样设置:http.enabled: false
可以在非数据节点上开启HTTP 功能,以及部署第三方插件。
一个服务器只部署一个数据节点
- 服务器硬件配置建议:内存>64G,cpu 16C,
服务器内存分配建议:以64G内存为例,jvm内存最大堆最大大小32G(不建议超32G), GC 算法建议使用GC1,默认CMS。如果大于128G可以跑两个ES实例。
ES_MIN_MEM=32g ES_MAX_MEM=32g JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC" JAVA_OPTS="$JAVA_OPTS -XX:MaxGCPauseMillis=200 -Xss128m"
如果在一个机器上跑多个ES实例,需设置
cluster.routing.allocation.same_shard.host:true
参数,防止同一个shard的主副本存在同一个物理机上, -Xss设置线程大小Master节点建议CPU 内核数 >=16
- 数据节点建议SSD+Reid 0
比如100节点的ES集群,建议至少3个master 节点,10个只读节点,剩下全是数据节点。
系统参数设置
swapping设置:
vm.swappiness = 1
mlockall配置文件设置:
bootstrap.mlockall: true
- ulimit设置
ulimit -n 65536 ulimit -l unlimited ulimit -s unlimited
- segment memory内存优化:
a. 删除不用使用索引;
b. 关闭索引;
c. 定期对不再更新的索引做optimize(合并segment memory); - 索引的settings进行优化:
"index.translog.flush_threshold_ops":"10000" "refresh_interval" : "1s"
这两个参数第一是到translog数据达到多少条进行平衡,默认为5000,而这个过程相对而言是比较浪费时间和资源的。所以我们可以将这个值调大一些还是设为-1关闭,进而手动进行translog平衡。第二参数是刷新频率,默认为1s是指索引在生命周期内定时刷新,一但有数据进来能refresh像lucene里面commit,我们知道当数据addDoucment后,还不能检索到要commit之后才能行数据的检索,所以可以将其关闭,在最初索引完后手动refresh之,然后将索引setting里面的index.refresh_interval参数按需求进行修改,从而可以提高索引过程效率。
索引副本数:
"number_of_replicas": 0
建议在索引过程中将副本数设为0,待索引完成后将副本数按需量改回来,这样也可以提高索引效率。
分片数,计算公式:基于索引分片数=数据总量/单分片数
分片(Shard):一个索引会分成多个分片存储,分片数量在索引建立后不可更改,推荐【分片数*副本数=集群数量】 ,默认配置如下:
index.number_of_shards: 5 number_of_replicas: 1
Elastic官方文档建议:一个Node中一个索引最好不要多于三个shards,配置total_shards_per_node参数,限制每个index每个节点最多分配多少个发片.