NWNU-Sun | 技术沉思录

代码是诗,bug是谜

   ::  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  74 随笔 :: 49 文章 :: 6 评论 :: 40513 阅读

image-20231130154418783

0、前景

采用 ELK 搭建一套分布式日志系统

架构图

图片

1、ElastsiSearch

官网地址

Elasticsearch 8.12.0 | Elastic

1.1、安装

下载安装包

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.12.0-linux-x86_64.tar.gz
tar -zxvf elasticsearch-8.12.0-linux-x86_64.tar.gz -C /usr/local/src

修改核心配置elasticearch.yml

cluster.name: my-application
node.name: node-1
path.data: ./data
path.logs: ./logs
networtk.host: 0.0.0.0
http.port: 9200
cluster.initial_master_nodes: ["node-1"]

修改JVM参数

- Xms128m
- Xmx128m

默认xms和xmx都是1g,虚拟机内存没这么大,修改一下即可,线上环境内存大可以不修改!

添加用户

ES不允许root用户运行

useradd esuser
chown -R esuser:esuser /usr/lcoal/elasticsearch-8.12.0-linux-x86_64

修改服务器配置

vim /etc/security/limits.conf

* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
vim /etc/sysctl.conf
vm.max_map_count=262145

刷新

sysctl -p

启动ES

nohup ./elasticsearch >es.log 2>&1 &

最新版本的ES启动会默认开启安全配置,url为:https://localhost:9200才能打开,且需要输入用户名和密码

测试阶段可以暂时关闭,修改elasticsearch.yml后重启

# Enable security features
xpack.security.enabled: false

查看进程

[root@xxx2 ~]# jps
53462 org.elasticsearch.bootstrap.Elasticsearch
115935 Jps
53375 CliToolLauncher
[root@xxx2 ~]#

2、Kibana

2.1、安装

官网地址

Kibana 8.12.0 | Elastic

下载8.12.0版本

wget https://artifacts.elastic.co/downloads/kibana/kibana-8.12.0-linux-x86_64.tar.gz
tar -zxvf kibana-8.12.0-linux-x86_64.tar.gz -C /usr/local

修改核心配置

kibana.yml

#配置本机ip
server.host: "localhost"
#配置es集群url
elasticsearch.url: "http://localhost:9200"
server.host: "0.0.0.0"

启动

./kibana & # 如果在root下启动,需要添加--allow-root 

3、LogStash

Logstash 是一个数据管道,能够从各种数据源(比如 MySQL 数据库)收集数据,将数据从一处传输到另一处,并加以解析和转换

image-20240127232923955

3.1、安装

官网地址

Logstash:收集、解析和转换日志 | Elastic

此处我们下载最新版本8.12.0

wget https://artifacts.elastic.co/downloads/logstash/logstash-8.12.0-linux-x86_64.tar.gz
tar -zxvf logstash-8.12.0-linux-x86_64.tar.gz -C /usr/local/src

直接运行不行,必须要输入、输出参数,此处设置输入源和输出源为控制台

./logstash -e "input {stdin {}} output {stdout{}}"

结果如下

[2024-01-25T15:21:19,766][INFO ][logstash.javapipeline    ][main] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>1, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50, "pipeline.max_inflight"=>125, "pipeline.sources"=>["config string"], :thread=>"#<Thread:0x589b120c /usr/local/src/logstash-8.12.0/logstash-core/lib/logstash/java_pipeline.rb:134 run>"}
[2024-01-25T15:21:20,406][INFO ][logstash.javapipeline    ][main] Pipeline Java execution initialization time {"seconds"=>0.64}
The stdin plugin is now waiting for input:
[2024-01-25T15:21:20,459][INFO ][logstash.javapipeline    ][main] Pipeline started {"pipeline.id"=>"main"}
[2024-01-25T15:21:20,465][INFO ][logstash.agent           ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
你好啊,Logstash
{
          "host" => {
        "hostname" => "xxx2"
    },
    "@timestamp" => 2024-01-25T07:21:33.750286507Z,
      "@version" => "1",
         "event" => {
        "original" => "你好啊,Logstash"
    },
       "message" => "你好啊,Logstash"
}

实际使用还是需要修改配置文件,配置路径为config,默认存在示例文件logstash-sample.conf

cp logstash-sample.conf console-es.conf
input {
  stdin {

  }
}

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "console_es_index"
    #user => "elastic"
    #password => "changeme"
  }
}

启动

bin/logstash -f config/console_es.conf

image-20240125151143419

可以看到控制台日志写入了ES

Kibana 开发工具输入 GET _cat/indices, 可以 看到 console_es 这个索引已经创建出来了

image-20240125161012504

查看索引的数据

image-20240125161112528

配置开机自启

cat > /usr/lib/systemd/system/logstash.service <<EOF
[Unit]
Description=logstash

[Service]
User=root
ExecStart=/usr/local/src/logstash-8.12.0/bin/logstash -f  /usr/local/src/logstash-8.12.0/config/filebeat_es.conf 
Restart=always

[Install]
WantedBy=multi-user.target
EOF

logstash日志记录在:logs/

4、Filebeat

特点

采用Golang编写

一款轻量级的日志采集工具,占用资源少,对机器配置要求低

Logstash忙碌时自动减慢读取传输速度

自带内部模块(auditd、Apache、Nginx、System),通过指定命令简化通用日志格式手机、解析和可视化

官网地址

Filebeat 8.12.0 | Elastic

下载解压

wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.12.0-linux-x86_64.tar.gz
tar  -zxvf  filebeat-8.12.0-linux-x86_64.tar.gz -C /usr/local/src

配置核心文件 filebeat.yml

# ------------------------------ Logstash Output -------------------------------
output.logstash:
  # The Logstash hosts
  hosts: ["localhost:5044"]

