第二章:安装部署

详细讲解 Elasticsearch 的多种安装方式,包括单节点安装、Docker 部署和集群部署。

最后更新: 2024-01-15
页面目录

第二章:安装部署

2.1 环境要求

2.1.1 硬件要求

组件 最低配置 推荐配置
CPU 2 核 8 核以上
内存 4 GB 32 GB 以上
磁盘 20 GB SSD 500 GB+
网络 千兆 万兆

2.1.2 软件要求

  • 操作系统:Linux(推荐)、macOS、Windows
  • JDK:Elasticsearch 8.x 内置 JDK 17,7.x 需要 JDK 8+
  • 用户:非 root 用户运行

2.2 下载 Elasticsearch

# 下载 Elasticsearch 8.x 最新版
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.12.0-linux-x86_64.tar.gz
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.12.0-linux-x86_64.tar.gz.sha512

# 验证完整性
shasum -a 512 -c elasticsearch-8.12.0-linux-x86_64.tar.gz.sha512

# 解压
tar -xzf elasticsearch-8.12.0-linux-x86_64.tar.gz
cd elasticsearch-8.12.0/

2.3 单节点安装

2.3.1 配置 Elasticsearch

编辑 config/elasticsearch.yml

# 集群名称
cluster.name: my-es-cluster

# 节点名称
node.name: node-1

# 数据目录
path.data: /data/elasticsearch/data

# 日志目录
path.logs: /var/log/elasticsearch

# 绑定的网络地址
network.host: 0.0.0.0

# HTTP 端口
http.port: 9200

# 初始主节点列表
cluster.initial_master_nodes: ["node-1"]

# 关闭安全认证(开发环境)
xpack.security.enabled: false
xpack.security.enrollment.enabled: false

2.3.2 启动 Elasticsearch

# 创建非 root 用户(必须)
useradd -m -s /bin/bash elasticsearch
chown -R elasticsearch:elasticsearch /path/to/elasticsearch-8.12.0

# 切换用户启动
su - elasticsearch
./bin/elasticsearch

# 后台运行
./bin/elasticsearch -d -p pid

2.3.3 验证安装

# 检查健康状态
curl http://localhost:9200/_cluster/health?pretty

# 响应示例
{
  "cluster_name": "my-es-cluster",
  "status": "green",
  "timed_out": false,
  "number_of_nodes": 1,
  "number_of_data_nodes": 1,
  "active_primary_shards": 0,
  "active_shards": 0,
  "relocating_shards": 0,
  "initializing_shards": 0,
  "unassigned_shards": 0,
  "delayed_unassigned_shards": 0,
  "number_of_pending_tasks": 0,
  "number_of_in_flight_fetch": 0
}

# 查看节点信息
curl http://localhost:9200/_nodes?pretty

2.4 Docker 部署

2.4.1 单节点 Docker 部署

# 拉取镜像
docker pull elasticsearch:8.12.0

# 创建数据卷目录
mkdir -p /data/elasticsearch/{data,logs,backup}
chmod 777 /data/elasticsearch/{data,logs,backup}

# 启动单节点
docker run -d \
  --name es-node1 \
  -p 9200:9200 \
  -p 9300:9300 \
  -e "discovery.type=single-node" \
  -e "ES_JAVA_OPTS=-Xms2g -Xmx2g" \
  -e "xpack.security.enabled=false" \
  -v /data/elasticsearch/data:/usr/share/elasticsearch/data \
  -v /data/elasticsearch/logs:/usr/share/elasticsearch/logs \
  --restart=always \
  elasticsearch:8.12.0

2.4.2 Docker Compose 集群部署

创建 docker-compose.yml

version: '3.8'

