Elasticsearch 集群搭建

一、集群规划

1.1 节点角色规划
节点类型配置要求推荐数量
Master节点低磁盘、中等CPU/内存3(奇数防止脑裂)
Data节点高磁盘、高内存、多核CPU根据数据量扩展
Coordinating节点高CPU/内存、低磁盘2+(可选)
1.2 硬件建议
  1. 内存:Data节点建议50%内存分配给ES堆(不超过31GB),剩余留给文件缓存。
  2. 磁盘:SSD优先,RAID 0或JBOD模式,避免NAS/SAN。
  3. CPU:16核以上,Data节点需更多核心。
1.3 网络要求
  1. 节点间带宽≥1Gbps,延迟<10ms。
  2. 禁用Swap,优化TCP参数(如增大net.core.somaxconn)。

二、搭建步骤

2.1 准备工作
  1. 系统资源充足服务器(Linux)。
  2. 服务器上确保已安装 Docker 和 Docker Compose(推荐)。
2.2 拉取 Elasticsearch 镜像
# 拉取最新版
docker pull docker.elastic.co/elasticsearch/elasticsearch:latest# 拉取指定版本(例如 8.13.4)
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.12.0
2.3 创建 Docker 网络

为集群创建一个专用网络,确保节点间通信:

docker network create es-net
2.4 集群模式配置

可以使用docker 依次启动多个节点,也可以使用Docker Compose一次启动全部节点。以下以 3 节点集群为例:

  1. docker 依次启动

    • 节点 1 (es01 - 主节点)
      docker run -d \--name es01 \--net es-net \-p 9200:9200 \-e "node.name=es01" \-e "cluster.name=es-docker-cluster" \-e "cluster.initial_master_nodes=es01,es02,es03" \-e "discovery.seed_hosts=es02,es03" \-e "bootstrap.memory_lock=true" \-e "ES_JAVA_OPTS=-Xms2g -Xmx2g" \-v es-data01:/usr/share/elasticsearch/data \elasticsearch:8.12.0
      
    • 节点 2 (es02 - 数据节点)
      docker run -d \--name es02 \--net es-net \-e "node.name=es02" \-e "cluster.name=es-docker-cluster" \-e "discovery.seed_hosts=es01,es03" \-e "ES_JAVA_OPTS=-Xms2g -Xmx2g" \-v es-data02:/usr/share/elasticsearch/data \elasticsearch:8.12.0
      
    • 节点 3 (es03 - 协调节点)
      docker run -d \--name es03 \--net es-net \-e "node.name=es03" \-e "cluster.name=es-docker-cluster" \-e "discovery.seed_hosts=es01,es02" \-e "ES_JAVA_OPTS=-Xms2g -Xmx2g" \-v es-data03:/usr/share/elasticsearch/data \elasticsearch:8.12.0
      
    • 关键参数说明
      • cluster.name: 集群名称,所有节点必须一致。
      • node.name: 节点唯一名称。
      • discovery.seed_hosts: 集群节点列表(容器名称或 IP)。
      • cluster.initial_master_nodes: 初始主节点列表(首次启动时需指定)。
      • ES_JAVA_OPTS: JVM 堆内存设置(建议不超过物理内存的 50%)。
      • 数据卷挂载: 使用 -v 挂载数据目录避免数据丢失。
  2. 使用 Docker Compose 一次启动

    • 创建 docker-compose.yml:
      version: '3'
      services:es01:image: elasticsearch:8.12.0container_name: es01environment:- node.name=es01- cluster.name=es-docker-cluster- discovery.seed_hosts=es02,es03- cluster.initial_master_nodes=es01,es02,es03- ES_JAVA_OPTS=-Xms2g -Xmx2gvolumes:- es-data01:/usr/share/elasticsearch/datanetworks:- es-netports:- 9200:9200es02:image: elasticsearch:8.12.0container_name: es02environment:- node.name=es02- cluster.name=es-docker-cluster- discovery.seed_hosts=es01,es03- ES_JAVA_OPTS=-Xms2g -Xmx2gvolumes:- es-data02:/usr/share/elasticsearch/datanetworks:- es-netes03:image: elasticsearch:8.12.0container_name: es03environment:- node.name=es03- cluster.name=es-docker-cluster- discovery.seed_hosts=es01,es02- ES_JAVA_OPTS=-Xms2g -Xmx2gvolumes:- es-data03:/usr/share/elasticsearch/datanetworks:- es-netvolumes:es-data01:es-data02:es-data03:networks:es-net:driver: bridge
      
    • 启动服务:
      docker-compose up -d
      
