配置高性能Elasticsearch集群的9个小贴士
规划索引、分片 以及集群增长情况
-
在配置前了解集群的拓扑结构
通过独立的master节点和data节点来运行ES,为索引和搜索使用单独的ES client节点,这将减轻data节点的一些负载。Master node: node.master:true node.data:false Data node: node.master:false node.data:true Client node: node.master:false node.data:false
内存设置
ES的mlockall属性允许ES节点不交换内存
```
bootstrap.mlockall: true
```
- discovery.zen属性控制ElasticSearch的发现协议
从2.0开始往后服务发现就仅支持单播了,只需要找到集群中的一个节点就能将该节点加入集群
当心
Delete _all
设置不允许删除索引时的模糊匹配
action.destructive_requires_name: true
使用
doc_values
(官方文档里面没看到过)集群配额类属性设置
cluster.routing.allocation.cluster_concurrent_rebalance
: 设置允许并发再平衡的分片数量。默认值是2,表示任意时刻只允许同时移动2个分片。最好将该属性设置得较小,以便压制分片再平衡,使其不影响索引。
cluster.routing.allocation.disk.threshold_enabled
: 默认值true
。表示在分配分片到一个节点时将会把可用的磁盘空间算入配额内。Recovery属性允许快速重启(这个配置比较复杂)
线程池属性防止数据丢失(这个可以以后再研究)
发现策略
- 主要的API(索引、删除、搜索)不需要和主节点通信,主节点的任务是维护整个集群的状态,如果节点加入或者离开集群,主节点也要重新分配分片。集群状态改变,新状态也会被其他节点获知(具体的方式通过实际的发现机制)
zen 方式发现
- 单播发现,由其他的一些模块集成,例如,节点间所有的通信使用tansport模块。
- zen discovery分成了几个子模块
- ping: 节点通过这个过程找到其他节点
- unicast:
discovery.zen.ping.unicast.hosts discovery.zen.ping.unicast.hosts.resolve_timeout
主节点竞选
在ping过程中,一个主节点会被自动地选举或者加入。discovery.zen.ping_timeout
设置时长,默认3s
。discovery.zen.join_timeout
,节点加入时发送给主节点的request时长,默认是3s*20
。
在竞选主节点时,discovery.zen.master_election.ignore_non_master_pings
值为true
时,data node
或者client node
发送的ping
将被忽略,默认值为false
。
discovery.zen.minimum_master_nodes
设置为master_eligible_nodes / 2) + 1
。最好不要设置master_eligible_nodes
(node.master: true
)的个数为2,因为此时discovery.zen.minimum_master_nodes
的值为2,任意一个主节点丢失将会造成集群不可用。
故障检测
- 主节点
ping
其他节点,看他们是否存活 - 每一个节点
ping
主节点,报告它还存活或者需要竞选主节点
discovery.zen.fd.ping_interval: 节点被ping的时间间隔,1s
discovery.zen.fd.ping_timeout: 等待ping response的时间,默认30s
discovery.zen.fd.ping_retries: timeout/fail 重ping的次数, 默认3