【ELasticsearch】案例:AWS 上 Elasticsearch 对接 NLB / ALB

ES 负载均衡》系列,共包含以下文章:

😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!

场景: 在 AWS VPC 中自管理一个 Elasticsearch 8.x 集群。有 3 个专用主节点(私有子网),5 个数据节点(私有子网),3 个专用协调节点(可放在公有子网或私有子网,通过 NLB / ALB 暴露)。客户端是部署在另一个 VPC 或公网的应用程序。

🚀 NLBNetwork Load Balancer)和 ALBApplication Load Balancer)是 AWS(亚马逊云)提供的两种负载均衡器,用于在多个计算资源(如 EC2 实例)之间分配流量。它们在 Elasticsearch 集群架构中扮演流量入口和分发枢纽的关键角色。

1.配置协调节点

  • 启动 3 个 EC2 实例(或使用 Auto Scaling Group 确保最小数量)。
  • elasticsearch.yml 配置:
    cluster.name: my-production-cluster
    node.name: ${HOSTNAME}
    network.host: 0.0.0.0 # 或绑定具体私网IP
    http.port: 9200
    discovery.seed_hosts: ["master-node-1-ip", "master-node-2-ip", "master-node-3-ip"] # 指向主节点
    cluster.initial_master_nodes: ["master-node-1-name", "master-node-2-name", "master-node-3-name"] # 首次启动需要
    node.roles: [ ]  # ES 7.8+ 空角色表示只做协调节点 (coordinating only)
    # 或者显式配置 (效果相同)
    # node.roles: [ remote_cluster_client, coordinator ]
    xpack.security.enabled: true # 启用安全
    # 配置用户/密码或 TLS 证书等
    
  • 确保安全组允许协调节点:
    • 入站:来自 ELB 安全组的 TCP 9200(或 ALB 使用的端口)。
    • 入站:来自其他 ES 节点(主、数据、协调)的 TCP 9300(内部节点间通信端口)。
    • 出站:访问其他 ES 节点的 TCP 9300,访问 KMS(如果加密)等所需端口。
  • 确保协调节点能访问主节点(通过安全组和网络路由)。

2.创建 NLB 或 ALB

  • 选择 NLB(Layer 4 TCP):
    • 优点:性能高,延迟低,保持源 IP(对 ES 审计或基于 IP 的安全有用),支持静态 IP / 弹性 IP。非常适合纯粹的 API 负载均衡。更常用。
    • 缺点:不能做高级 HTTP 路由/基于路径的路由(ES 通常不需要)。
  • 选择 ALB(Layer 7 HTTP / HTTPS):
    • 优点:可以处理 HTTPS 终止、基于路径的路由(如果同一个集群暴露多个 HTTP 服务)、高级健康检查(基于 HTTP 状态码)。
    • 缺点:性能略低于 NLB,修改 HTTP Headers(会丢失原始客户端 IP,除非配置 X-Forwarded-For,但 ES 需要额外配置才能记录真实 IP),通常按请求 / LCU 收费。
  • 创建步骤(以 NLB 为例):
    • 选择 Network Load Balancer
    • 配置监听器TCP:9200 (或自定义端口)。
    • 配置目标组(Target Group):
      • 协议:TCP,端口:9200
      • 目标类型:Instance
      • 将 3 个协调节点的 EC2 实例注册到该目标组。
    • 健康检查配置(⭐ 极其重要):
      • 协议:TCP(简单检查端口连通性) 或 HTTP(推荐,更准确)。
      • 如果使用 HTTP
        • 健康检查路径:/_cluster/health?local=true/_cluster/health?level=cluster(后者检查全局状态,可能过重)。
        • 健康检查端口:traffic port(即 9200)。
        • 成功响应码:200
        • 关键:设置 ?local=true 避免 NLB 健康检查请求被转发到其他节点,导致健康检查失败误判。local=true 只检查接收请求的协调节点本地的状态。
    • 配置安全组:允许客户端访问 NLB 的监听器端口(TCP 9200)。