services:
  es01:
    image: elasticsearch:8.12.0
    container_name: es01
    environment:
      - node.name=es01
      - cluster.name=es-cluster
      - discovery.seed_hosts=es02,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - "ES_JAVA_OPTS=-Xms2g -Xmx2g"
      - xpack.security.enabled=false
    volumes:
      - es01_data:/usr/share/elasticsearch/data
    ports:
      - "9200:9200"
      - "9300:9300"
    networks:
      - es_net

  es02:
    image: elasticsearch:8.12.0
    container_name: es02
    environment:
      - node.name=es02
      - cluster.name=es-cluster
      - discovery.seed_hosts=es01,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - "ES_JAVA_OPTS=-Xms2g -Xmx2g"
      - xpack.security.enabled=false
    volumes:
      - es02_data:/usr/share/elasticsearch/data
    networks:
      - es_net

  es03:
    image: elasticsearch:8.12.0
    container_name: es03
    environment:
      - node.name=es03
      - cluster.name=es-cluster
      - discovery.seed_hosts=es01,es02
      - cluster.initial_master_nodes=es01,es02,es03
      - "ES_JAVA_OPTS=-Xms2g -Xmx2g"
      - xpack.security.enabled=false
    volumes:
      - es03_data:/usr/share/elasticsearch/data
    networks:
      - es_net

  kibana:
    image: kibana:8.12.0
    container_name: kibana
    environment:
      - ELASTICSEARCH_HOSTS=http://es01:9200
    ports:
      - "5601:5601"
    networks:
      - es_net
    depends_on:
      - es01

volumes:
  es01_data:
  es02_data:
  es03_data:

networks:
  es_net:
    driver: bridge

启动集群:

docker-compose up -d

# 检查集群状态
curl http://localhost:9200/_cluster/health?pretty

2.5 Linux 系统服务部署

2.5.1 安装 RPM 包(CentOS/RHEL)

# 下载 RPM 包
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.12.0-x86_64.rpm

# 安装
sudo rpm -ivh elasticsearch-8.12.0-x86_64.rpm

# 启用开机启动
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch

# 查看状态
sudo systemctl status elasticsearch

2.5.2 APT 安装(Debian/Ubuntu)

# 添加 Elastic GPG key
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

# 添加仓库
echo "deb https://artifacts.elastic.co/packages/8.x/apt stable main" | \
  sudo tee /etc/apt/sources.list.d/elastic-8.x.list

# 安装
sudo apt-get update && sudo apt-get install elasticsearch

# 配置服务
sudo /bin/systemctl daemon-reload
sudo /bin/systemctl enable elasticsearch
sudo /bin/systemctl start elasticsearch

2.6 集群配置

2.6.1 生产环境配置

# /etc/elasticsearch/elasticsearch.yml

# 集群配置
cluster.name: production-es-cluster
node.name: ${HOSTNAME}
node.attr.region: us-east-1

# 路径配置
path.data: /data/elasticsearch/data
path.logs: /var/log/elasticsearch
path.repo: /backup/elasticsearch

# 网络配置
network.host: 0.0.0.0
transport.tcp.port: 9300
http.port: 9200
http.max_content_length: 200mb

# 发现配置
discovery.seed_hosts:
  - 192.168.1.101:9300
  - 192.168.1.102:9300
  - 192.168.1.103:9300

cluster.initial_master_nodes:
  - node-1
  - node-2
  - node-3

# 内存锁定
bootstrap.memory_lock: true

# JVM 配置
# 在 jvm.options 中配置

2.6.2 JVM 配置

编辑 config/jvm.options.d/jvm.options

# 堆大小(建议为物理内存的 50%,不超过 32GB)
-Xms4g
-Xmx4g

# GC 配置
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:G1ReservePercent=25

# 其他优化
-XX:+AlwaysPreTouch
-Djava.io.tmpdir=${ES_TEMP_DIR}

2.7 常用运维命令

2.7.1 节点操作

# 查看所有节点
curl -X GET "localhost:9200/_cat/nodes?v"

# 查看节点属性
curl -X GET "localhost:9200/_nodes/stats?pretty"

# 关闭节点
curl -X POST "localhost:9200/_shutdown"

2.7.2 集群健康检查

# 健康状态
curl -X GET "localhost:9200/_cluster/health?pretty"

# 等待特定状态
curl -X GET "localhost:9200/_cluster/health?wait_for_status=yellow&timeout=50s"

# 分片分配
curl -X GET "localhost:9200/_cat/allocation?v"

2.8 常见问题排查

问题 原因 解决方案
启动失败 内存不足 增加物理内存或降低堆大小
启动失败 文件权限 检查 data/logs 目录权限
健康状态 yellow 副本未分配 增加节点或调整副本数
健康状态 red 主分片丢失 使用快照恢复
连接拒绝 端口被占用 检查端口或修改配置

2.9 总结

本章介绍了 Elasticsearch 的多种安装部署方式,包括单节点安装、Docker 部署和集群部署。在生产环境中,建议使用至少 3 个节点的集群部署,并进行合理的 JVM 和系统配置。下一章将详细介绍 Elasticsearch 的核心概念。