目录
1、服务器硬件以及内存调优
1.1、调整交换区的swap大小
1.2、调整普通用户打开文件数以及线程数的限制
1.3、调整ES的JVM堆内存大小
2、ElasticSearch的参数调优
2.1、ES集群自动发现机制
2.2、集群的主节点选举
2.3、集群的故障检测
2.4、集群状态更新
2.5、no Master block机制
2.6、增加 Refresh 时间间隔
2.7、综合调优
1、服务器硬件以及内存调优
1.1、调整交换区的swap大小
(1)尽量关闭linux的交换区的内存空间
swapoff -a
(2)若不能完全禁用swap交换区的空间,则调整swap参数值(尽量调低)
vim /etc/sysctl.conf
vm.swappiness=1(各节点都需要设置)
swappiness参数值可设置范围在0到100之间。 低参数值会让内核尽量少用交换,更高参数值会使内核更多的去使用交换空间。默认值为60。
(3)若没法更改我们的swap的参数值,那么我们也可以在es当中配置,禁止JVM堆内存当中的数据交换到磁盘当中去;
cd /install/elasticsearch-6.7.0/config/
vim elasticsearch.yml 将如下配置设置为true
bootstrap.memory_lock:true
1.2、调整普通用户打开文件数以及线程数的限制
(1)需要解除linux系统当中打开文件最大数目的限制
各节点使用es用户执行以下命令解除打开文件数据的限制:
sudo vi /etc/security/limits.conf 添加如下内容
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
(2)普通用户启动线程数限制
各节点执行以下命令打开文件最大数
sudo vi /etc/sysctl.conf
vm.max_map_count=655360
fs.file-max=655360
执行以下命令生效
sudo sysctl -p
1.3、调整ES的JVM堆内存大小
官方建议ES的堆内存大小不要超过32GB;JVM堆内存大小与系统内存大小,尽量五五分;
cd /install/elasticsearch-6.7.0/config
vim jvm.options
-Xms32g
-Xmx32g
2、ElasticSearch的参数调优
2.1、ES集群自动发现机制
在配置文件中添加ES集群的自动发现机制
vim elasticsearch.yml
discovery.zen.ping.unicast.hosts: ["node01", "node02", "node03"]
配置在每轮ping操作中等待DNS主机名查找的超时时间。需要指定时间单位,默认为5秒。
discovery.zen.ping.unicast.resolve_timeout:30
2.2、集群的主节点选举
(1)Master
Master:主要负责集群中索引的创建、删除以及数据的Rebalance等操作。Master不负责数据的索引和检索,所以负载较轻。
当Master节点失联或者挂掉的时候,ES集群会自动从其他Master节点选举出一个Leader。为了防止脑裂,常常设置参数为discovery.zen.minimum_master_nodes=N/2+1,其中N为集群中Master节点的个数。建议集群中Master节点的个数为奇数个,如3个或者5个。
设置为Master节点的方式如下:(vim elasticsearch.yml)
node.master: true #设置为主节点
node.data: false #不是数据节点
node.ingest: false #不是ingest 节点
search.remote.connect: false #禁用跨集群查询
总结:设置多个master node作为我们集群当中的主节点,其中多个master node会通过选举机制实现选择一个master node作为active,其他的作为standBy,如果master active状态的主节点宕机,es会从其他的standBy状态的主节点当中重新选择一个新的作为active状态的节点。
(2)Data Node
主要负责集群中数据的索引和检索,一般压力比较大。建议和Master节点分开,避免因为Data Node节点出问题影响到Master节点。
设置一个节点为Data Node节点的方式如下:
node.master: false #不是主节点
node.data: true #作为数据二级店
node.ingest: false # 不是ingest节点
search.remote.connect: false #禁用跨集群查询
(3)其他设置
控制节点加入某个集群或者开始选举的响应时间(默认3s)
discovery.zen.ping_timeout:3
一旦节点决定加入一个存在的集群,它会发出一个加入请求给主节点,这个请求的超时时间由discovery.zen.join_time控制,默认是 ping 超时时间(discovery.zen.ping_timeout)的20倍
2.3、集群的故障检测
有两个故障检测进程在集群的生命周期中一直运行。一个是主节点的,ping集群中所有的其他节点,检查他们是否活着。另一种是每个节点都ping主节点,确认主节点是否仍在运行或者是否需要重新启动选举程序。
使用discovery.zen.fd前缀设置来控制故障检测过程,配置如下:
配置 | 描述 |
discovery.zen.fd.ping_interval | 节点多久ping一次,默认1s |
discovery.zen.fd.ping_timeout | 等待响应时间,默认30s |
discovery.zen.fd.ping_retries | 失败或超时后重试的次数,默认3 |
2.4、集群状态更新
主节点是唯一一个能够更新集群状态的节点。主节点一次处理一个群集状态更新,应用所需的更改并将更新的集群状态发布到群集中的所有其他节点。当其他节点接收到状态时,先确认收到消息,但是不应用最新状态。如果主节点在规定时间(discovery.zen.commit_timeout ,默认30s)内没有收到大多数节点(discovery.zen.minimum_master_nodes)的确认,集群状态更新不被通过。
一旦足够的节点响应了更新的消息,新的集群状态(cluster state)被提交并且会发送一条消息给所有的节点。这些节点开始在内部应用新的集群状态。在继续处理队列中的下一个更新之前,主节点等待所有节点响应,直到超时(discovery.zen.publish_timeout,默认设置为30秒)。上述两个超时设置都可以通过集群更新设置api动态更改。
2.5、no Master block机制
对于一个可以正常充分运作的集群来说,必须拥有一个活着的主节点和正常数量(discovery.zen.minimum_master_nodes个)活跃的备选主节点。discovery.zen.no_master_block设置了没有主节点时限制的操作。它有两个可选参数:
all:所有操作均不可做,读写、包括集群状态的读写api,例如获得索引配置(index settings),putMapping,和集群状态(cluster state)api
write:默认为write,写操作被拒绝执行,基于最后一次已知的正常的集群状态可读,这也许会读取到已过时的数据。
discovery.zen.no_master_block,对于节点相关的基本api,这个参数是无效的,如集群统计信息(cluster stats),节点信息(node info),节点统计信息(node stats)。对这些api的请求不会被阻止,并且可以在任何可用节点上运行。
2.6、增加 Refresh 时间间隔
Elasticsearch 在写入数据时候,采用延迟写入的策略,即数据先写到内存中,当超过默认 1 秒 (index.refresh_interval)会进行一次写入操作,就是将内存中 segment 数据刷新到操作系统中。(近实时)
可以通过延长 refresh 时间间隔,可以有效的减少 segment 合并压力,提供索引速度。在做全链路跟踪的过程中,我们就将 index.refresh_interval
同时,在进行全量索引时,可以将 refresh 次数临时关闭,即 index.refresh_interval 设置为 -1,数据导入成功后再打开到正常模式,比如 30s。
2.7、综合调优
ES调优综合参数设置概览:
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 刷新间隔复制代码