欢迎光临
我们一直在努力

Elasticsearch生产集群构建实战:从单节点到冷热架构的完整部署指南

Elasticsearch生产环境如何部署?如何构建高可用集群?冷热数据如何分离?本文将从虚拟机环境搭建开始,手把手教你部署ES生产集群,包括3节点高可用架构、5节点主从分离架构、冷热集群架构,详细讲解每个配置参数的含义和最佳实践,助你避开生产环境的各种坑!


📋 文章目录

  • 一、虚拟机环境搭建
  • 二、Elasticsearch单节点部署
  • 三、生产集群核心配置详解
  • 四、5节点高可用集群部署
  • 五、Kibana部署
  • 六、冷热集群架构
  • 七、常见问题与解决方案

一、虚拟机环境搭建

1.1 VMware下载安装

下载地址:

  • Windows & Linux:VMware Workstation 16 Pro
  • MacOS:VMware Fusion

1.2 CentOS系统镜像

下载地址:https://centos.org/download/

根据CPU架构选择对应版本,常见为x86_64架构

1.3 网卡配置

编辑网卡配置文件:

vi /etc/sysconfig/network-scripts/ifcfg-ens33

配置内容:

TYPE="Ethernet"
BOOTPROTO="none" # 关闭DHCP,使用静态IP
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes" # 开机启动

# IP配置(根据实际环境修改)
IPADDR="192.168.3.81" # 节点IP地址
PREFIX="24"
GATEWAY="192.168.3.1"
DNS1="114.114.114.114"
DNS2="8.8.8.8"

重启网络服务:

service network restart
# 或
systemctl restart network

1.4 安装必要工具

yum install -y vim wget net-tools

1.5 Java环境配置

ES 7.x需要JDK 11+,检查兼容性列表确保版本匹配。


二、Elasticsearch单节点部署

2.1 下载与解压

# 下载ES
cd /usr/local
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.13.0-linux-x86_64.tar.gz

# 解压
tar -xzvf elasticsearch-7.13.0-linux-x86_64.tar.gz

# 重命名(可选)
mv elasticsearch-7.13.0 elasticsearch

2.2 创建专用用户

ES禁止使用root用户启动,必须创建专用用户:

# 创建elastic用户
useradd elastic

# 设置密码
passwd elastic

# 赋予目录权限
chown -R elastic:elastic /usr/local/elasticsearch

2.3 启动ES服务

# 切换到elastic用户
su – elastic

cd /usr/local/elasticsearch

# 方式1:前台启动(开发调试)
./bin/elasticsearch

# 方式2:后台启动
./bin/elasticsearch -d

# 方式3:推荐方式(后台启动 + 保存进程号)
./bin/elasticsearch -d -p pid

2.4 停止ES服务

# 通过pid文件停止
kill -9 `cat pid`
# 或
pkill -F pid

# 或者查找进程号停止
ps -ef | grep elastic
kill -9 <进程号>

2.5 防火墙配置

# 关闭防火墙(开发环境)
systemctl stop firewalld
systemctl disable firewalld

# 或开放指定端口(生产环境)
firewall-cmd –permanent –add-port=9200/tcp
firewall-cmd –permanent –add-port=9300/tcp
firewall-cmd –reload


三、生产集群核心配置详解

3.1 关键配置参数

配置项说明示例
cluster.name 集群名称,相同名称的节点属于同一集群 cluster.name: c1
node.name 节点名称,集群内唯一 node.name: node-1
node.roles 节点角色 [master,data]
network.host 对外服务地址 192.168.3.181
http.port HTTP端口 9200
transport.port 集群通信端口 9300
bootstrap.memory_lock 禁止交换内存 true
discovery.seed_hosts 种子节点列表 ["192.168.3.181:9300", …]
cluster.initial_master_nodes 初始master节点 ["node-1"]

3.2 节点角色详解

# 7.13+版本的节点角色配置
node.roles: [master, data, ingest, ml, remote_cluster_client, transform]

角色说明
master 主节点,负责集群管理
data 数据节点,存储数据
data_content 内容数据节点
data_hot 热数据节点
data_warm 温数据节点
data_cold 冷数据节点
data_frozen 冻结数据节点
ingest 摄取节点,预处理数据
ml 机器学习节点
voting_only 仅投票节点(master-eligible但不参与选举)

⚠️ 重要:node.roles如果显式配置,节点只拥有配置的角色;如果不配置,拥有所有角色。不熟悉角色时不要随意配置。

3.3 内存锁定配置

Swapping对ES性能和稳定性非常不利,可能导致GC持续数分钟!

bootstrap.memory_lock: true

系统配置:

# 编辑limits.conf
vi /etc/security/limits.conf

