从零开始:在GitHub上部署Elasticsearch的详细步骤

从零开始:在 GitHub 上部署 Elasticsearch 的详尽指南

Elasticsearch 是一个强大的开源搜索和分析引擎,广泛应用于日志分析、全文搜索、安全情报、业务分析等场景。GitHub 作为一个流行的代码托管平台,可以用来管理 Elasticsearch 的配置文件、插件,甚至可以通过 GitHub Actions 实现自动化部署。本文将详细介绍如何从零开始在 GitHub 上部署 Elasticsearch,涵盖从环境准备到集群配置、安全设置,以及与 GitHub 集成的各个方面。

一、准备工作:构建坚实的基础

在开始部署之前,我们需要做好充分的准备,确保后续步骤顺利进行。

1.1 硬件与软件需求

  • 服务器:至少需要一台服务器来运行 Elasticsearch。根据你的数据量和查询负载,选择合适的 CPU、内存和存储配置。建议至少 8GB 内存和足够的 SSD 存储。
  • 操作系统:Elasticsearch 支持多种操作系统,包括 Linux、Windows 和 macOS。本文以 Linux(例如 Ubuntu 20.04)为例进行演示。
  • Java Development Kit (JDK):Elasticsearch 依赖 Java 运行环境。确保安装了 OpenJDK 或 Oracle JDK 的长期支持(LTS)版本,例如 Java 11 或 Java 17。
  • GitHub 账户:你需要一个 GitHub 账户来创建和管理代码仓库。
  • 网络配置:确保服务器的网络是通的,或者配置好了相关的代理

1.2 安装 JDK

在 Linux 系统上,可以使用包管理器安装 OpenJDK:

bash
sudo apt update
sudo apt install openjdk-11-jdk -y

安装完成后,验证 Java 版本:

bash
java -version

1.3 创建 GitHub 仓库

登录你的 GitHub 账户,创建一个新的仓库来管理 Elasticsearch 的配置文件和部署脚本。建议将仓库命名为 elasticsearch-deployment 或类似的名称,并选择合适的可见性(公开或私有)。

二、下载与安装 Elasticsearch

2.1 下载 Elasticsearch