3.客户端访问

  • 客户端应用程序不再连接任何具体的 ES 节点 IP。
  • 客户端配置其 Elasticsearch 客户端库的连接地址为:http(s)://<nlb-dns-name>:9200 (或 ALB 的地址)。
  • 客户端配置认证信息(用户名/密码、API Key、TLS 证书等)。

4.工作流程

  • 客户端发起请求到 my-es-nlb-12345.elb.us-west-2.amazonaws.com:9200
  • AWS NLB 根据配置的负载均衡策略(如轮询)选择目标组中的一个协调节点(例如 coord-node-2)。
  • NLB 将 TCP 连接/请求转发到 coord-node-2:9200
  • coord-node-2 接收到请求:
    • 进行认证授权(如果启用安全)。
    • 解析请求(例如一个搜索请求)。
    • 确定需要查询哪些索引的哪些分片(主分片或副本分片)。
    • 将子查询并行发送到持有这些分片的数据节点(data-node-1data-node-3,…)的 9300 端口(Transport 协议)。
    • 等待数据节点返回结果。
    • 聚合、排序、处理来自各个数据节点的结果。
    • 将最终结果返回给 NLB。
  • NLB 将结果返回给客户端。
  • 如果 coord-node-2 因健康检查失败被 NLB 标记为不健康,NLB 后续请求将自动路由到健康的 coord-node-1coord-node-3

5.关键点总结

  • ELB 是入口:提供稳定、高可用的访问点,负载均衡,故障转移。
  • 协调节点是工作者:专门负责处理客户端请求的协调工作。ELB 只对接协调节点。
  • 数据节点专注数据:只通过 9300 端口接收来自协调节点(或其他节点)的内部请求,处理实际的分片操作。
  • 主节点专注管理:几乎不参与数据路径,只处理集群状态、索引管理、节点发现等控制面操作。绝对不要暴露给客户端或 ELB。

这种架构清晰分离了关注点,显著提升了 Elasticsearch 集群在公有云上的可用性、可扩展性、性能和可运维性。

6.拓展:NLB & ALB 介绍

6.1 核心概念对比

特性NLB(网络负载均衡器)ALB(应用负载均衡器)
OSI 层 4 4 4 层(传输层 - TCP/UDP) 7 7 7 层(应用层 - HTTP/HTTPS)
协议支持TCP,UDP,TLSHTTP,HTTPS,HTTP/2,WebSocket
性能⭐⭐⭐⭐ 超高性能(处理数百万请求/秒)⭐⭐⭐ 高性能(适合HTTP应用)
延迟超低延迟(微秒级)较低延迟(毫秒级)
源 IP 保留✅ 保留原始客户端 IP❌ 默认不保留(需通过 X-Forwarded-For 获取)
静态 IP✅ 支持弹性 IP❌ 仅提供 DNS 域名
适用场景非 HTTP 协议、高性能需求、源 IP 敏感型应用HTTP/HTTPS 应用、基于路径/主机的路由

6.2 在 Elasticsearch 架构中的作用

▶ NLB 典型工作流

TCP:9200
透传TCP流量
保留客户端 IP
Client
NLB
协调节点
ES集群
  • 优势
    • 零协议解析,直接转发原始 TCP 数据包
    • 保留客户端 IP → 便于 Elasticsearch 审计日志分析
    • 支持长连接(Keep-Alive)→ 适合 ES 的持久 HTTP 连接

▶ ALB 典型工作流