# ============================== Filebeat inputs ===============================

filebeat.inputs:
- type: log
  id: my-filestream-id
  enabled: true
  paths:
    - /var/log/*.log

启动

bin/filebeat -e -c filebeat.yml 

filebeat没有采集到数据莫名会掉,这里配置开机自启

cat > /usr/lib/systemd/system/filebeat.service <<EOF
[Unit]
Description=Filebeat is a lightweight shipper for metrics.
Documentation=https://www.elastic.co/products/beats/filebeat
Wants=network-online.target
After=network-online.target

[Service]
Environment="LOG_OPTS=-e"
Environment="CONFIG_OPTS=-c /usr/local/src/filebeat-8.12.0-linux-x86_64/filebeat.yml"
Environment="PATH_OPTS=-path.home /usr/local/src/filebeat-8.12.0-linux-x86_64 -path.config /usr/local/src/filebeat-8.12.0-linux-x86_64  -path.data /usr/local/src/filebeat-8.12.0-linux-x86_64/data -path.logs /usr/local/src/filebeat-8.12.0-linux-x86_64/logs"
ExecStart=/usr/local/src/filebeat-8.12.0-linux-x86_64/filebeat  $LOG_OPTS $CONFIG_OPTS $PATH_OPTS
Restart=always

[Install]
WantedBy=multi-user.target
EOF


systemctl daemon-reload
systemctl restart filebeat 
systemctl enable filebeat 

输入模块

  1. Log输入模块:
    • Log输入模块用于读取和收集已经存在的日志文件,例如应用程序生成的日志文件。
    • 它监视指定的日志文件,并定期检查文件的更新,然后将新增的日志行发送到目标位置(如Elasticsearch、Logstash等)。
    • Log输入模块适用于传统的日志文件收集场景,如应用程序日志、系统日志等。
  2. Filestream输入模块:
    • Filestream输入模块用于实时收集正在写入的日志文件,而不是已经存在的日志文件。
    • 它通过监控指定的目录,并跟踪正在写入的文件,将文件内容流式传输到目标位置。
    • Filestream输入模块适用于实时日志收集场景,如容器化应用程序、微服务架构等。

5、Kafka

测试,搭建单机版

5.1、部署zookeeper
wget https://dlcdn.apache.org/zookeeper/zookeeper-3.9.1/apache-zookeeper-3.9.1-bin.tar.gz
tar -zxvf apache-zookeeper-3.9.1-bin.tar.gz -C /usr/local

修改配置并启动

vi zoo.cfg

tickTime=2000
initLimit=10
syncLimit=5
clientPort=2181

启动

bin/zkSercer.sh start
5.2、部署kafka
wget https://downloads.apache.org/kafka/3.6.1/kafka_2.12-3.6.1.tgz
tar -zxvf kafka_2.12-3.6.1.tgz -C /usr/local

修改配置文件

vi server.properties(单机部署,启动不用做修改)

broker.id=0
port=9092 #端口号
log.dirs=/usr/local/kafka/log/kafka #日志存放路径,上面创建的目录
zookeeper.connect=localhost:2181 #zookeeper地址和端口,单机配置部署,localhost:2181

启动Kafka之前启动ZK

kafka-server-start.sh

测试,创建Topic

bin/kafka-topics.sh --create --topic quickstart-events --bootstrap-server localhost:9092

生产消息测试,向topic中写入数据

bin/kafka-console-producer.sh --topic quickstart-events --bootstrap-server localhost:9092

打开另一个终端会话并运行控制台消费者客户端来阅读您刚刚创建的事件:

bin/kafka-console-consumer.sh --topic quickstart-events --from-beginning --bootstrap-server localhost:9092

6、完善日志框架

6.1 、架构图

Logstash 要同时接受多个 Filebeat 采集的日志,机器越多,部署的 Filebeat 也就越多,Logstash 的压力就会越大。虽然也可以像扩容 ES 一样增加 Logstash 的节点数,但是并不能从根本上解决问题,当日志量级增大到一定程度时,不仅是 Logstash,连 ES 集群都有可能撑不住!

因此,我们需要接入一些中间件来进行缓冲,首选的可靠且高性能的消息队列 Kafka(依赖分布式协调工具 Zookeeper)

图片

6.2、测试

修改filebeat配置 filebeat.yml

output.kafka:
  # initial brokers for reading cluster metadata
  hosts: ["localhost:9092"]

  # message topic selection + partitioning
  topic: topic_test 
  partition.round_robin:
    reachable_only: false

  required_acks: 1
  compression: gzip
  max_message_bytes: 1000000

修改logstash配置 kafka_es.conf

input{
    kafka {
        enable_auto_commit => true
        auto_commit_interval_ms => "500"
        codec => "json"
        bootstrap_servers => "localhost:9092"
        group_id => "group-01"
        auto_offset_reset => "latest"
        topics => "topic_test"
        consumer_threads => 3
   }

}

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "kafka_es_index"
    #user => "elastic"
    #password => "changeme"
  }
  stdout { codec => rubydebug }
}

重启logstash 、filebeat后,打开kibana观察

重新创建了kafka_es_index索引

手动往/var/log/sun.log写入测试数据

ehco "zhangsan" >>/var/log/sun.log

按照流程,该数据会从 filebeat---->kafka--->logstash--->es-->kibana

观察

image-20240126111605818

参考

https://blog.csdn.net/qq_40977118/article/details/123488301

https://mp.weixin.qq.com/s?__biz=MzI1NDczNTAwMA==&mid=2247485369&idx=1&sn=d125e78d175e38684e92cceee7e09b16&scene=21#wechat_redirect

posted on   匿名者nwnu  阅读(549)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示