# 添加以下配置
elastic soft memlock unlimited
elastic hard memlock unlimited


四、5节点高可用集群部署

4.1 架构设计

┌─────────────────────────────────────────────────────────────┐
│ 5节点ES集群架构 │
├─────────────┬─────────────┬─────────────┬───────────────────┤
│ node-1 │ node-2 │ node-3 │ node-4 node-5 │
│ [master] │ [master] │ [master, │ [data] [data] │
│ │ │ data, │ │
│ │ │ voting_only]│ │
├─────────────┴─────────────┴─────────────┴───────────────────┤
│ Master集群(3节点) │ Data节点(2节点) │
└─────────────────────────────────────────────────────────────┘

设计原则:

  • 3个Master节点:保证高可用,避免脑裂
  • 2个Data节点:存储数据
  • node-3同时作为master、data和voting_only

4.2 节点配置

node-1(纯Master节点)

cluster.name: c1
node.name: node1
node.roles: [master]

path.data: /path/to/data
path.logs: /path/to/logs

bootstrap.memory_lock: true

network.host: 192.168.3.181
http.port: 9200
transport.port: 9300

discovery.seed_hosts:
["192.168.3.181:9300",
"192.168.3.182:9300",
"192.168.3.183:9300",
"192.168.3.184:9300",
"192.168.3.185:9300"]

cluster.initial_master_nodes: ["node-1"]

node-2(纯Master节点)

cluster.name: c1
node.name: node2
node.roles: [master]

path.data: /path/to/data
path.logs: /path/to/logs

bootstrap.memory_lock: true

network.host: 192.168.3.182
http.port: 9200
transport.port: 9300

discovery.seed_hosts:
["192.168.3.181:9300",
"192.168.3.182:9300",
"192.168.3.183:9300",
"192.168.3.184:9300",
"192.168.3.185:9300"]

cluster.initial_master_nodes: ["node-1"]

node-3(Master+Data+Voting)

cluster.name: c1
node.name: node3
node.roles: [master, data, voting_only]

path.data: /path/to/data
path.logs: /path/to/logs

bootstrap.memory_lock: true

network.host: 192.168.3.183
http.port: 9200
transport.port: 9300

discovery.seed_hosts:
["192.168.3.181:9300",
"192.168.3.182:9300",
"192.168.3.183:9300",
"192.168.3.184:9300",
"192.168.3.185:9300"]

cluster.initial_master_nodes: ["node-1"]

node-4(纯Data节点)

cluster.name: c1
node.name: node4
node.roles: [data]

path.data: /path/to/data
path.logs: /path/to/logs

bootstrap.memory_lock: true

network.host: 192.168.3.184
http.port: 9200
transport.port: 9300

discovery.seed_hosts:
["192.168.3.181:9300",
"192.168.3.182:9300",
"192.168.3.183:9300",
"192.168.3.184:9300",
"192.168.3.185:9300"]

cluster.initial_master_nodes: ["node-1"]

node-5(纯Data节点)

cluster.name: c1
node.name: node5
node.roles: [data]

path.data: /path/to/data
path.logs: /path/to/logs

bootstrap.memory_lock: true

network.host: 192.168.3.185
http.port: 9200
transport.port: 9300

discovery.seed_hosts:
["192.168.3.181:9300",
"192.168.3.182:9300",
"192.168.3.183:9300",
"192.168.3.184:9300",
"192.168.3.185:9300"]

cluster.initial_master_nodes: ["node-1"]

4.3 启动顺序

# 1. 先启动node-1(初始master)
# 2. 再启动node-2、node-3(master候选节点)
# 3. 最后启动node-4、node-5(data节点)

# 验证集群状态
curl http://192.168.3.181:9200/_cluster/health?pretty


五、Kibana部署

5.1 下载与解压

# 下载Kibana
cd /usr/local
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.13.0-linux-x86_64.tar.gz

# 解压
tar -xzvf kibana-7.13.0-linux-x86_64.tar.gz
mv kibana-7.13.0-linux-x86_64 kibana

5.2 配置Kibana

vi /usr/local/kibana/config/kibana.yml

配置内容:

server.port: 5601
server.host: "192.168.3.120" # Kibana所在服务器IP

# ES集群地址
elasticsearch.hosts:
["http://192.168.3.181:9200",
"http://192.168.3.182:9200"]

# 可选:配置中文
i18n.locale: "zh-CN"

5.3 启动Kibana

# 前台启动
./bin/kibana

# 后台启动
nohup ./bin/kibana &


六、冷热集群架构

6.1 什么是冷热架构?

