使用 Elasticsearch、Logstash 和 Kibana 管理日志
在日志管理领域,Elasticsearch、Logstash 和 Kibana 组成的 ELK 栈是一套强大的工具组合。下面将详细介绍如何使用它们进行日志管理,包括文件系统配置、Elasticsearch 配置、节点添加、Logstash 和 Kibana 的安装与配置等内容。
1. 文件系统配置
默认情况下,XFS 使用 4K 块大小,这与内存页大小匹配,对于相对较小的文件来说是理想的。需要注意的是,应指定设备文件的分区,而不是整个磁盘。如果文件系统要用于 RAID 配置,更改条带单元和条带大小通常有助于提高性能。
为了确保文件系统在每次重启后能正确挂载,我们可以使用磁盘的 UUID。获取磁盘 UUID 的操作步骤如下:
1. 运行
blkid
命令获取磁盘 UUID:
[root@elastic1 ~]# blkid
/dev/sda1: UUID="58c91edb-c361-470e-9805-a31efd85a472" TYPE="xfs"
/dev/sda2: UUID="H3KcJ3-gZOS-URMD-CD1J-8wIn-f7v9-mwkTWn" TYPE="LVM2_member"
/dev/sdb1: UUID="561fc663-0b63-4d2a-821e-12b6caf1115e" TYPE="xfs"
PARTLABEL="xfs" PARTUUID="7924e72d-15bd-447d-9104-388dd0ea4eb0"
这里
/dev/sdb1
是用于 Elasticsearch 的 64 GB 磁盘。
2. 将 UUID 添加到
/etc/fstab
文件中:
UUID=561fc663-0b63-4d2a-821e-12b6caf1115e /var/lib/elasticsearch xfs
defaults,nobarrier,noatime,nofail 0 0
参数解释如下:
| 参数 | 解释 |
| ---- | ---- |
|
nobarrier
| 禁用 XFS 在写入持久存储时的确认机制,有助于提高写入性能,通常用于没有电池备份写缓存的物理存储系统。 |
|
noatime
| 禁用文件访问或修改时的记录机制,避免不必要的写入,有助于提高读取性能。 |
|
nofail
| 允许系统在挂载点对应的磁盘丢失时正常启动,在云环境中部署时特别有用。 |
- 验证磁盘是否正确挂载:
[root@elastic1 /]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 14G 1.6G 12G 12% /
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 8.5M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/sdb1 60G 33M 60G 1% /var/lib/elasticsearch
/dev/sda1 1014M 184M 831M 19% /boot
tmpfs 379M 0 379M 0% /run/user/0
-
配置
/var/lib/elasticsearch目录的所有权:
chown elasticsearch: /var/lib/elasticsearch
2. 配置 Elasticsearch
在启动 Elasticsearch 服务之前,需要修改
/etc/elasticsearch/elasticsearch.yml
文件中的一些参数。主要参数如下:
-
集群名称(Cluster name)
:Elasticsearch 节点只有在配置中指定相同的集群名称时才能加入集群。设置如下:
# --------------------------------Cluster------------------------------
#
# Use a descriptive name for your cluster:
#
cluster.name: elastic-cluster
#
该设置需要在两个节点上都进行配置,确保值相同。
-
发现设置(Discovery settings)
:发现参数控制 Elasticsearch 如何管理用于集群和主节点选举的节点间通信。主要参数有
discovery.zen.ping.unicast.hosts和discovery.zen.minimum_master_nodes。
# -----------------------------Discovery-------------------------------
#
# Pass an initial list of hosts to perform discovery when new node is
started:
# The default list of hosts is ["127.0.0.1", "[::1]"]
#
discovery.zen.ping.unicast.hosts: ["elastic2"]
#
# Prevent the "split brain" by configuring the majority of nodes (total
number of master-eligible nodes / 2 + 1):
#
discovery.zen.minimum_master_nodes: 2
#
# For more information, consult the zen discovery module documentation.
对于节点 2,需要将
discovery.zen.ping.unicast.hosts
的值改为
["elastic1"]
。
- 节点名称(Node name) :默认情况下,Elasticsearch 使用随机生成的 UUID 作为节点名称,为了方便管理,我们可以自定义节点名称。
#------------------------------Node---------------------------------
#
# Use a descriptive name for the node:
#
node.name: elastic1
节点 2 的名称应设置为
elastic2
。
- 网络主机(Network host) :该参数控制 Elasticsearch 绑定的 IP 地址和监听的请求。默认情况下,它绑定到回环 IP 地址,需要将其修改为允许集群中的其他节点或其他服务器上的 Kibana 和 Logstash 发送请求。
#-----------------------------Network-------------------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#
network.host: 0.0.0.0
- 路径设置(Path settings) :控制 Elasticsearch 存储数据和日志的位置。
#-------------------------------Paths---------------------------------
#
# Path to directory where to store the data (separate multiple locations by
comma):
#
path.data: /var/lib/elasticsearch
#
# Path to log files:
#
path.logs: /var/log/elasticsearch
path.data
可以指定多个路径,Elasticsearch 会使用这些路径来存储数据,从而提高整体性能和可用空间。
3. 启动 Elasticsearch
完成 Elasticsearch 配置后,需要确保服务在启动时自动正确启动。操作步骤如下:
1. 启动并启用 Elasticsearch 服务:
systemctl start elasticsearch && systemctl enable elasticsearch
- 验证 Elasticsearch 是否正确启动:
curl -X GET "elastic1:9200"
输出示例如下:
{
"name" : "elastic1",
"cluster_name" : "elastic-cluster",
"cluster_uuid" : "pIH5Z0yAQoeEGXcDuyEKQA",
"version" : {
"number" : "6.5.3",
"build_flavor" : "default",
"build_type" : "rpm",
"build_hash" : "159a78a",
"build_date" : "2018-12-06T20:11:28.826501Z",
"build_snapshot" : false,
"lucene_version" : "7.5.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
4. 添加 Elasticsearch 节点
可以将第二个节点添加到 Elasticsearch 集群中。操作步骤如下:
1. 应用之前的配置步骤,确保设置反映节点 2 的 DNS 名称。
2. 启动 Elasticsearch 服务:
systemctl start elasticsearch
服务启动后,日志会记录到
/var/log/elasticsearch
中,表明节点已成功添加到集群。
3. 确认集群是否正常运行:
curl -X GET "elastic1:9200/_cluster/state?human&pretty"
输出示例如下:
{
"cluster_name" : "elastic-cluster",
"compressed_size" : "10kb",
"compressed_size_in_bytes" : 10271,
"cluster_uuid" : "pIH5Z0yAQoeEGXcDuyEKQA",
"version" : 24,
"state_uuid" : "k6WuQsnKTECeRHFpHDPKVQ",
"master_node" : "XVaIWexSQROVVxYuSYIVXA",
"blocks" : { },
"nodes" : {
"XVaIWexSQROVVxYuSYIVXA" : {
"name" : "elastic1",
"ephemeral_id" : "fgpqeUmBRVuXzvlf0TM8sA",
"transport_address" : "192.168.1.150:9300",
"attributes" : {
"ml.machine_memory" : "3973599232",
"xpack.installed" : "true",
"ml.max_open_jobs" : "20",
"ml.enabled" : "true"
}
},
"ncVAbF9kTnOB5K9pUhsvZQ" : {
"name" : "elastic2",
"ephemeral_id" : "GyAq8EkiQGqG9Ph-0RbSkg",
"transport_address" : "192.168.1.151:9300",
"attributes" : {
"ml.machine_memory" : "3973599232",
"ml.max_open_jobs" : "20",
"xpack.installed" : "true",
"ml.enabled" : "true"
}
}
},
"metadata" : {
...(truncated)
5. 安装 Logstash 和 Kibana
在 Elasticsearch 集群正常运行后,可以安装 Logstash 和 Kibana。操作步骤如下:
1. 添加存储库到
/etc/yum.repos.d/elastic.repo
。
2. 更新 yum 缓存:
sudo yum makecache
- 安装 Logstash 和 Kibana:
sudo yum install logstash kibana
-
初始化
/var/lib/logstash磁盘:
sudo parted /dev/sdX mklabel gpt
- 创建 32 GB 的 XFS 分区:
sudo parted /dev/sdX mkpart xfs 0GB 32GB
- 创建文件系统:
sudo mkfs.xfs /dev/sdX1
-
更新
/etc/fstab文件。 -
更新
/var/lib/logstash目录的权限:
sudo chown logstash: /var/lib/logstash
- 添加 Logstash 的 systemd 单元:
sudo /usr/share/logstash/bin/system-install
- 安装协调 Elasticsearch 节点:
sudo yum install elasticsearch
6. 配置 Logstash
Logstash 的主要配置文件位于
/etc/logstash/logstash.yml
,需要修改一些设置以实现所需的功能。
-
节点名称(node.name) :调整该参数以正确标识 Logstash 节点,避免与 Kibana 混淆。
-
队列设置(Queuing settings) :
-
queue.type:定义 Logstash 使用的队列类型,这里使用持久队列:
# ------------ Queuing Settings --------------
#
# Internal queuing model, "memory" for legacy in-memory based queuing and
# "persisted" for disk-based acked queueing. Defaults is memory
#
queue.type: persisted
#
-
path.queue:如果使用持久队列,事件需要在发送到 Elasticsearch 之前存储在临时位置,该参数控制存储位置。默认情况下,Logstash 使用path.data/queue目录,path.data默认为/var/lib/logstash。 -
queue.max_bytes:控制队列允许的最大空间,由于我们添加了一个 32 GB 的专用磁盘,可将其设置为 25 GB 以留出缓冲空间。
# If using queue.type: persisted, the total capacity of the queue in number
of bytes.
# If you would like more unacked events to be buffered in Logstash, you can
increase the
# capacity using this setting. Please make sure your disk drive has
capacity greater than
# the size specified here. If both max_bytes and max_events are specified,
Logstash will pick
# whichever criteria is reached first
# Default is 1024mb or 1gb
#
queue.max_bytes: 25gb
可选地,可以将
xpack.monitoring.enabled
设置为
true
以启用通过 Kibana 进行监控。
7. Logstash 管道
Logstash 输出由
/etc/logstash/conf.d/
目录下的管道配置文件控制。下面是一个用于过滤 syslog 消息并将其发送到 Elasticsearch 集群的配置文件示例:
sudo vim /etc/logstash/conf.d/beats-syslog.conf
文件内容如下:
input {
beats {
port => 5044
}
}
filter {
if [fileset][module] == "system" {
if [fileset][name] == "auth" {
grok {
match => { "message" =>
["%{SYSLOGTIMESTAMP:[system][auth][timestamp]}
%{SYSLOGHOST:[system][auth][hostname]}
sshd(?:\[%{POSINT:[system][auth][pid]}\])?:
%{DATA:[system][auth][ssh][event]} %{DATA:[system][auth][ssh][method]} for
(invalid user )?%{DATA:[system][auth][user]} from
%{IPORHOST:[system][auth][ssh][ip]} port
%{NUMBER:[system][auth][ssh][port]} ssh2(:
%{GREEDYDATA:[system][auth][ssh][signature]})?",
"%{SYSLOGTIMESTAMP:[system][auth][timestamp]}
%{SYSLOGHOST:[system][auth][hostname]}
sshd(?:\[%{POSINT:[system][auth][pid]}\])?:
%{DATA:[system][auth][ssh][event]} user %{DATA:[system][auth][user]} from
%{IPORHOST:[system][auth][ssh][ip]}",
"%{SYSLOGTIMESTAMP:[system][auth][timestamp]}
%{SYSLOGHOST:[system][auth][hostname]}
sshd(?:\[%{POSINT:[system][auth][pid]}\])?: Did not receive identification
string from %{IPORHOST:[system][auth][ssh][dropped_ip]}",
"%{SYSLOGTIMESTAMP:[system][auth][timestamp]}
%{SYSLOGHOST:[system][auth][hostname]}
sudo(?:\[%{POSINT:[system][auth][pid]}\])?: \s*%{DATA:[system][auth][user]}
:( %{DATA:[system][auth][sudo][error]} ;)?
TTY=%{DATA:[system][auth][sudo][tty]} ;
PWD=%{DATA:[system][auth][sudo][pwd]} ;
USER=%{DATA:[system][auth][sudo][user]} ;
COMMAND=%{GREEDYDATA:[system][auth][sudo][command]}",
"%{SYSLOGTIMESTAMP:[system][auth][timestamp]}
%{SYSLOGHOST:[system][auth][hostname]}
groupadd(?:\[%{POSINT:[system][auth][pid]}\])?: new group:
name=%{DATA:system.auth.groupadd.name},
GID=%{NUMBER:system.auth.groupadd.gid}",
"%{SYSLOGTIMESTAMP:[system][auth][timestamp]}
%{SYSLOGHOST:[system][auth][hostname]}
useradd(?:\[%{POSINT:[system][auth][pid]}\])?: new user:
name=%{DATA:[system][auth][user][add][name]},
UID=%{NUMBER:[system][auth][user][add][uid]},
GID=%{NUMBER:[system][auth][user][add][gid]},
home=%{DATA:[system][auth][user][add][home]},
shell=%{DATA:[system][auth][user][add][shell]}$",
"%{SYSLOGTIMESTAMP:[system][auth][timestamp]}
%{SYSLOGHOST:[system][auth][hostname]}
%{DATA:[system][auth][program]}(?:\[%{POSINT:[system][auth][pid]}\])?:
%{GREEDYMULTILINE:[system][auth][message]}"] }
pattern_definitions => {
"GREEDYMULTILINE"=> "(.|\n)*"
}
remove_field => "message"
}
date {
match => [ "[system][auth][timestamp]", "MMM d HH:mm:ss", "MMM dd
HH:mm:ss" ]
}
geoip {
source => "[system][auth][ssh][ip]"
target => "[system][auth][ssh][geoip]"
}
}
else if [fileset][name] == "syslog" {
grok {
match => { "message" =>
["%{SYSLOGTIMESTAMP:[system][syslog][timestamp]}
%{SYSLOGHOST:[system][syslog][hostname]}
%{DATA:[system][syslog][program]}(?:\[%{POSINT:[system][syslog][pid]}\])?:
%{GREEDYMULTILINE:[system][syslog][message]}"] }
pattern_definitions => { "GREEDYMULTILINE" => "(.|\n)*" }
remove_field => "message"
}
date {
match => [ "[system][syslog][timestamp]", "MMM d HH:mm:ss", "MMM
dd HH:mm:ss" ]
}
}
}
}
output {
elasticsearch {
hosts => ["elastic1", "elastic2"]
manage_template => false
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
}
}
确保输出部分包含 Elasticsearch 节点的 DNS 名称或 IP 地址。在这个管道配置中,beats 模块将日志发送到 Logstash 节点,然后 Logstash 处理数据并在 Elasticsearch 节点之间进行负载均衡。接下来可以继续配置 Kibana。
通过以上步骤,我们可以完成 Elasticsearch、Logstash 和 Kibana 的安装、配置和使用,实现高效的日志管理。
下面是一个简单的 mermaid 流程图,展示了整个配置过程:
graph LR
A[文件系统配置] --> B[配置 Elasticsearch]
B --> C[启动 Elasticsearch]
C --> D[添加 Elasticsearch 节点]
D --> E[安装 Logstash 和 Kibana]
E --> F[配置 Logstash]
F --> G[配置 Logstash 管道]
以上就是使用 Elasticsearch、Logstash 和 Kibana 管理日志的详细过程。通过合理配置这些工具,可以有效地收集、处理和分析日志数据。
使用 Elasticsearch、Logstash 和 Kibana 管理日志
7. 配置 Kibana
Kibana 是一个用于可视化 Elasticsearch 数据的工具,其主要配置文件位于
/etc/kibana/kibana.yml
。以下是需要修改的主要参数:
-
服务器主机(server.host)
:该参数控制 Kibana 监听的 IP 地址。默认情况下,它绑定到回环 IP 地址,需要将其修改为允许其他服务器访问。
#-----------------------------Server-------------------------------
#
# Set the address to which the server will bind.
#
server.host: "0.0.0.0"
- Elasticsearch 主机(elasticsearch.hosts) :指定 Kibana 连接的 Elasticsearch 节点的地址。
#-----------------------------Elasticsearch-------------------------------
#
# Array of Elasticsearch hosts to connect to.
#
elasticsearch.hosts: ["http://elastic1:9200", "http://elastic2:9200"]
- Kibana 索引(kibana.index) :指定 Kibana 用于存储配置和元数据的索引名称。
#-----------------------------Kibana-------------------------------
#
# The default index to use for storing Kibana configuration.
#
kibana.index: ".kibana"
8. 启动 Kibana
完成 Kibana 配置后,需要确保服务在启动时自动正确启动。操作步骤如下:
1. 启动并启用 Kibana 服务:
systemctl start kibana && systemctl enable kibana
-
验证 Kibana 是否正确启动:
在浏览器中访问http://<Kibana服务器IP>:5601,如果能够看到 Kibana 的登录界面,则说明 Kibana 已成功启动。
9. 配置协调 Elasticsearch 节点
协调 Elasticsearch 节点作为 Elasticsearch 集群的负载均衡器,用于 Kibana 连接 Elasticsearch。以下是配置步骤:
1. 安装 Elasticsearch:
sudo yum install elasticsearch
-
编辑
/etc/elasticsearch/elasticsearch.yml文件,将该节点配置为协调节点:
#-----------------------------Node-------------------------------
#
# Node roles
#
node.master: false
node.data: false
node.ingest: false
node.coordinating_only: true
#
# Cluster name
#
cluster.name: elastic-cluster
#
# Network host
#
network.host: 0.0.0.0
- 启动并启用 Elasticsearch 服务:
systemctl start elasticsearch && systemctl enable elasticsearch
10. 验证 ELK 栈的功能
完成上述所有配置后,需要验证 ELK 栈是否正常工作。以下是验证步骤:
1. 确保 Elasticsearch 集群正常运行:
curl -X GET "elastic1:9200/_cluster/health?pretty"
输出示例如下:
{
"cluster_name" : "elastic-cluster",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 2,
"number_of_data_nodes" : 2,
"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,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
如果
status
为
green
,则表示 Elasticsearch 集群正常运行。
2. 确保 Logstash 正常工作:
查看
/var/log/logstash/logstash-plain.log
文件,确保没有错误信息。
3. 确保 Kibana 正常工作:
在浏览器中访问
http://<Kibana服务器IP>:5601
,登录 Kibana 界面。创建一个索引模式,选择之前配置的 Logstash 输出的索引名称,例如
%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}
。如果能够成功创建索引模式,则说明 Kibana 正常工作。
11. 常见问题及解决方法
在使用 ELK 栈的过程中,可能会遇到一些常见问题。以下是一些常见问题及解决方法:
| 问题 | 解决方法 |
| ---- | ---- |
| Elasticsearch 无法启动 | 查看
/var/log/elasticsearch/elasticsearch.log
文件,检查错误信息。可能的原因包括内存不足、配置错误等。 |
| Logstash 无法连接到 Elasticsearch | 检查
logstash.yml
文件中的
elasticsearch.hosts
参数是否正确,确保 Elasticsearch 节点正常运行。 |
| Kibana 无法访问 | 检查 Kibana 服务是否正常启动,查看
/var/log/kibana/kibana.log
文件,检查错误信息。 |
12. 总结
通过以上步骤,我们完成了 Elasticsearch、Logstash 和 Kibana 的安装、配置和使用,实现了高效的日志管理。整个过程可以总结为以下几个关键步骤:
1. 配置文件系统,确保 Elasticsearch 数据存储在正确的位置。
2. 配置 Elasticsearch 集群,包括集群名称、发现设置、节点名称等。
3. 启动 Elasticsearch 服务,并验证其正常运行。
4. 添加 Elasticsearch 节点,扩展集群规模。
5. 安装 Logstash 和 Kibana,并进行相应的配置。
6. 配置 Logstash 管道,实现日志的收集和处理。
7. 配置 Kibana,实现日志数据的可视化。
8. 验证 ELK 栈的功能,确保整个系统正常工作。
下面是一个 mermaid 流程图,展示了整个 ELK 栈的工作流程:
graph LR
A[日志源] --> B[Beats]
B --> C[Logstash]
C --> D[Elasticsearch]
D --> E[Kibana]
E --> F[用户可视化界面]
通过合理配置 Elasticsearch、Logstash 和 Kibana,可以有效地收集、处理和分析日志数据,为系统的监控和故障排查提供有力支持。同时,在实际应用中,还可以根据具体需求对这些工具进行进一步的优化和扩展。
超级会员免费看
9431

被折叠的 条评论
为什么被折叠?



