三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Ubuntu 22.04 部署 Elastic Stack:APT 安装与生产环境调优指南

Ubuntu 22.04 部署 Elastic Stack:APT 安装与生产环境调优指南

1. 项目概述:为什么要在Ubuntu上部署Elastic Stack

如果你正在处理日志、指标或者任何需要被搜索和分析的数据,那么Elasticsearch和Kibana这对组合几乎是绕不开的。Elasticsearch是一个基于Lucene的分布式搜索和分析引擎,它以近乎实时的速度处理海量数据而闻名。而Kibana则是Elasticsearch的官方数据可视化和管理工具,它让你能通过漂亮的图表、仪表盘和地图,直观地理解数据背后的故事。在Ubuntu服务器上部署这套环境,是构建数据中台、日志分析系统或业务监控平台非常经典且基础的一步。我之所以选择Ubuntu,是因为它在服务器领域的稳定性和广泛的社区支持,无论是物理机、虚拟机还是云主机,部署流程都高度一致且可靠。这篇文章,我会带你从零开始,在Ubuntu 22.04 LTS上,通过官方APT仓库,一步步安装和配置Elasticsearch与Kibana,并分享一些只有踩过坑才知道的配置技巧和排查方法。

2. 环境准备与核心思路解析

在动手之前,明确我们的目标和路径至关重要。我们的目标是在一台纯净的Ubuntu 22.04 LTS系统上,搭建一个可用于生产环境测试或开发的Elasticsearch + Kibana单节点集群。这里有几个关键决策点需要先理清。

2.1 安装方式选型:为什么选择APT而非Docker或Tarball?

安装Elasticsearch主要有三种方式:使用操作系统包管理器(如APT)、使用Docker容器、或者下载压缩包(Tarball)手动安装。对于Ubuntu服务器环境,我强烈推荐使用APT方式。

