ElasticSearch节点重启

本文介绍了Elasticsearch集群管理的最佳实践,包括如何避免重启时的数据雪崩、解决脑裂问题等,提供了详细的步骤和配置参数。

注: 部分概念介绍来源于网络

一、elasticsearch 节点重启问题
ElasticSearch集群的高可用和自平衡方案会在节点挂掉(重启)后自动在别的结点上复制该结点的分片,这将导致了大量的IO和网络开销。
如果离开的节点重新加入集群,elasticsearch为了对数据分片(shard)进行再平衡,会为重新加入的节点再次分配数据分片(Shard), 当一台es因为压力过大而挂掉以后,其他的es服务会备份本应那台es保存的数据,造成更大压力,于是整个集群会发生雪崩。
生产环境下建议关闭自动平衡。

1、数据分片与自平衡
(1)关闭自动分片,即使新建index也无法分配数据分片
PUT /_cluster/settings {
  "transient" : {
    "cluster.routing.allocation.enable" : "none"
  }
}
(2)关闭自动平衡,只在增减ES节点时不自动平衡数据分片
PUT /_cluster/settings?pretty {
  "transient" : {
    "cluster.routing.rebalance.enable" : "none"
  }
}
(3)禁止集群写入,启动时候,禁写
PUT /_cluster/settings
{
  "persistent": {
    "cluster.blocks.read_only": true
  },
  "transient": {
    "cluster.blocks.read_only": true
  }
(4)设置完以后查看设置是否添加成功:
GET /_cluster/settin

在 Docker 环境中,Elasticsearch 容器不断重启可能由多种原因引起。以下是可能导致此问题的常见原因及对应的解决方法: ### 1. 内存不足 Elasticsearch 对内存需求较高,尤其是在默认配置下。如果 Docker 容器的内存限制过低,JVM 会因为无法分配足够的堆内存而崩溃,导致容器重启。可以通过以下方式检查和解决: - **增加内存限制**:在 `docker run` 命令中使用 `-e ES_JAVA_OPTS="-Xms512m -Xmx512m"` 来限制 JVM 的堆内存大小,确保不超过容器的可用内存[^1]。 - **调整 Docker 内存限制**:使用 `--memory` 参数为容器分配更多内存,例如 `--memory="4g"`。 示例命令: ```bash docker run -d --name elasticsearch \ -e ES_JAVA_OPTS="-Xms512m -Xmx512m" \ --memory="4g" \ docker.elastic.co/elasticsearch/elasticsearch:7.17.3 ``` ### 2. 文件描述符限制 Elasticsearch 需要较高的文件描述符限制(`nofile`),默认的 Docker 限制可能不足以支持其正常运行。可以使用 `ulimit` 参数调整文件描述符限制: 示例命令: ```bash docker run -d --name elasticsearch \ --ulimit nofile=65536:65536 \ docker.elastic.co/elasticsearch/elasticsearch:7.17.3 ``` ### 3. 虚拟内存限制 Elasticsearch 使用 `mmap` 来访问索引数据,因此需要较高的虚拟内存映射区域(`vm.max_map_count`)。如果宿主机的 `vm.max_map_count` 设置过低,Elasticsearch 会启动失败。可以在宿主机上执行以下命令来增加该值: ```bash sysctl -w vm.max_map_count=262144 ``` 此外,在 Docker 容器中也可以通过 `--cap-add=IPC_LOCK` 参数启用内存锁定功能: 示例命令: ```bash docker run -d --name elasticsearch \ --cap-add=IPC_LOCK \ -e ES_JAVA_OPTS="-Xms512m -Xmx512m" \ --memory="4g" \ --ulimit nofile=65536:65536 \ -e "discovery.type=single-node" \ docker.elastic.co/elasticsearch/elasticsearch:7.17.3 ``` ### 4. 日志分析 检查 Elasticsearch 容器的日志以获取具体的错误信息。使用以下命令查看日志: ```bash docker logs elasticsearch ``` 日志中可能会显示 JVM 错误、内存不足、文件权限问题等关键信息,帮助定位问题根源。 ### 5. 检查磁盘空间 Elasticsearch 默认会将数据存储在容器内的 `/usr/share/elasticsearch/data` 目录中。如果宿主机磁盘空间不足,可能会导致 Elasticsearch 崩溃。可以通过载宿主机目录来确保足够的磁盘空间: 示例命令: ```bash docker run -d --name elasticsearch \ -v /path/to/local/data:/usr/share/elasticsearch/data \ docker.elastic.co/elasticsearch/elasticsearch:7.17.3 ``` ### 6. 配置错误 确保 Elasticsearch 的配置文件正确,尤其是网络和集群配置。例如,单节点模式下应设置 `discovery.type=single-node` 以避免集群发现错误: 示例命令: ```bash docker run -d --name elasticsearch \ -e "discovery.type=single-node" \ docker.elastic.co/elasticsearch/elasticsearch:7.17.3 ``` ### 7. 容器健康检查 Docker 的健康检查机制可能会导致容器被标记为不健康并重启。可以通过自定义健康检查脚本或调整健康检查间隔来避免误判。 ### 8. 使用 Docker Compose 使用 Docker Compose 可以更方便地管理 Elasticsearch 容器的配置和依赖关系。以下是一个简单的 `docker-compose.yml` 示例: ```yaml version: '3.7' services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.17.3 container_name: elasticsearch environment: - node.name=elasticsearch - discovery.type=single-node - ES_JAVA_OPTS=-Xms512m -Xmx512m ulimits: nofile: soft: 65536 hard: 65536 mem_limit: 4g cap_add: - IPC_LOCK volumes: - esdata:/usr/share/elasticsearch/data ports: - 9200:9200 - 9300:9300 volumes: esdata: driver: local ``` 通过以上方法,可以有效解决 Elasticsearch 容器不断重启的问题。如果问题仍然存在,建议结合容器日志进一步分析。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值