HTTPS:443
HTTP:9200
添加 X-Forwarded-For 头
Client
ALB
协调节点
ES集群
  • 优势
    • SSL/TLS 终止 → 减轻 ES 节点证书管理负担
    • 基于路径的路由(例:/es/* 转发到 ES,/kibana/* 转发到Kibana)

6.3 为什么 Elasticsearch 更常用 NLB ?

需求NLB 方案ALB 方案
客户端真实 IP 记录✅ 原生支持❌ 需解析 HTTP 头
非 HTTP 协议支持✅ 原生支持 Transport 协议❌ 仅限 HTTP
超高性能搜索请求✅ 100万+ QPS⚠️ 受 HTTP 解析限制
长连接优化✅ 无损透传⚠️ 可能重建连接
成本按流量/小时计费按 LCU(请求数+流量)计费

📌 结论

  • 90% 的 ES 生产集群选择 NLB:因 TCP 透传、源 IP 保留、高性能优势
  • 特殊场景用 ALB:需统一 HTTPS 入口或多服务路由时(如同时暴露 ES 和 Kibana)

6.4 技术参数详解(以 AWS 为例)

6.4.1 NLB 关键配置

类型: Network Load Balancer
协议: TCP
端口: 9200
目标组: 
  协议: TCP 
  端口: 9200
  目标: [协调节点IP列表]
健康检查: 
  协议: HTTP
  路径: /_cluster/health?local=true
  端口: 9200

6.4.2 ALB 关键配置

类型: Application Load Balancer
协议: HTTPS (SSL证书绑定)
监听规则:
  - 条件: 路径 = /es/*
    动作: 转发至目标组-es
  - 条件: 路径 = /kibana/*
    动作: 转发至目标组-kibana
目标组-es: 
  协议: HTTP
  端口: 9200
健康检查: 
  协议: HTTP
  路径: /_cluster/health

6.5 多云平台等效服务

云平台NLB 等效服务ALB 等效服务
AWSNetwork Load BalancerApplication Load Balancer
AzureLoad Balancer(Standard)Application Gateway
GCPTCP Proxy Load BalancingHTTP(S) Load Balancing
阿里云网络型 CLB应用型 ALB

6.6 实战选择建议

在这里插入图片描述

💡 经验法则

  • 纯 Elasticsearch API 访问 → 必选 NLB
  • 同时暴露 Kibana 且需单域名访问 → 用 ALB 统一入口
  • 混合云场景 → 优先使用云厂商的 4 层 LB 服务

通过正确选择 NLB / ALB,您将获得:

  • ✅ 流量自动故障转移
  • ✅ 水平扩展能力
  • ✅ DDoS基础防护
  • ✅ 精细化监控(如 AWS CloudWatch)
<think>我们正在讨论Linux命令`chown-Res:es/usr/local/elasticsearch`,这个命令在Elasticsearch的安装和配置中非常重要。下面我将详细解释这个命令的各个部分以及它在Elasticsearch中的使用场景。###命令解释`chown`是Linux系统中用于改变文件或目录的所有者和所属组的命令。其基本语法为:```chown[选项][所有者]:[所属组]文件或目录```-`-R`选项表示递归操作,即不仅改变指定目录本身的所有者和所属组,还会改变该目录下的所有子目录和文件。-`es:es`指定了新的所有者和所属组。这里第一个`es`是用户名,第二个`es`是组名。这意味着将所有者改为用户`es`,所属组改为组`es`。-`/usr/local/elasticsearch`是要操作的目录路径,通常是Elasticsearch的安装目录。因此,整个命令的作用是将`/usr/local/elasticsearch`目录及其内部所有文件和子目录的所有者和所属组都设置为`es`用户和`es`组。###在Elasticsearch中的使用场景Elasticsearch在运行时通常以非root用户运行,这是出于安全考虑。因此,在安装Elasticsearch后,我们通常会创建一个专门的用户(如`es`)来运行Elasticsearch服务。此时,需要确保Elasticsearch的安装目录、配置文件、数据目录和日志目录等都被该用户拥有,这样Elasticsearch进程才有权限读写这些目录和文件。具体场景包括:1.**安装后设置权限**:当使用root用户解压Elasticsearch安装包到`/usr/local/elasticsearch`后,目录的所有者通常是root。此时需要将所有权转交给`es`用户,以便Elasticsearch可以正常运行。2.**避免权限错误**:如果Elasticsearch进程没有足够的权限访问其目录,可能会导致启动失败或运行异常。例如,在启动时可能会看到权限被拒绝(Permissiondenied)的错误。3.**安全加固**:使用非root用户运行服务是安全最佳实践,可以降低被攻击的风险。###操作步骤示例假设我们已经创建了`es`用户和`es`组(可以使用`groupaddes`和`useradd-geses`命令创建),那么执行以下命令:```bashchown-Res:es/usr/local/elasticsearch```执行后,可以使用`ls-l`命令查看目录的所有权是否已经更改:```bashls-ld/usr/local/elasticsearch```如果显示的所有者和组都是`es`,则表示设置成功。###注意事项-确保在运行此命令之前已经创建了`es`用户和组,否则命令会失败(提示“无效的用户”)。-如果Elasticsearch的数据目录和日志目录不在`/usr/local/elasticsearch`下(例如在`/var/lib/elasticsearch`和`/var/log/elasticsearch`),那么这些目录同样需要设置正确的所有权。###引用说明在Elasticsearch的官方文档中,关于安装和配置的部分会提到需要确保运行Elasticsearch的用户拥有相关目录的权限[^1]。§§相关问题§§1.如何创建用于运行Elasticsearch的用户和组?2.为什么Elasticsearch不建议使用root用户运行?3.除了`chown`命令,还有哪些方法可以管理Elasticsearch的文件权限?4.Elasticsearch安装后需要调整哪些目录的权限?[^1]:Elasticsearch官方文档:设置Elasticsearch,https://www.elastic.co/guide/en/elasticsearch/reference/current/setting-system-settings.html</think>### `chown -R es:es /usr/local/elasticsearch` 命令详解 #### 一、命令作用 该命令用于**递归修改 Elasticsearch 目录的所有权**: 1. **用户/组设置** `es:es` 表示: - 第一个 `es`:目标用户(owner) - 第二个 `es`:目标用户组(group) $$ \text{chown} \underbrace{\text{-R}}_{\text{递归}} \overbrace{\text{es}}^{\text{用户}} : \overbrace{\text{es}}^{\text{组}} \underbrace{\text{/usr/local/elasticsearch}}_{\text{目录路径}} $$ 2. **递归操作标志** `-R` 表示递归处理目录下的所有子目录和文件: $$ \text{作用范围} = \left\{ \text{/usr/local/elasticsearch} \cup \text{其所有子内容} \right\} $$ 3. **权限变更结果** 执行后,目标目录及其内容的所有权关系变为: ```bash # 示例输出 drwxr-xr-x 5 es es 4096 Jun 10 config/ -rw-r--r-- 1 es es 1234 Jun 10 elasticsearch.yml ``` #### 二、在 Elasticsearch 中的核心应用场景 1. **安全运行环境配置** Elasticsearch **禁止以 root 用户运行**(v5.x+ 强制要求)。通过此命令将安装目录所有权赋予专用用户 `es`,避免权限冲突: ```bash # 启动前必须操作 sudo chown -R es:es /usr/local/elasticsearch sudo -u es ./bin/elasticsearch # 以es用户启动 ``` 2. **解决启动报错** 当出现以下权限错误时需执行此命令: ```log [ERROR] [o.e.b.Bootstrap] Exception: Permission denied for data paths [/usr/local/elasticsearch/data] ``` 3. **多节点集群部署** 在集群环境中保持统一的用户权限体系: ```bash # 所有节点执行相同操作 for node in node1 node2 node3; do ssh $node "chown -R es:es /usr/local/elasticsearch" done ``` #### 三、操作流程示例 ```mermaid graph LR A[创建es用户/组] --> B[解压安装包到 /usr/local/elasticsearch] B --> C[执行 chown -R es:es ...] C --> D[以es用户启动服务] ``` #### 四、关键注意事项 1. **前置条件** 需先创建用户/组(若不存在): ```bash sudo groupadd es sudo useradd -g es es -s /bin/false # 创建无登录权限的系统用户 ``` 2. **路径差异处理** 如果使用自定义路径(如 `/opt/elasticsearch`),需同步修改命令中的路径。 3. **配置文件权限** 需确保 `elasticsearch.yml` 等配置文件保留可读权限: ```bash chmod 644 /usr/local/elasticsearch/config/*.yml ``` > **安全实践**:Elasticsearch 官方明确要求通过专用用户运行服务,这是防止未授权访问的关键措施[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据与AI实验室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值