2.5 验证集群状态
curl -X GET "http://localhost:9200/_cluster/health?pretty"
  • 输出中 status 应为 green 或 yellow,number_of_nodes 显示节点数。
2.6 生产级优化配置
  1. 分片与副本策略
    在创建索引的时候,在 settings 中进行分片及副本数量设置。

    PUT /my_index
    {"settings": {"number_of_shards": 3,     # 分片数(建议每分片30-50GB)"number_of_replicas": 1    # 副本数(生产环境≥1)}
    }
    
  2. 集群发现优化

    # 防止误加入其他集群
    discovery.zen.ping.unicast.hosts.resolve_timeout: 30s
    cluster.join.timeout: 60s# 启用安全配置(7.x+版本)
    xpack.security.enabled: true
    
  3. 数据目录分离

    path.data: /ssd1,/ssd2  # 多磁盘路径提升IO
    
2.7 安全配置(可选)

Elasticsearch 8.x 默认启用安全功能。首次启动容器时,控制台会输出默认密码。
可通过以下命令重置密码:

docker exec -it es-test /bin/bash
bin/elasticsearch-reset-password -u elastic

如需禁用(测试环境),可以在启动容器的命令中添加下面配置:

-e "xpack.security.enabled=false"

生产环境建议开启安全认证,以下是配置 Elasticsearch 集群安全功能基本步骤:

  1. 生成证书颁发机构(CA)
    • 临时启动一个节点生成 CA
      docker run -d --name es-temp \-e "node.name=es-temp" \-e "cluster.name=secure-es-cluster" \-e "discovery.type=single-node" \-e "ES_JAVA_OPTS=-Xms1g -Xmx1g" \-v es-certs:/usr/share/elasticsearch/config/certs \elasticsearch:8.12.0
      
    • 生成 CA 证书
      docker exec -it es-temp \elasticsearch-certutil ca --pass "" --out config/certs/ca.zip
      
    • 解压 CA 证书并删除临时容器
      docker exec -it es-temp unzip config/certs/ca.zip -d config/certs
      docker rm -f es-temp
      
  2. 配置安全集群
    • 在每个节点的启动容器命令中添加挂载目录到刚生成的证书目录上。
      -v es-certs:/usr/share/elasticsearch/config/certs
      
    • 还可以在每个节点的启动容器命令中添加登录密码。
      -e ELASTIC_PASSWORD=your_secure_password
      
  3. 关键安全配置说明
    • 强制安全特性
      • 节点间 TLS 加密:自动启用,证书挂载到共享卷 es-certs。
      • HTTP 层 HTTPS:默认启用,访问需使用 https://。
      • 内置用户系统:默认创建 elastic、kibana_system 等用户。
    • 环境变量
      • ELASTIC_PASSWORD:设置内置超级用户 elastic 的密码。
      • xpack.security.enrollment.enabled:可设置为 false 禁用自动注册(需手动配置证书)。

三、集群监控与维护

3.1 集群监控
  1. 核心监控指标

    • 集群健康状态:
      curl -u elastic:密码 "https://localhost:9200/_cluster/health?pretty"
      
      • status: green(所有分片正常)、yellow(主分片正常,副本未分配)、red(主分片缺失)。
      • number_of_nodes: 当前节点数。
      • unassigned_shards: 未分配的分片数。
    • 节点资源使用:
      curl -u elastic:密码 "https://localhost:9200/_nodes/stats?pretty"
      
      • CPU、内存、磁盘使用率。
      • JVM 堆内存(jvm.mem.heap_used_percent)应低于 75%。
    • 索引性能:
      curl -u elastic:密码 "https://localhost:9200/_cat/indices?v"
      curl -u elastic:密码 "https://localhost:9200/_nodes/hot_threads"
      
      • 索引速率(indexing.index_total)、搜索速率(search.query_total)。
      • 分片数、文档数、存储大小。
  2. 监控工具

    • Kibana Stack Monitoring(内置):
      • 安装并配置 Kibana,进入 Stack Management > Monitoring。
      • 实时查看集群、节点、索引的详细指标。
    • Prometheus + Grafana:
      • 使用 Elasticsearch Exporter 采集指标。
      • Grafana 仪表盘模板(如 ID 2322)。
    • Cerebro
      • 集群管理Web界面。
      • 分片重分配、节点排除等操作。
    • ElasticHQ
      • 集群管理GUI。
      • 实时监控和简单管理功能。
3.2 日常维护操作
  1. 索引管理

    • 索引生命周期管理(ILM):
      PUT _ilm/policy/hot_warm_policy
      {"policy": {"phases": {"hot": {"actions": {"rollover": { "max_size": "50GB", "max_age": "30d" }}},"warm": {"min_age": "60d","actions": { "shrink": { "number_of_shards": 1 } }}}}
      }
      
      • 自动滚动创建新索引,归档旧数据。
    • 手动优化索引:
      # 合并段文件(force merge)
      POST /logs-2023-10-01/_forcemerge?max_num_segments=1# 关闭不再写入的索引
      POST /old-index-*/_close
      
  2. 分片管理

    • 分片分配策略:
      PUT _cluster/settings
      {"persistent": {"cluster.routing.allocation.balance.shard": "0.45","cluster.routing.allocation.disk.watermark.low": "85%","cluster.routing.allocation.disk.watermark.high": "90%"}
      }
      
      • 避免磁盘空间不足导致分片迁移失败。
    • 手动迁移分片:
      POST /_cluster/reroute
      {"commands": [{"move": {"index": "logs-2023-10-01","shard": 0,"from_node": "es01","to_node": "es02"}}]
      }
      
3.3 备份与恢复
  1. 快照备份

    • 创建仓库(如 S3、NFS):
      PUT _snapshot/my_backup_repo
      {"type": "fs","settings": { "location": "/mnt/backups/es_snapshots" }
      }
      
    • 手动创建快照:
      PUT _snapshot/my_backup_repo/snapshot_20231001
      {"indices": "logs-*","ignore_unavailable": true
      }
      
  2. 恢复快照

    POST _snapshot/my_backup_repo/snapshot_20231001/_restore
    {"indices": "logs-2023-10-01","rename_pattern": "logs-(.+)","rename_replacement": "restored_logs-$1"
    }
    
3.4 版本升级与滚动重启
  1. 滚动升级步骤
    1. 禁用分片分配:
      PUT _cluster/settings
      {"persistent": { "cluster.routing.allocation.enable": "primaries" }
      }
      
    2. 停止节点并升级:
      # 停止一个节点
      docker stop es01
      # 更新镜像版本(如 8.12.0 → 8.12.1)
      docker run ... elasticsearch:8.12.1
      
    3. 重新启用分片分配:
      PUT _cluster/settings
      {"persistent": { "cluster.routing.allocation.enable": null }
      }
      
3.5 日志与故障排查
  1. 日志收集

    • Filebeat 配置:
      filebeat.inputs:- type: logpaths:- /var/lib/docker/containers/*/*-json.logprocessors:- add_docker_metadata: ~
      output.elasticsearch:hosts: ["https://es01:9200"]username: "filebeat_user"password: "密码"ssl.certificate_authorities: ["/path/to/ca.crt"]
      
  2. 常见故障处理

    • 分片未分配:

      GET _cluster/allocation/explain?pretty
      
      • 检查磁盘空间、分片分配规则。
    • 节点离线:

      • 临时移除节点:
        PUT _cluster/settings
        {"transient": { "cluster.routing.allocation.exclude._ip": "故障节点IP" }
        }
        
    • 脑裂问题恢复:
      在 Elasticsearch 集群中,脑裂指多个节点同时认为自己是主节点(Master Node),导致集群分裂成多个独立子集群的现象。这会引发数据不一致、写入冲突,甚至服务中断。

      • 脑裂的成因:
        • 网络分区:节点间网络中断,部分节点无法通信。
        • Master节点高负载:长时间GC或CPU满载导致心跳超时。
        • 节点角色分配不合理:过多节点具备 master 角色,增加选举复杂度。
      • 紧急恢复步骤:
        1. 停用所有节点。
        2. 确定有效数据节点,检查各节点数据目录(path.data)的最后更新时间,保留最新数据的节点。
        3. 清理故障节点状态,删除所有节点的 data/nodes 目录(重置集群状态)。
        4. 先启动原主节点或数据最新的节点,确认集群健康状态后再启动其他节点。
3.6 自动化运维建议
  1. 定期清理旧索引:

    # 删除 90 天前的索引
    DELETE /logs-*-$(date -d "-90 days" +%Y.%m.%d)
    
  2. 设置监控告警(如 Watcher):、

    PUT _watcher/watch/disk_usage_alert
    {"trigger": { "schedule": { "interval": "5m" } },"input": { "search": { ... } },"condition": { "compare": { "ctx.payload.hits.total": { "gt": 0 } } },"actions": { "send_email": { ... } }
    }
    
3.7 性能优化技巧
  1. 调整 JVM 堆大小:建议不超过物理内存的 50%(如 32GB 内存 → -Xms16g -Xmx16g)。
  2. 使用 SSD 存储:提升索引和搜索速度。
  3. 分片大小控制:单个分片建议在 10GB–50GB 之间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/901200.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React 响应事件

开发环境&#xff1a;Reacttsantd 使用 React 可以在 JSX 中添加 事件处理函数。其中事件处理函数为自定义函数&#xff0c;它将在响应交互&#xff08;如点击、悬停、表单输入框获得焦点等&#xff09;时触发。 学习内容 1.编写事件处理函数的不同方法 2.如何从父组件传递事件…

SQL基础入门:从CRUD到JOIN再到索引(通俗易懂版)

一、为什么需要SQL&#xff1f; 想象你在管理一个图书馆&#xff1a; 传统方法&#xff1a;手动记录每本书的位置、借阅者、归还日期SQL方法&#xff1a;用数据库系统自动管理&#xff0c;快速查询《Java编程思想》在哪个书架 SQL&#xff08;Structured Query Language&…

MINIQMT学习课程Day11

现在开始进行策略的交易买卖分析&#xff1a; 还是之前的步骤&#xff0c;打开qmt&#xff0c;选择独立交易&#xff0c; 之后使用pycharm&#xff0c;编写py文件 导入包&#xff1a; import time, datetime, traceback, sys from xtquant import xtdata from xtquant.xttr…

# 实时人脸性别与年龄识别:基于OpenCV与深度学习模型的实现

实时人脸性别与年龄识别&#xff1a;基于OpenCV与深度学习模型的实现 在当今数字化时代&#xff0c;计算机视觉技术正以前所未有的速度改变着我们的生活与工作方式。其中&#xff0c;人脸检测与分析作为计算机视觉领域的重要分支&#xff0c;已广泛应用于安防监控、智能交互、…

Python Cookbook-5.14 给字典类型增加排名功能

任务 你需要用字典存储一些键和“分数”的映射关系。你经常需要以自然顺序(即以分数的升序)访问键和分数值&#xff0c;并能够根据那个顺序检查一个键的排名。对这个问题&#xff0c;用dict 似乎不太合适。 解决方案 我们可以使用 dict 的子类&#xff0c;根据需要增加或者重…

十四种逻辑器件综合对比——《器件手册--逻辑器件》

目录 逻辑器件 简述 按功能分类 按工艺分类 按电平分类 特殊功能逻辑器件 应用领域 详尽阐述 1 逻辑门 一、基本概念 二、主要类型 三、实现方式 四、应用领域 2 反相器 工作原理 基本功能 主要应用 常见类型 特点 未来发展趋势 3 锁存器 基本概念 工作原理 主要类型…

如何更改wsl2中的ubuntu默认安装位置

先前的一篇文章提到了如何更改wsl里面ubuntu的home目录&#xff0c;wsl装ubuntu的home目录在哪&#xff0c;如何更改home&#xff1f;_wsl安装的ubuntu在哪里-CSDN博客 这次是要更改wsl中ubuntu的安装目录&#xff0c;毕竟默认安装到c盘下会占用不少空间的。 从微软商店get后…

最近在工作中感受到了设计模式的重要性

之前了解设计模式&#xff1a;只是应付一下面试 在之前一年多的工作中也没遇到使用场景 最近在搭建验证环境的时候&#xff0c;才发现这玩意这么重要 首先是设计模式的使用场景一定是在很复杂繁琐的场景下进行的 之所以说是复杂/繁琐的场景&#xff0c;因为一些场景也许逻辑不难…

Python深度学习基础——卷积神经网络(CNN)(PyTorch)

CNN原理 从DNN到CNN 卷积层与汇聚 深度神经网络DNN中&#xff0c;相邻层的所有神经元之间都有连接&#xff0c;这叫全连接&#xff1b;卷积神经网络 CNN 中&#xff0c;新增了卷积层&#xff08;Convolution&#xff09;与汇聚&#xff08;Pooling&#xff09;。DNN 的全连接…

Linux 第三讲 --- 基础指令(三)

前言&#xff1a; 在前面我们已经讲了有十几个Linux的基础指令&#xff0c;今天我们再补充几个常用的基础指令&#xff0c;为后面的学习做准备 。 目录 前言&#xff1a; 一、两个与时间相关的指令 1.date指令 演示 &#xff1a; 时间戳 设置时间 2、cal指令 演示&#x…

基于SiamFC的红外目标跟踪

基于SiamFC的红外目标跟踪 1,背景与原理2,SiamFC跟踪方法概述2.1 核心思想2.2 算法优势3,基于SiamFC的红外跟踪代码详解3.1 网络定义与交叉相关模块3.2 SiamFC 跟踪器实现3.3 主程序:利用 OpenCV 实现视频跟踪4,总结与展望在红外监控、无人机防御以及低光照场景中,红外图…

Odoo 部署本地 把現時的excel計算表格部署上odoo 教程

要将现有的 Excel 计算表格部署到 Odoo 平台上&#xff0c;您可以按照以下步骤进行操作&#xff1a; 将 Excel 表格中的数据转移到 Odoo 模块中&#xff1a;首先&#xff0c;您需要将 Excel 表格中的数据导出为 CSV 格式&#xff0c;然后可以使用 Odoo 的数据导入功能将这些数据…

KWDB创作者计划—KWDB认知引擎:数据流动架构与时空感知计算的范式突破

引言&#xff1a;数据智能的第三范式 在数字化转型进入深水区的2025年&#xff0c;企业数据系统正面临三重悖论&#xff1a;数据规模指数级增长与实时决策需求之间的矛盾、多模态数据孤岛与业务连续性要求之间的冲突、静态存储范式与动态场景适配之间的鸿沟。KWDB&#xff08;K…

C语言 数据结构 【栈】动态模拟实现

引言 动态模拟实现栈的各个接口 一、栈的概念与结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;LastInFirstOut…

Python itertools模块的groupby函数介绍

itertools.groupby 是 Python 标准库 itertools 模块中的一个函数&#xff0c;它的主要功能是对可迭代对象中相邻的相同元素进行分组。 itertools.groupby(iterable, keyNone) 函数 作用&#xff1a; 将连续的&#xff08;相邻的&#xff09;相同元素分组&#xff0c;返回 (…

Python实例题:使用Python生成分形图片

目录 Python实例题 题目 题目分析 需求理解 关键知识点 实现思路分析 代码实现 代码解释 mandelbrot 函数&#xff1a; 设置复平面区域和图像参数&#xff1a; 计算分形数据&#xff1a; 绘图展示&#xff1a; 运行思路 Python实例题 题目 使用Python生成分形图…

系统编程1(进程的概念与原理)

进程的概念与原理 计算机组成部分一般遵循冯诺依曼结构&#xff0c;也就是由控制器、运算器、存储器、输入设备、输出设备五个部分组成。 ⦁ 程序的编译 一般在编写出程序之后&#xff0c;并不能直接运行&#xff0c;而是需要把程序通过编译器进行编译&#xff0c;生成可执行…

《Vue Router实战教程》5.嵌套路由

欢迎观看《Vue Router 实战&#xff08;第4版&#xff09;》视频课程 嵌套路由 一些应用程序的 UI 由多层嵌套的组件组成。在这种情况下&#xff0c;URL 的片段通常对应于特定的嵌套组件结构&#xff0c;例如&#xff1a; 通过 Vue Router&#xff0c;你可以使用嵌套路由配置…

使用Python解决Logistic方程

引言 在数学和计算机科学中,Logistic 方程是描述人口增长、传播过程等现象的一种常见模型。它通常用于表示一种有限资源下的增长过程,比如动物种群、疾病传播等。本文将带领大家通过 Python 实现 Logistic 方程的求解,帮助你更好地理解这一经典数学模型。 1.什么是 Logist…

《从零搭建Vue3项目实战》(AI辅助搭建Vue3+ElemntPlus后台管理项目)零基础入门系列第十二篇(完结篇):数据统计功能实现

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 《从零搭建Vue3项目实战》&#xff08;AI辅助…