时间线 ───────────────────────────────────────────────►
│ │ │ │
▼ ▼ ▼ ▼
┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐
│ Hot │──►│Warm │──►│Cold │──►│Frozen│
│热数据│ │温数据│ │冷数据│ │冻结数据│
└─────┘ └─────┘ └─────┘ └─────┘
SSD SAS SATA 归档存储
高性能 中性能 低性能 极低性能
贵 中 便宜 极便宜

数据生命周期管理:

  • Hot:最新数据,频繁查询,高性能SSD存储
  • Warm:近期数据,查询较少,普通磁盘存储
  • Cold:历史数据,很少查询,大容量磁盘存储
  • Frozen:归档数据,极少查询,最廉价存储

6.2 节点角色配置

# Hot节点
node.roles: [data_hot, data_content]

# Warm节点
node.roles: [data_warm, data_content]

# Cold节点
node.roles: [data_cold, data_content]

# Frozen节点
node.roles: [data_frozen, data_content]

6.3 自定义属性方式(推荐)

步骤1:配置节点属性

# Hot节点配置
node.attr.hot_warm_cold: hot

# Warm节点配置
node.attr.hot_warm_cold: warm

# Cold节点配置
node.attr.hot_warm_cold: cold

步骤2:配置集群感知规则

PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.awareness.attributes": "hot_warm_cold"
}
}

步骤3:创建索引并指定存储位置

# 在Hot节点创建索引
PUT index_logs_2024
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1,
"index.routing.allocation.require.hot_warm_cold": "hot"
}
}

步骤4:数据迁移(从Hot到Warm)

# 将索引数据从Hot节点迁移到Warm节点
PUT index_logs_2024/_settings
{
"index.routing.allocation.require.hot_warm_cold": "warm"
}

6.4 完整案例

场景:3节点集群(node1-hot, node2-warm, node3-cold)

节点配置:

# node1(Hot节点)
node.name: nodehot
node.attr.hot_warm_cold: hot
node.roles: [data, master]

# node2(Warm节点)
node.name: nodewarm
node.attr.hot_warm_cold: warm
node.roles: [data]

# node3(Cold节点)
node.name: nodecold
node.attr.hot_warm_cold: cold
node.roles: [data]

数据流转:

# 1. 配置集群感知
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.awareness.attributes": "hot_warm_cold"
}
}

# 2. 创建索引,数据写入Hot节点
PUT index_a
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1,
"index.routing.allocation.include.hot_warm_cold": "hot"
}
}

# 3. 7天后,数据迁移到Warm节点
PUT index_a/_settings
{
"index.routing.allocation.include.hot_warm_cold": "warm"
}

# 4. 30天后,数据迁移到Cold节点
PUT index_a/_settings
{
"index.routing.allocation.include.hot_warm_cold": "cold"
}


七、常见问题与解决方案

7.1 内存锁定失败

错误信息:

ERROR: [1] bootstrap checks failed
[1]: memory locking requested for elasticsearch process but memory is not locked

解决方案:

# 1. 编辑limits.conf
vi /etc/security/limits.conf

# 2. 添加配置
elastic soft memlock unlimited
elastic hard memlock unlimited

# 3. 重新登录elastic用户
su – elastic

7.2 无法发现集群

错误信息:

master not discovered yet

解决方案:

  • 检查discovery.seed_hosts配置
  • 检查网络连通性(telnet 9300端口)
  • 检查防火墙配置
  • 7.3 节点角色配置错误

    问题:单节点集群配置了data_hot角色,无法启动。

    解决方案:单节点必须同时配置master和data角色,使用data_content而非data_hot。

    7.4 生产环境建议

    配置项建议值说明
    Master节点数 3 奇数个,避免脑裂
    Data节点数 ≥2 保证数据冗余
    JVM堆内存 ≤32GB 避免压缩指针失效
    分片数 根据数据量 单分片10-50GB最佳
    副本数 1-2 保证高可用

    总结

    本文详细介绍了Elasticsearch生产集群的完整部署流程:

  • 环境准备:虚拟机搭建、CentOS安装、网络配置
  • 单节点部署:下载、解压、用户创建、服务启停
  • 集群配置:核心参数详解、节点角色分配
  • 5节点集群:Master与Data分离的高可用架构
  • Kibana部署:可视化工具配置
  • 冷热架构:基于ILM的数据生命周期管理
  • 常见问题:内存锁定、集群发现等问题的解决方案

  • 关键词:Elasticsearch, ES集群, 生产部署, 高可用架构, Master节点, Data节点, 冷热集群, Kibana, 节点角色, 内存锁定

    如果本文对你有帮助,欢迎点赞、收藏、关注!有任何ES部署问题,欢迎在评论区留言讨论。

    赞(0)
    未经允许不得转载:171主机测评 » Elasticsearch生产集群构建实战:从单节点到冷热架构的完整部署指南
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址