19、使用 Elasticsearch、Logstash 和 Kibana 管理日志

使用 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 | 允许系统在挂载点对应的磁盘丢失时正常启动,在云环境中部署时特别有用。 |

  1. 验证磁盘是否正确挂载:
[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
  1. 配置 /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
  1. 验证 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
  1. 安装 Logstash 和 Kibana:
sudo yum install logstash kibana
  1. 初始化 /var/lib/logstash 磁盘:
sudo parted /dev/sdX mklabel gpt
  1. 创建 32 GB 的 XFS 分区:
sudo parted /dev/sdX mkpart xfs 0GB 32GB
  1. 创建文件系统:
sudo mkfs.xfs /dev/sdX1
  1. 更新 /etc/fstab 文件。
  2. 更新 /var/lib/logstash 目录的权限:
sudo chown logstash: /var/lib/logstash
  1. 添加 Logstash 的 systemd 单元:
sudo /usr/share/logstash/bin/system-install
  1. 安装协调 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
  1. 验证 Kibana 是否正确启动:
    在浏览器中访问 http://<Kibana服务器IP>:5601 ,如果能够看到 Kibana 的登录界面,则说明 Kibana 已成功启动。
9. 配置协调 Elasticsearch 节点

协调 Elasticsearch 节点作为 Elasticsearch 集群的负载均衡器,用于 Kibana 连接 Elasticsearch。以下是配置步骤:
1. 安装 Elasticsearch:

sudo yum install elasticsearch
  1. 编辑 /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
  1. 启动并启用 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,可以有效地收集、处理和分析日志数据,为系统的监控和故障排查提供有力支持。同时,在实际应用中,还可以根据具体需求对这些工具进行进一步的优化和扩展。

内容概要:本文档围绕六自由度机械臂的ANN人工神经网络设计展开,涵盖正向与逆向运动学求解、正向动力学控制,并采用拉格朗日-欧拉法推导逆向动力学方程,所有内容均通过Matlab代码实现。同时结合RRT路径规划与B样条优化技术,提升机械臂运动轨迹的合理性与平滑性。文中还涉及多种先进算法与仿真技术的应用,如状态估计中的UKF、AUKF、EKF等滤波方法,以及PINN、INN、CNN-LSTM等神经网络模型在工程问题中的建模与求解,展示了Matlab在机器人控制、智能算法与系统仿真中的强大能力。; 适合人群:具备一定Ma六自由度机械臂ANN人工神经网络设计:正向逆向运动学求解、正向动力学控制、拉格朗日-欧拉法推导逆向动力学方程(Matlab代码实现)tlab编程基础,从事机器人控制、自动化、智能制造、人工智能等相关领域的科研人员及研究生;熟悉运动学、动力学建模或对神经网络在控制系统中应用感兴趣的工程技术人员。; 使用场景及目标:①实现六自由度机械臂的精确运动学与动力学建模;②利用人工神经网络解决传统解析方法难以处理的非线性控制问题;③结合路径规划与轨迹优化提升机械臂作业效率;④掌握基于Matlab的状态估计、数据融合与智能算法仿真方法; 阅读建议:建议结合提供的Matlab代码进行实践操作,重点理解运动学建模与神经网络控制的设计流程,关注算法实现细节与仿真结果分析,同时参考文中提及的多种优化与估计方法拓展研究思路。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值