前往 Elasticsearch 官方下载页面 (https://www.elastic.co/downloads/elasticsearch),选择适合你操作系统的安装包。对于 Linux 系统,可以选择 .tar.gz.deb 包。

使用 wget 命令下载 .tar.gz 包:

bash
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.x.x-linux-x86_64.tar.gz

* 将8.x.x替换成你需要的版本

2.2 解压与安装

下载完成后,解压 .tar.gz 包:

bash
tar -xzf elasticsearch-8.x.x-linux-x86_64.tar.gz

将解压后的文件夹移动到合适的目录,例如 /opt/elasticsearch

bash
sudo mv elasticsearch-8.x.x /opt/elasticsearch

2.3 创建数据和日志目录

为了保证 Elasticsearch 的数据和日志文件有合适的存储位置,我们需要创建相应的目录:

bash
sudo mkdir -p /data/elasticsearch/data
sudo mkdir -p /var/log/elasticsearch

并设置目录权限,确保 Elasticsearch 进程有权访问这些目录:

bash
sudo chown -R elasticsearch:elasticsearch /data/elasticsearch/data
sudo chown -R elasticsearch:elasticsearch /var/log/elasticsearch

三、配置 Elasticsearch

Elasticsearch 的主要配置文件位于 config 目录下。我们需要修改几个关键的配置文件来满足我们的部署需求。

3.1 elasticsearch.yml

elasticsearch.yml 是 Elasticsearch 的主配置文件,包含了集群、节点、网络、路径等各种设置。

打开 elasticsearch.yml 文件:

bash
sudo nano /opt/elasticsearch/config/elasticsearch.yml

以下是一些关键配置项的说明和建议设置:

  • cluster.name: 集群名称。同一集群中的节点必须具有相同的集群名称。

    yaml
    cluster.name: my-elasticsearch-cluster

  • node.name: 节点名称。建议为每个节点设置一个唯一的名称。

    yaml
    node.name: node-1

  • path.data: 数据存储路径。

    yaml
    path.data: /data/elasticsearch/data

  • path.logs: 日志存储路径。

    yaml
    path.logs: /var/log/elasticsearch

  • network.host: 网络绑定地址。默认情况下,Elasticsearch 只绑定到本地回环地址(127.0.0.1)。如果要允许外部访问,需要设置为服务器的 IP 地址或 0.0.0.0(表示绑定到所有网络接口)。

    yaml
    network.host: 0.0.0.0

  • http.port: HTTP 端口。默认端口为 9200。

    yaml
    http.port: 9200

  • discovery.seed_hosts: 集群发现设置。在多节点集群中,需要配置此项以指定集群中的其他节点。

    yaml
    discovery.seed_hosts: ["192.168.1.10", "192.168.1.11"]

  • cluster.initial_master_nodes:在启动一个全新的集群时,设置一系列符合主节点条件的节点名称。

    yaml
    cluster.initial_master_nodes: ["node-1"]

3.2 jvm.options

jvm.options 文件用于配置 Elasticsearch 的 Java 虚拟机(JVM)参数。

打开 jvm.options 文件:

bash
sudo nano /opt/elasticsearch/config/jvm.options

关键配置项包括:

  • -Xms: JVM 初始堆内存大小。
  • -Xmx: JVM 最大堆内存大小。

建议将 -Xms-Xmx 设置为相同的值,以避免 JVM 在运行时调整堆大小带来的性能开销。根据服务器的内存大小,合理设置堆内存大小,通常建议设置为物理内存的一半,但不超过 32GB。

例如:

-Xms4g
-Xmx4g

3.3 log4j2.properties

如果需要自定义日志配置,可以修改log4j2.properties文件。

四、启动与测试 Elasticsearch

完成配置后,我们可以尝试启动 Elasticsearch。

4.1 启动 Elasticsearch

切换到 Elasticsearch 的安装目录:

bash
cd /opt/elasticsearch

以非 root 用户启动 Elasticsearch(出于安全考虑,Elasticsearch 不允许以 root 用户运行):

bash
sudo -u elasticsearch ./bin/elasticsearch

如果一切顺利,你将在控制台看到 Elasticsearch 的启动日志。

也可以以后台方式启动:
bash
sudo -u elasticsearch ./bin/elasticsearch -d

4.2 测试 Elasticsearch

打开浏览器或使用 curl 命令访问 Elasticsearch 的 HTTP 端口(默认为 9200):

bash
curl http://localhost:9200

如果 Elasticsearch 正常运行,你将看到类似以下的 JSON 响应:

json
{
"name" : "node-1",
"cluster_name" : "my-elasticsearch-cluster",
"cluster_uuid" : "...",
"version" : {
"number" : "8.x.x",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "...",
"build_date" : "...",
"build_snapshot" : false,
"lucene_version" : "...",
"minimum_wire_compatibility_version" : "...",
"minimum_index_compatibility_version" : "..."
},
"tagline" : "You Know, for Search"
}

4.3 设置开机自启动

为了方便管理,我们可以将 Elasticsearch 设置为系统服务,并配置开机自启动。

创建 Elasticsearch 服务配置文件:

bash
sudo nano /etc/systemd/system/elasticsearch.service

添加以下内容:

```
[Unit]
Description=Elasticsearch
Documentation=https://www.elastic.co
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=elasticsearch
Group=elasticsearch
WorkingDirectory=/opt/elasticsearch

ExecStart=/opt/elasticsearch/bin/elasticsearch
ExecStop=/opt/elasticsearch/bin/elasticsearch-stop

优化参数

LimitNOFILE=65536
LimitMEMLOCK=infinity
Environment=ES_JAVA_OPTS="-Xms4g -Xmx4g"

Restart=on-failure

[Install]
WantedBy=multi-user.target
```

保存并关闭文件。

重新加载 systemd 配置:

bash
sudo systemctl daemon-reload

启动 Elasticsearch 服务:

bash
sudo systemctl start elasticsearch

设置开机自启动:

bash
sudo systemctl enable elasticsearch

检查服务状态:

bash
sudo systemctl status elasticsearch

五、安全加固:保护你的数据

默认情况下,Elasticsearch 没有任何安全措施。为了保护你的数据,强烈建议进行安全加固。

5.1 启用 X-Pack Security

Elasticsearch 的 X-Pack Security 功能提供了用户认证、角色授权、数据加密等安全特性。

elasticsearch.yml 文件中启用 X-Pack Security:

yaml
xpack.security.enabled: true

5.2 设置内置用户密码

Elasticsearch 提供了几个内置用户,如 elastickibanalogstash_system 等。我们需要为这些用户设置密码。

运行 elasticsearch-setup-passwords 工具:

bash
sudo /opt/elasticsearch/bin/elasticsearch-setup-passwords interactive

按照提示为每个内置用户设置密码。

5.3 配置 TLS/SSL 加密

为了保护 Elasticsearch 节点之间以及客户端与集群之间的通信安全,建议配置 TLS/SSL 加密。

生成 TLS/SSL 证书:

可以使用 Elasticsearch 提供的 elasticsearch-certutil 工具生成自签名证书,也可以使用其他工具(如 OpenSSL)生成证书。

使用 elasticsearch-certutil 生成证书:

bash
sudo /opt/elasticsearch/bin/elasticsearch-certutil cert -out config/certs/elastic-certificates.p12 -pass ""

将生成的证书文件 elastic-certificates.p12 放置到 Elasticsearch 的配置目录(config/certs)。

修改 elasticsearch.yml 文件,配置 TLS/SSL:

```yaml
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12

xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.verification_mode: certificate
xpack.security.http.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.http.ssl.truststore.path: certs/elastic-certificates.p12
```

5.4 配置防火墙

为了限制对 Elasticsearch 的访问,建议配置防火墙规则,只允许受信任的 IP 地址或网络访问 Elasticsearch 的端口(默认为 9200 和 9300)。

例如,使用 ufw 防火墙允许特定 IP 地址访问 9200 端口:

bash
sudo ufw allow from 192.168.1.100 to any port 9200

六、与 GitHub 集成:自动化部署与管理

将 Elasticsearch 的配置文件和部署脚本托管到 GitHub 上,可以带来以下好处:

  • 版本控制:跟踪配置文件的更改历史,方便回滚到之前的版本。
  • 协作:多人协作开发和维护 Elasticsearch 配置。
  • 自动化部署:使用 GitHub Actions 或其他 CI/CD 工具实现自动化部署和升级。

6.1 将配置文件上传到 GitHub

在你的 GitHub 仓库中创建一个名为 config 的文件夹,将 Elasticsearch 的配置文件(elasticsearch.ymljvm.options 等)上传到该文件夹。

创建部署脚本:

你可以编写一个简单的 shell 脚本来自动化 Elasticsearch 的安装、配置和启动过程。将脚本上传到 GitHub 仓库。

6.2 使用 GitHub Actions 实现自动化部署

GitHub Actions 是 GitHub 提供的一个 CI/CD 工具,可以用来自动化构建、测试和部署你的代码。

在你的 GitHub 仓库中创建一个名为 .github/workflows 的文件夹,并在其中创建一个 YAML 文件(例如 deploy.yml)来定义你的工作流。

以下是一个简单的 GitHub Actions 工作流示例,用于在服务器上部署 Elasticsearch:

```yaml
name: Deploy Elasticsearch

on:
push:
branches:
- main

jobs:
deploy:
runs-on: ubuntu-latest

steps:
  - name: Checkout code
    uses: actions/checkout@v3

  - name: SSH into server and deploy
    uses: appleboy/ssh-action@master
    with:
      host: ${{ secrets.SERVER_HOST }}
      username: ${{ secrets.SERVER_USERNAME }}
      key: ${{ secrets.SERVER_SSH_KEY }}
      script: |
        cd /path/to/your/elasticsearch-deployment
        git pull origin main
        sudo systemctl restart elasticsearch

```

这个工作流会在你向 main 分支推送代码时触发,通过 SSH 连接到你的服务器,拉取最新的代码,并重启 Elasticsearch 服务。

你需要将服务器的 IP 地址、用户名和 SSH 私钥添加到 GitHub 仓库的 Secrets 中。

七、集群部署与管理

在生产环境中,通常需要部署多节点的 Elasticsearch 集群以实现高可用性和水平扩展。

7.1 集群规划

在部署集群之前,需要进行合理的集群规划,包括:

  • 节点数量:根据数据量、查询负载和可用性要求确定节点数量。
  • 节点角色:Elasticsearch 有多种节点角色,如 master 节点、data 节点、ingest 节点、coordinating 节点等。根据需求分配节点角色。
  • 分片与副本:合理设置索引的分片数和副本数,以平衡性能和可靠性。

7.2 多节点配置

在每个节点的 elasticsearch.yml 文件中,配置 discovery.seed_hosts 参数,指定集群中的其他节点:

yaml
discovery.seed_hosts: ["192.168.1.10", "192.168.1.11", "192.168.1.12"]

确保每个节点具有唯一的 node.name

7.3 集群监控

Elasticsearch 提供了多种监控工具和 API,可以用来监控集群的健康状态、性能指标等。

  • Kibana:Kibana 是 Elasticsearch 的官方可视化工具,提供了丰富的监控和管理功能。
  • Elasticsearch Monitoring API:通过 API 可以获取集群的各种状态信息。
  • 第三方监控工具:如 Prometheus、Grafana 等。

八、高级进阶

当基础的Elasticsearch集群部署完成后,我们可以考虑更多进阶内容提升集群的性能和功能

8.1 插件安装

Elasticsearch有丰富的插件生态,这些插件可以扩展Elasticsearch的功能。

安装插件,例如安装 analysis-icu 插件:
sudo /opt/elasticsearch/bin/elasticsearch-plugin install analysis-icu
插件通常安装在/opt/elasticsearch/plugins/目录,安装后需要重启Elasticsearch使插件生效.

8.2 快照与恢复

为了保证数据的安全,可以对集群做周期性的快照备份。

首先需要在elasticsearch.yml中配置快照仓库的路径:
path.repo: ["/path/to/snapshot/repository"]

然后可以使用API创建快照仓库:
PUT /_snapshot/my_backup
{
"type": "fs",
"settings": {
"location": "/path/to/snapshot/repository"
}
}

创建快照:
PUT /_snapshot/my_backup/snapshot_1?wait_for_completion=true

从快照恢复:
POST /_snapshot/my_backup/snapshot_1/_restore

8.3 滚动升级

当Elasticsearch有新版本发布时,可以使用滚动升级的方式,在不停止服务的情况下完成集群升级。

滚动升级的主要步骤如下:

  1. 禁用分片分配
  2. 停止一个节点
  3. 升级该节点
  4. 重新启动节点并等待其加入集群
  5. 启用分片分配
  6. 对集群中每个节点重复步骤2-5

详细的滚动升级步骤,可以参考官方文档。

展望未来:持续优化与演进

本文详细介绍了如何在 GitHub 上部署 Elasticsearch,并涵盖了环境准备、安装配置、安全加固、与 GitHub 集成、集群部署与管理等方面。通过遵循这些步骤,你可以成功搭建一个稳定、安全、可扩展的 Elasticsearch 集群。

然而,Elasticsearch 的部署和管理是一个持续的过程。随着业务的发展和需求的变化,你需要不断地优化和调整集群配置,以满足性能、可用性和安全性的要求。

此外,Elasticsearch 生态系统也在不断发展,新的功能和工具不断涌现。保持对 Elasticsearch 社区的关注,学习新的技术和最佳实践,可以让你的 Elasticsearch 集群始终保持最佳状态。

THE END