集群配置

配置 #

Easysearch 默认配置已针对多数场景优化。本文聚焦生产环境必须关注的配置项。

原则:如果不确定是否需要改,就不要改。过度调优往往适得其反。


配置速查表 #

类别关键配置修改方式风险等级
标识cluster.namenode.name静态(重启生效)
路径path.datapath.logs静态(重启生效)
网络network.hosthttp.porttransport.port静态(重启生效)
发现discovery.seed_hostscluster.initial_master_nodes静态(重启生效)
内存ES_HEAP_SIZEjvm.options静态(重启生效)
恢复gateway.recover_after_*静态(重启生效)
集群级大部分 cluster.*indices.*动态 API视具体配置

必须配置 #

集群和节点名称 #

# easysearch.yml
cluster.name: my-cluster-prod    # 避免节点误加入其他集群
node.name: node-01               # 便于日志排查和监控识别

不设置 node.name 时,每次重启会随机生成——凌晨 3 点排查问题时,你不会想面对一堆随机名称。

数据目录 #

# easysearch.yml
path.data: /data/easysearch      # 独立于安装目录
path.logs: /var/log/easysearch   # 便于日志收集

为什么重要:默认数据存放在安装目录下,升级或重装时可能被误删。

网络绑定 #

# easysearch.yml
network.host: 10.0.0.1           # 内网 IP
http.port: 9200
transport.port: 9300

安全建议

  • 生产环境不要绑定 0.0.0.0 或公网 IP
  • 通过 Nginx/Gateway 代理对外暴露

集群发现 #

# easysearch.yml
discovery.seed_hosts:
  - node-01.internal:9300
  - node-02.internal:9300
  - node-03.internal:9300

# 仅首次启动集群时需要
cluster.initial_master_nodes:
  - node-01
  - node-02
  - node-03

关键点

  • 列出所有 Master 候选节点
  • cluster.initial_master_nodes 在集群建立后可以删除
  • 永远不要使用组播——生产环境只用单播

内存配置 #

JVM 堆设置 #

# 方式 1:环境变量
export ES_HEAP_SIZE=16g

# 方式 2:jvm.options
-Xms16g
-Xmx16g

三条铁律

规则说明
Xms = Xmx避免运行时调整堆大小
堆 ≤ 物理内存的 50%另一半留给 Lucene 文件缓存
堆 ≤ 31 GB超过 32GB 会禁用指针压缩,得不偿失

典型配置

物理内存JVM 堆说明
16 GB8 GB开发/测试
64 GB31 GB生产推荐
128 GB31 GB堆不要超过 31GB

禁用 Swap #

内存交换到磁盘会让性能下降 100 倍以上。

# 临时禁用
sudo swapoff -a

# 或降低 swappiness
echo "vm.swappiness = 1" >> /etc/sysctl.conf
sysctl -p

也可以锁定 JVM 内存:

# easysearch.yml
bootstrap.memory_lock: true

验证是否生效:

GET _nodes?filter_path=**.mlockall
// 返回 "mlockall": true 表示成功

集群恢复配置 #

集群重启时,避免在所有节点上线前触发不必要的分片迁移。

# easysearch.yml
gateway.recover_after_nodes: 8      # 至少 8 个节点在线才开始恢复
gateway.expected_nodes: 10          # 集群预期节点数
gateway.recover_after_time: 5m      # 最多等待 5 分钟

行为

  1. 等待至少 8 个节点上线
  2. 如果 5 分钟内 10 个节点都上线了,立即开始恢复
  3. 如果 5 分钟后只有 8-9 个节点,也开始恢复

效果:大集群重启时,分片恢复从数小时缩短到几秒钟。


动态配置 #

运行时可通过 API 调整的配置,无需重启。

查看当前配置 #

GET _cluster/settings?include_defaults=true

修改配置 #

PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.enable": "all"
  }
}

配置优先级(从高到低):

  1. Transient(临时,重启后失效)
  2. Persistent(持久,写入集群状态)
  3. easysearch.yml
  4. 默认值

常用动态配置 #

配置用途示例值
cluster.routing.allocation.enable控制分片分配all / none
cluster.routing.rebalance.enable控制分片再平衡all / none
indices.recovery.max_bytes_per_sec恢复带宽限制100mb
cluster.routing.allocation.disk.watermark.low磁盘低水位85%
cluster.routing.allocation.disk.watermark.high磁盘高水位90%

日志配置 #

日志通过 config/log4j2.properties 配置。

调整日志级别 #

# 临时调试时调高级别
logger.action.level = debug

# 问题解决后恢复
logger.action.level = info

慢查询日志 #

PUT /my-index/_settings
{
  "index.search.slowlog.threshold.query.warn": "10s",
  "index.search.slowlog.threshold.query.info": "5s"
}

最佳实践

  • 默认保持 INFO 级别
  • 使用 Filebeat 收集日志到集中平台
  • 不要在节点本地保留过多历史日志

配置验证 #

节点启动后检查 #

# 检查节点信息
GET _nodes?filter_path=nodes.*.name,nodes.*.roles,nodes.*.jvm.mem

# 检查关键设置
GET _nodes/settings?filter_path=nodes.*.settings.path,nodes.*.settings.network

常见问题排查 #

问题可能原因检查命令
节点无法加入集群发现配置错误检查 discovery.seed_hosts
内存不足堆设置不当GET _nodes/stats/jvm
分片不分配磁盘水位超限GET _cluster/allocation/explain
启动慢恢复配置缺失检查 gateway.* 配置

小结 #

配置类别必须设置推荐值
集群名称有意义的名称
节点名称有意义的名称
数据路径独立于安装目录
网络绑定内网 IP
发现配置显式 seed 列表
JVM 堆50% 内存,≤ 31GB
禁用 Swapswapoff -amemory_lock

相关文档