ELK stack基础架构
1.软件包安装及配置
rpm安装
使用 RPM 安装 Elasticsearch |Elasticsearch 指南 [8.17] |弹性的https://www.elastic.co/guide/en/elasticsearch/reference/8.17/rpm.html#rpm-repo
官方的安装包
从github进去
Elastic Stack 软件的往往版本 | 弹性的
一般我们选的是含jdk的elastic的包,如果选的是未含jdk的安装包,就要自己安装jdk。elastic软件包对jdk环境有要求(好像是7.0版本之前的elastic都是没有自带jdk的)
支持一览表 | Elastic
清华大学镜像源安装
elasticstack | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
安装
我是rpm安装
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.17.2-x86_64.rpm
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.17.2-x86_64.rpm.sha512
shasum -a 512 -c elasticsearch-8.17.2-x86_64.rpm.sha512
sudo rpm --install elasticsearch-8.17.2-x86_64.rpm
给ELK每个节点配500G的磁盘,然后对加入的磁盘格式化 mkfs.xfs (ELK选择xfs文件系统适合)
mkdir -p /data/elasticsearch/{elasdata,elaslog}
#chown -R elasticsearch.elasticesearch /data/
lsblk #查看加入的磁盘
pvcreate /dev/sdb
vgcreate vg1 /dev/sdb
lvcreate -L 499G -n lv1 vg1
mkfs.xfs /dev/vg1/lv1
mount /dev/vg1/lv1 /data
#开机自动挂载
blkid /dev/sdb #获取磁盘ID
vim /etc/fstab #磁盘挂载开机生效
UUID=67b517c0-703d-488d-8de2-2347e4a0c0d7 /data xfs defaults 0 0
echo "* soft nofile 65536">>/etc/security/limits.conf
echo "* hard nofile 65536">>/etc/security/limits.conf
#临时禁用虚拟内存
sudo nano /etc/security/limits.conf
# 添加以下内容
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
elasticsearch soft nproc 4096
elasticsearch hard nproc 4096
ulimit -a
无论什么集群。时间都要同步
crontab -e
* */6 * * * ntpdate time1.aliyun.com &>/dev/null && hwclock -w
elasticsearch 有时候会因为JVM堆内存分配不足
(本机内存要足,我是3g内存。一开始我这个没有设置但是也启动了。第二次启动就不行了。3g内存也才刚刚好)
vim /etc/elasticsearch/jvm.options
-Xms1g
-Xmx1g
关于elasticsearch的JVM内存占系统比
(堆内存 是 Elasticsearch 占用的主要内存部分,用于存储索引数据、查询结果和缓存。)
Set JVM options | Elasticsearch Guide [8.17] | Elastichttps://www.elastic.co/guide/en/elasticsearch/reference/current/advanced-configuration.html#set-jvm-heap-size
systemctl start elasticsearch
创建elasticsearch用户用于登陆连接elasticsearch客户端
cd /usr/share/elasticsearch #我打开了访问elastic的9200端口的时候会进行用户密码认证
#bin/elasticsearch-reset-password -u elastic (密码由系统生成)
bin/elasticsearch-reset-password -u elastic -i #设置初始化用户elastic和密码(密码由自己指定)
--cacert 表示信任elastic自己搭建的CA服务器的CA证书,也就信任CA服务器所颁发的ssl证书
curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic:sxm@325468 https://10.8.0.23:9200
cerebro :监控elasticsearch的状态
yum -y install java-1.8.0-openjdk.x86_64 #elastic的jdk版本和这个不是一样的,cere需要jdk-1.8
wget https://github.com/lmenezes/cerebro/releases/download/v0.9.4/cerebro-0.9.4-1.noarch.rpm
yum -y install cerebro-0.9.4-1.noarch.rpm
sudo keytool -import -alias elastic -file /etc/elasticsearch/certs/http_ca.crt -keystore /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-1.el7_9.x86_64/jre/lib/security/cacerts -storepass changeit #如果elastic开启了ssl,要把elstic证书导入cerebro的jdk环境
systemctl start cerebro
我自己安装的java是这个版本(elasticsearch软件包自带java)
然后浏览器访问。可以看到cerebro监控到的elasticserch工具的状态
可以看到elasticsearch集群中的健康elasticsearch个数
elasticsearch也采用分片的方式对收集到的数据进行存储
每个索引(文件)三个分片,每个分片一个副本(7.x的elastic默认是一个索引一个分片,一个备份,但是我们可以自己规定一个索引多少个分片)
以下是在cerebro上创建elasticsearch索引
分片和副本会分别创建到不同的elastic服务器上
kibana和elastic也有版本兼容性(最好logstash也是相同版本)
kibana是连接elastic的客户端,用于分析查看elastic收集到的日志信息
elastic/kibana: Your window into the Elastic Stack
kibana安装
Download Kibana Free | Get Started Now | Elastic
注意:
通过 bin/elasticsearch-reset-password -u elastic -i
重置的 elastic
用户密码,不能直接用于 Kibana 的连接认证,因为 Kibana 默认使用独立的系统用户 kibana_system
(而非 elastic
用户)连接 Elasticsearch
bin/elasticsearch-reset-password -u kibana_system -i
chown -R kibana kibana /kibana/http_ca.crt #elastic的ca证书
elasticsearch会以索引的方式收集数据,索引的方式其实就是不同类型日志分开存储。假设有一个微服务magedu-web1。这个服务的访问日志单独收集放在一个文件(一个索引),错误日志单独收集放在一块,系统日志单独放在一块。一般访问日志能转成json格式,其他只能以行的方式收集。索引只有访问日志才能转化为图表。
访问 http://kibana_ip:5601访问elastic的web控制端
初始登陆 elastic sxm@325468(密码是自己设置的)
kibana(这个建议看完logstash再看)
创建索引的模糊匹配,点击这个可以一次性查看这个服务的systemlog的所有日志(基本elasticseach是以日期day做保存的,(一天收集到的systemlog)作为一个索引(文件))
在kibana中创建模糊匹配,达到同时查看某个服务的所有日志(项目-服务-类型-时间戳)
查看日志(kibanad所有天的系统日志)
kibana创建图形
Kibana详细入门教程 - 雪山飞猪 - 博客园 我感觉直接看这个人的比较方便
老师说收集的数据格式要是json格式的数据才可以。但是我实践收集的日志不是json也可以
比如把这个访问ip拉进去就能看见哪些ip访问了多少次
logstash 安装
logstash 自7.x之后自带jdk,无需再安装jdk
Installing Logstash | Logstash Reference [8.17] | Elastic
Download Logstash Free | Get Started Now | Elastic
logstash 文档
Logstash Introduction | Logstash Reference [8.17] | Elastic
logstash如何设置,如何将数据转换,存储到哪里(logstash的读取和输出)
Input plugins | Logstash Reference [8.17] | Elastic
Output plugins | Logstash Reference [8.17] | Elastic
logstash读取文件的时候要注意文件的权限。直接换成root启动logstash
*收集日志到并存储到elasticsearch上
在/etc/logstash/conf.d 编译配置收集日志的配置文件
vim /etc/logstash/conf.d/test1.conf
input {
file {
path => "/var/log/vmware-network*"
start_position => "beginning" #如果是第一次收集vmwar日志就从头开始收集,如果不是就从上次结束的位置收集,结束的位置记录在sincedb
mode => "read"
}
}
output {
elasticsearch {
hosts => ["https://192.168.75.135:9200,https://192.168.75.136:9200,https://192.168.73.133"] #有几台elasticsearch写几台
user => "elasticsearch"
password => "adeaf#23ad"
ssl => true
cacert => "/root/http_ca.crt"
index => "ai-smartservices-access-%{+YYYY.MM.dd}"
#比如这时候可以在kibana上创建ai-smartsearvice-access-* 可以看见这个服务的全部访问日志
#或者创建ai-smartsearvice-* 看见这个服务的所有收集相关日志
}
}
sincedb记录收集到的日志的位置,下一次就从这个地方开始记录
cat /var/lib/logstash/plugins/inputs/file/.sincedb
检查配置文件
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/test1.conf -t #检查文件
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/test1.conf #执行文件
#/usr/share/logstash/bin/logstash 可以指定单个配置文件
#systemctl start logstash 读取logstash/conf.d下的所有配置文件
这个是测试logstash连接的elastic是否创建了收集的数据的索引(elasticsearch主机上查询)
curl -u elastic:8YmxoAUA2KhkvZSkh0oQ -X GET "https://192.168.75.135:9200/_cat/indices?" --cacert /root/http_ca.crt #查看elasticsearch上创建的所有的索引
curl -u elastic:8YmxoAUA2KhkvZSkh0oQ -X GET "https://192.168.75.135:9200/_cat/indices?v&index=ai-smartservices-access-*" --cacert /root/http_ca.crt
# index => "ai-smartservices-access-%{+YYYY.MM.dd}"是索引 查看是否创建索引
curl -u elastic:8YmxoAUA2KhkvZSkh0oQ -X GET "https://192.168.75.135:9200/ai-smartservices-access-2025.03.11/_search?pretty" --cacert /root/http_ca.crt
#查看是否能访问到收集到的数据
1.logstash收集之特殊格式的日志
如果日志有好几行,而kibana是一行一行的收集的话,那么一条日志就会被它分开收集。要避免这种情况
*这样可以用于测试(stdin不接受file模块)
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/test3.conf
#这样可以直接在终端输入日志,然后在终端输出日志看是否符合条件
input {
stdin {
codec => multiline {
pattern => "^\["
negate => true
what => "previous"
}
}
}
output {
stdout {}
}
在终端输入测试数据,只有当识别到你输入的数据是“["开头,logstash才认为开始输入第二条日志了
2.关于json格式(我后来发现不是很重要,只有尼收集json格式的数据做解析然后传给elasticsearch 也传json格式就好)
在input中设置codec=> json 必须是收集的日志就是json格式的(如果不是会报错但是还是会传送 到elasticsearch)
file 模块收集的是本地的日志文件
这里有个事情就是:
老师说的是只有在收集日志的时候,日志已经是json格式,然后收集的时候input标明 codec=>json ,然后传给lesticsearch 才是json格式然后才能用图像表示
但是deepseek说只要收集的数据在output标明codec=>json它就能转换为json格式给elasticsearch
例如 :收集nginx的访问日志
input {
file {
path => "/var/log/nginx/access.log"
type => "nginx-log"
start_position => ["beginning"]
codec => json
}
}
output {
elasticsearch {
hosts => ["https://10.8.0.23:9200"]
user => "elastic"
password => "sxm@325468"
ssl => true
cacert => "/logstash/http_ca.crt"
index => "project1_server1_systemlog-%{+YYYY.MM.dd}"
codec => json
}
stdout{}
}
elastic索引是基于服务去创建的(例如:一个服务的系统日志对应一种索引,然后一天产生的系统日志是一个索引)
在elasticsearch上可以查看,收集的日志数据存储在
ls -l /data/elasticsearch/elasdata/indices/ #我在配置文件中设置了日志存储位置/data/elasticsearch/elasdata
indeices下是创建的索引(几个索引几个文件)
其实文件存放的是真正索引的分片文件。logstash存储到elasticsearch的数据是以分片(三个elasticsearch节点,三个分片,一个备份)的形式存储的,所以一个服务器上的某个索引并不是完整的日志文件。
3. logstash插件:要插件存在才能使用相关的模块
4.收集TCP/UDP端口的相关访问日志(tcp/udp日志了解即可)
这样写是有问题的(收集日志的索引不能有大写字母)
这样写之后会报错
先往端口传数据
然后执行日志收集的时候出错了
改正后
一般这样可以用于临时收集文件
5.收集syslog产生的相关日志(一般用于收集硬件的相关日志)
rsyslog 的核心作用是为缺乏原生日志收集功能的服务提供统一日志管理支持,同时也能扩展或优化已有日志系统的服务¹³⁶。
通过syslog去收集交换机路由器等网络设备的日志(网络设备开启syslog模式,走syslog协议(smp模式))当logstash和服务不在同一个服务器的时候,可以使用syslog将服务上的日志发送给logstash
rsyslog.conf
是 rsyslog(一种高性能的日志管理服务)的主配置文件,用于定义日志的收集、处理、存储和转发规则。
/etc/rsyslog.conf 文件中规定了那个级别的日志输出到什么地方
(1)比如要把本地的local2级别的日志输出到什么地方
打开设置
vim /etc/rsyslog.conf
可以把日志收集到本地,也可以传输到远程服务器的端口,然后logstash可以从这个服务器的端口收集到日志
(2)在haproxy上打开日志的收集
把harpoxy80端口的访问转发到kibana
然后logstah将rsyslog收集到的日志进行处理转发到elasticsearch