使用APT安装的优势:

  1. 系统集成度高:APT安装会将Elasticsearch和Kibana注册为系统服务(systemd),这意味着你可以使用熟悉的systemctl start/stop/status elasticsearch命令来管理服务,并且服务会随系统自动启动,这对于服务器运维来说是基本要求。
  2. 依赖管理自动:Java运行时环境(JRE)是Elasticsearch的必须依赖。通过APT安装,如果系统没有合适的Java,安装过程会提示或自动安装OpenJDK,省去手动配置的麻烦。
  3. 配置路径规范:所有配置文件(/etc/elasticsearch//etc/kibana/)、数据目录(/var/lib/elasticsearch/)、日志目录(/var/log/elasticsearch/)都遵循Linux的FHS标准,便于管理和备份。
  4. 安全更新便捷:当Elastic官方发布安全更新时,你可以直接通过sudo apt update && sudo apt upgrade来更新,流程和更新其他系统软件无异。

相比之下,Docker方式虽然隔离性好、部署快,但在生产环境中,对于需要深度监控、性能调优以及与主机系统其他服务紧密集成的场景,直接使用系统服务往往更直观、可控。而Tarball方式则过于手动,不适合用于需要标准化运维的服务器环境。

2.2 版本协同:确保Elasticsearch与Kibana版本严格一致

这是新手最容易踩坑的地方。Elasticsearch和Kibana的主版本号必须完全一致。例如,如果你安装了Elasticsearch 8.12.0,那么Kibana也必须安装8.12.0。跨主版本(如7.x配8.x)完全无法工作,即使是次版本号不同,也可能出现兼容性问题。我们将通过配置Elastic的官方APT仓库来安装,这能天然保证我们从同一源获取版本一致的软件包。在安装时,我们也会显式指定版本号来双重确认。

2.3 硬件与系统先决条件检查

在开始安装前,请确保你的Ubuntu系统满足以下条件:

  • 内存:Elasticsearch是Java应用,且其性能与内存紧密相关。对于学习或轻量级使用,至少需要2GB可用内存。生产环境建议8GB或更多。你可以用free -h命令查看。
  • 磁盘空间:确保/var/lib目录有足够的空间存放数据,建议预留10GB以上。
  • Java:Elasticsearch 8.x需要Java 17或更高版本。我们将通过安装包自动解决。
  • 网络:服务器需要能访问互联网以下载软件包,并且后续Kibana需要通过浏览器访问。

3. 逐步安装Elasticsearch

现在,我们进入核心实操环节。请跟随步骤,并在每个步骤后验证操作是否成功。

3.1 导入Elasticsearch GPG密钥并添加APT仓库

首先,我们需要将Elastic官方的软件源添加到系统的APT源列表中,这样apt才能找到并验证软件包。

打开终端,依次执行以下命令:

# 1. 安装必要的HTTPS传输工具 sudo apt update sudo apt install -y apt-transport-https ca-certificates curl gnupg # 2. 下载并导入Elasticsearch的GPG公钥,用于验证软件包签名 curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic.gpg # 3. 将Elasticsearch仓库定义添加到系统的sources.list.d目录 echo "deb [signed-by=/usr/share/keyrings/elastic.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-8.x.list

关键点解析:

  • apt-transport-https:允许APT通过HTTPS协议下载软件包,现在是必须的。
  • gpg --dearmor:GPG密钥是二进制格式,--dearmor选项将其转换为APT可以识别的ASCII格式。
  • signed-by=:这是一个更安全的指定密钥路径的方式,优于已弃用的apt-key add命令。
  • /etc/apt/sources.list.d/:将第三方仓库的文件放在这个目录下,是一个良好的实践,便于管理,不会污染主sources.list文件。

3.2 安装Elasticsearch

添加仓库后,更新本地软件包索引并安装Elasticsearch。

# 更新软件包列表,使其包含新添加的Elastic仓库 sudo apt update # 安装指定版本的Elasticsearch。这里安装8.12.0,你可以替换为当时最新的稳定版。 # 使用‘=’号指定版本可以避免意外升级到不兼容的新版本。 sudo apt install -y elasticsearch=8.12.0

安装过程会自动处理Java依赖。安装完成后,Elasticsearch服务文件(elasticsearch.service)会自动配置好,但服务默认是未启动的。

3.3 关键配置调整:从单节点测试到生产就绪

安装完成后,最重要的步骤是配置文件。Elasticsearch的主配置文件位于/etc/elasticsearch/elasticsearch.yml。我们需要修改几个关键参数。

使用你喜欢的文本编辑器打开它,例如sudo nano /etc/elasticsearch/elasticsearch.yml

找到并修改/添加以下配置项:

# ---------------------------- 集群与节点名称 ----------------------------- # 给集群起个名字。单节点也是集群。 cluster.name: my-elastic-cluster # 给当前节点起个名字。 node.name: node-1 # ------------------------------ 网络绑定 ---------------------------------- # 默认只绑定本地回环地址(127.0.0.1),这样只有本机可以访问。 # 如果你需要从其他机器访问(比如Kibana装在同一台机器,用localhost就行), # 或者未来扩展节点,需要绑定到服务器的实际IP或0.0.0.0。 # 对于单机学习环境,绑定到localhost是安全的。 network.host: 127.0.0.1 # HTTP API端口,默认9200。 http.port: 9200 # ------------------------------ 发现与集群初始化 -------------------------- # 对于单节点集群,必须显式配置,否则节点会一直等待其他节点加入。 discovery.type: single-node # ------------------------------ 安全特性(Elasticsearch 8.x 默认开启)---- # 8.x版本默认开启了安全功能(TLS和用户认证)。 # 对于本地学习环境,我们可以暂时禁用安全以简化连接。 # 注意:生产环境绝对不要禁用! xpack.security.enabled: false # 如果你选择开启安全,后续Kibana连接时需要配置用户名密码。 # 初始内置用户(如elastic)的密码可以通过 `/usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive` 命令设置。

配置心得:

  • network.host: 127.0.0.1是最安全的初始配置。只有当你的Kibana安装在其他服务器时,才需要将其改为本机内网IP(如192.168.1.100)或0.0.0.0(监听所有接口)。改为0.0.0.0后,务必配置防火墙,只允许可信IP访问9200端口。
  • discovery.type: single-node是单节点部署的必选项,没有它,节点日志里会不断提示master not discovered
  • 关于安全:我建议初学者先关闭 (xpack.security.enabled: false),快速搭建起来看到效果。等熟悉基本操作后,再在一个新环境中尝试开启安全特性,学习如何配置证书和用户。

3.4 启动服务与验证安装

配置完成后,启动Elasticsearch服务并设置开机自启。

# 重新加载systemd配置,使新的服务文件生效 sudo systemctl daemon-reload # 启用开机自启动 sudo systemctl enable elasticsearch # 启动Elasticsearch服务 sudo systemctl start elasticsearch # 查看服务运行状态,确认状态为‘active (running)’ sudo systemctl status elasticsearch

如果状态显示为active (running),恭喜你,Elasticsearch已经成功启动。接下来,我们验证它是否真的在工作。

打开另一个终端窗口,使用curl命令访问其HTTP API:

curl -X GET "http://localhost:9200/"

你应该会看到一个包含集群名称、节点名称、Elasticsearch版本等信息的JSON响应,类似于:

{ "name" : "node-1", "cluster_name" : "my-elastic-cluster", "cluster_uuid" : "abcdefghijklmnopqrstuv", "version" : { "number" : "8.12.0", "build_flavor" : "default", "build_type" : "deb", "build_hash" : "abc123def456", "build_date" : "2024-01-01T00:00:00.000Z", "build_snapshot" : false, "lucene_version" : "9.9.0", "minimum_wire_compatibility_version" : "7.17.0", "minimum_index_compatibility_version" : "7.0.0" }, "tagline" : "You Know, for Search" }

看到这个,说明Elasticsearch安装、配置、启动全部成功。

4. 安装与配置Kibana可视化界面

Elasticsearch本身没有图形界面,所有操作通过API进行。Kibana就是为我们提供这个可视化操作窗口的工具。

4.1 通过APT安装Kibana

由于我们已经添加了Elastic的APT仓库,安装Kibana就非常简单了。确保版本与Elasticsearch一致。

# 更新列表(可选,但建议) sudo apt update # 安装指定版本的Kibana sudo apt install -y kibana=8.12.0

4.2 配置Kibana连接Elasticsearch

Kibana的配置文件位于/etc/kibana/kibana.yml。我们需要告诉它Elasticsearch在哪里。

使用sudo nano /etc/kibana/kibana.yml打开文件,找到并修改以下关键参数:

# Kibana服务端口,默认5601 server.port: 5601 # Kibana服务绑定的地址。如果想从其他机器访问,改为‘0.0.0.0’ server.host: "127.0.0.1" # 要连接的Elasticsearch实例的URL。因为我们Elasticsearch也在本机,且没开安全,所以是http elasticsearch.hosts: ["http://localhost:9200"] # 如果Elasticsearch开启了安全认证(xpack.security.enabled: true),需要配置用户名密码 # elasticsearch.username: "kibana_system" # elasticsearch.password: "your-strong-password" # 对于8.x,如果Elasticsearch开启了安全,可能还需要配置CA证书路径 # elasticsearch.ssl.certificateAuthorities: [ "/path/to/your/http_ca.crt" ] # 可选:设置Kibana界面语言为中文 # i18n.locale: "zh-CN"

配置要点:

  • server.hostelasticsearch.hosts是核心。如果Elasticsearch和Kibana在同一台机器,都用localhost127.0.0.1是最简单的。
  • 如果Kibana和Elasticsearch不在同一主机,elasticsearch.hosts需要改为Elasticsearch服务器的实际IP地址,例如["http://192.168.1.100:9200"],并且要确保Elasticsearch的network.host配置允许该IP连接。
  • 语言切换i18n.locale: "zh-CN"可以让界面变成中文,对初学者友好,但某些翻译可能不够准确,熟悉后可以改回"en"

4.3 启动Kibana并访问

配置完成后,启动Kibana服务。

# 启用开机自启 sudo systemctl enable kibana # 启动服务 sudo systemctl start kibana # 查看状态 sudo systemctl status kibana

等待十几秒,让Kibana完全启动。然后,打开你的浏览器,访问http://你的服务器IP:5601。如果Kibana配置的server.host127.0.0.1,你需要在服务器本机使用浏览器访问http://localhost:5601

首次访问,如果Elasticsearch安全未开启,你会直接进入Kibana的主页。如果开启了安全,你会看到登录界面,需要使用内置用户(如elastic)和之前设置的密码登录。

进入Kibana后,我建议你先到Management > Dev Tools里面试试。这里有一个控制台,可以直接编写和发送REST API请求到Elasticsearch,是学习和调试的利器。例如,输入GET /并点击发送,你会看到和之前curl命令一样的集群信息。

5. 核心功能初探与数据导入示例

安装完成只是开始,让数据跑起来才是目的。这里我以一个最简单的例子——导入一些系统日志并可视化——来演示整个流程。

5.1 使用Dev Tools创建索引并插入数据

在Kibana的Dev Tools中,我们执行以下命令:

// 1. 创建一个名为‘my-logs’的索引,并定义简单的字段映射 PUT /my-logs { "mappings": { "properties": { "timestamp": { "type": "date" }, "level": { "type": "keyword" }, // keyword类型适合精确匹配和聚合 "message": { "type": "text" } // text类型会被分词,适合全文搜索 } } } // 2. 向索引中插入几条模拟的日志文档 POST /my-logs/_doc { "timestamp": "2024-05-27T10:00:00", "level": "ERROR", "message": "Failed to connect to database server" } POST /my-logs/_doc { "timestamp": "2024-05-27T10:01:00", "level": "WARN", "message": "High memory usage detected" } POST /my-logs/_doc { "timestamp": "2024-05-27T10:02:00", "level": "INFO", "message": "User login successful" } POST /my-logs/_doc { "timestamp": "2024-05-27T10:05:00", "level": "ERROR", "message": "Disk space is running low" }

执行后,Elasticsearch会创建索引并存储这四条数据。

5.2 使用Discover搜索数据

点击左侧导航栏的Discover。首次进入,需要创建一个数据视图(Data View)。点击“Create data view”。

  • Name: 输入my-logs-*(可以使用通配符匹配多个索引)。
  • Index pattern: 输入my-logs,下方会显示匹配到的索引。
  • Timestamp field: 选择timestamp,这样数据就可以按时间筛选。 点击“Save data view to Kibana”。

现在,你就能在Discover页面看到刚刚插入的4条日志了。你可以尝试在搜索框输入关键词,比如error,来过滤出错误级别的日志。

5.3 创建可视化图表与仪表盘

接下来,我们基于这些数据创建两个简单的图表。

  1. 创建饼图(按日志级别统计)

    • 点击左侧导航栏Visualize Library->Create visualization
    • 选择图表类型Pie
    • 选择数据视图my-logs-*
    • 在“Buckets”区域,点击“Add”,选择“Split slices”。
    • 聚合方式选择“Terms”,字段选择level.keyword
    • 点击右上角“Save and return”,给图表起名“Log Level Distribution”。
  2. 创建柱状图(按时间统计日志数量)

    • 再次Create visualization,选择Vertical Bar
    • 选择数据视图my-logs-*
    • 在“Buckets”区域,点击“Add”,选择“X-axis”。
    • 聚合方式选择“Date Histogram”,字段选择timestamp,间隔选择“Auto”。
    • 点击“Save and return”,起名“Logs Over Time”。
  3. 将图表加入仪表盘

    • 点击左侧导航栏Dashboard->Create dashboard
    • 点击“Add panel”,选择“Existing”。
    • 将刚才创建的“Log Level Distribution”和“Logs Over Time”两个图表都添加进来。
    • 调整图表位置和大小,最后点击“Save”,给仪表盘起名“My Logs Monitor”。

现在,你就拥有了一个可以实时展示日志级别分布和随时间变化趋势的简易监控看板。虽然数据是模拟的,但这个流程与处理真实的生产日志(如通过Filebeat采集Nginx、应用日志导入Elasticsearch)完全一致。

6. 系统调优与生产环境注意事项

单机测试跑通后,若想用于接近生产的环境,以下几个调优点至关重要。

6.1 JVM堆内存配置

Elasticsearch的性能极度依赖JVM堆内存。默认安装会设置堆大小为系统内存的50%,但上限为1GB。对于专用服务器,这通常需要调整。

配置文件位于/etc/elasticsearch/jvm.options。不要直接修改这个文件,因为包更新可能会覆盖它。正确做法是创建一个自定义配置文件:

sudo nano /etc/elasticsearch/jvm.options.d/heap.options

在这个新文件中,根据你的机器内存设置堆大小。一个常见的经验法则是:将堆大小设置为系统可用内存的50%,但不超过32GB。JVM超过32GB会使用不同的内存指针,反而降低效率。例如,对于一台16GB内存的机器:

-Xms8g -Xmx8g

这里-Xms-Xmx设置为相同的值,可以避免堆内存动态调整带来的性能开销。修改后需要重启Elasticsearch服务:sudo systemctl restart elasticsearch

6.2 操作系统参数优化

为了让Elasticsearch稳定处理大量数据,需要调整一些Linux系统限制。编辑/etc/security/limits.conf文件,在末尾添加:

elasticsearch soft nofile 65536 elasticsearch hard nofile 65536 elasticsearch soft memlock unlimited elasticsearch hard memlock unlimited
  • nofile 65536:增加Elasticsearch用户可打开的文件描述符数量,应对大量并发连接和文件。
  • memlock unlimited:允许Elasticsearch进程锁定内存,防止其被交换(swapped)到磁盘上,这对性能至关重要。

此外,还需要增加系统的虚拟内存映射区域数量:

# 临时生效 sudo sysctl -w vm.max_map_count=262144 # 永久生效,写入配置文件 echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf sudo sysctl -p

这些优化对于防止Elasticsearch在负载下出现“too many open files”错误或性能急剧下降是必须的。

6.3 数据与日志路径管理

默认情况下,数据存储在/var/lib/elasticsearch,日志存储在/var/log/elasticsearch。在生产环境中,你可能会希望将数据目录挂载到单独的、容量更大、性能更好的磁盘上(如SSD)。这可以通过修改/etc/elasticsearch/elasticsearch.yml中的path.datapath.logs配置项来实现。务必在首次写入数据之前进行此操作,迁移已有数据是一个更复杂的过程。

6.4 启用安全特性(强烈建议用于任何可外部访问的环境)

我们在测试时关闭了安全,但这绝不适用于生产。启用安全需要几个步骤:

  1. elasticsearch.yml中设置xpack.security.enabled: true
  2. 为节点间通信和HTTP层生成TLS证书。可以使用Elasticsearch自带的elasticsearch-certutil工具。
  3. 为内置用户(如elastic,kibana_system,logstash_system等)设置密码。
  4. 在Kibana配置中配置对应的用户名、密码和CA证书路径。

这个过程有详细的官方文档,第一次操作会有些繁琐,但这是将系统暴露在网络上前的必备步骤。

7. 常见问题与故障排查实录

即使按照步骤操作,你也可能会遇到一些问题。这里记录了几个我亲自踩过或帮别人解决过的典型问题。

7.1 Elasticsearch启动失败,状态为failed

首先,查看具体的错误信息:

sudo systemctl status elasticsearch -l sudo journalctl -u elasticsearch --no-pager -n 50

常见原因及解决:

  1. Java版本问题:Elasticsearch 8.x需要Java 17+。使用java -version检查。如果版本不对,安装正确的OpenJDK版本:sudo apt install openjdk-17-jdk-headless,然后重新启动服务。
  2. 配置文件语法错误:YAML对缩进非常敏感。检查/etc/elasticsearch/elasticsearch.yml是否有缩进错误(必须用空格,不能用Tab),或者冒号后面没加空格。一个快速的检查方法是使用sudo elasticsearch -d -p pid --quiet(测试运行)或使用YAML在线校验工具检查配置文件。
  3. 内存不足:如果系统内存太小,JVM可能无法分配足够的堆内存。尝试在/etc/elasticsearch/jvm.options.d/heap.options中设置更小的堆,如-Xms512m -Xmx512m
  4. 端口冲突:默认端口9200或9300被占用。使用sudo netstat -tlnp | grep :9200查看。可以修改elasticsearch.yml中的http.porttransport.port,或者停止占用端口的服务。

7.2 Kibana无法连接到Elasticsearch

在Kibana日志中(sudo journalctl -u kibana -f)常看到ConnectionErrorStatusCodeError

排查步骤:

  1. 确认Elasticsearch是否运行curl http://localhost:9200是否返回JSON。
  2. 检查网络配置
    • 确保elasticsearch.yml中的network.host包含Kibana所在机器能访问的IP(如果是本机,127.0.0.1即可)。
    • 确保kibana.yml中的elasticsearch.hosts地址和端口完全正确。
  3. 检查安全配置
    • 如果Elasticsearch开启了安全 (xpack.security.enabled: true),Kibana配置中必须提供正确的elasticsearch.usernameelasticsearch.password,通常是kibana_system用户及其密码。
    • 还需要配置elasticsearch.ssl.certificateAuthorities指向HTTP层的CA证书(默认在/etc/elasticsearch/certs/http_ca.crt)。
  4. 检查防火墙:如果Kibana和Elasticsearch不在同一主机,确保服务器防火墙(如ufw)允许在9200端口上的连接。

7.3 写入数据时报错cluster_block_exception

错误信息可能提示blocked by: [FORBILSTERED/1/index read-only / allow delete (api)]

原因与解决:这通常是因为Elasticsearch节点磁盘空间不足,触发了只读保护机制。检查磁盘空间:df -h /var/lib/elasticsearch

  • 临时解决:如果确认有空间(可能是水位线设置问题),可以临时解除只读状态:
    PUT /_all/_settings { "index.blocks.read_only_allow_delete": null }
  • 根本解决:清理磁盘空间,删除旧的、不用的索引,或者增加磁盘容量。同时,可以调整磁盘水位线(在elasticsearch.yml中配置cluster.routing.allocation.disk.watermark),但这不是长久之计。

7.4 性能问题:搜索或索引速度慢

如果感觉操作响应迟缓,可以从以下几个方面排查:

  1. 硬件资源:使用tophtop查看CPU和内存使用率。Elasticsearch是内存消耗大户,确保没有发生Swap(使用free -h查看,Swap使用应为0或极低)。
  2. JVM堆内存:如6.1节所述,确保堆内存设置合理。可以通过curl localhost:9200/_cat/nodes?v&h=name,heap*查看堆内存使用情况。
  3. 索引设计:过多的分片和副本会带来开销。对于小数据量,单个主分片(number_of_shards: 1)和1个副本(number_of_replicas: 1)通常足够。使用GET /_cat/indices?v查看索引的分片情况。
  4. 查询优化:避免使用过于宽泛的通配符查询或正则表达式查询。使用Kibana的Dev Tools的“Profile”功能可以分析查询的耗时细节。

安装和配置本身只是第一步,真正的挑战在于如何根据你的数据特性和查询模式,去设计索引映射、分片策略和编写高效的查询。这需要不断的实践和学习。我个人的体会是,多利用Kibana的Dev Tools做实验,多查看/_cat系列API(如/_cat/health,/_cat/indices,/_cat/allocation)来监控集群状态,是快速上手和排障的最佳途径。当你成功地将第一份真实的数据流导入Elasticsearch,并在Kibana中构建出能实时反映业务状态的仪表盘时,那种一切尽在掌握的感觉,会让你觉得前面的所有折腾都是值得的。

← 返回列表