ELK日志系统
ELKFK
是一套完整的日志集中处理方案
E:elasticSearck ES 分布式索引行非关系数据库。存储logstash输出的日志,全文检索引擎,保存的格式是json格式
L:logstash 基于java语言开发的,数据收集引擎。日志的收集,可以对数据进行过滤,分析,汇总以及标注格式输出
K:kiabana 是es的可视化工具。对es存储的数据进行可视化展示,分析和检索
F:filebeat 轻量级开源日志文件数据收集器。logstash占用系统资源比较大,属于重量级。有了filebeat可以节省资源,可以通过filebeat和logstash实现远程数据收集。
filebeat不能对数据进行标准输出,不能输出位es格式的数据,所以需要logstash把filebeat数据做标准化处理
K:kafka 消息队列
1 es取主从和数据模式
node.master: true
es数据库的主从类型 true false
node.data: true
数据节点,是否保存数据,logstash发送数据,节点是否接受以及保存。
es如何创建,修改,删除数据 数据管理
通过http的方式
post方式修改数据
创建数据
curl -X PUT "localhost:9200/index-demo/test/1?pretty&pretty’ -H ‘content-Type: application/json’ -d
‘{“user”:“zhangsan”,“mesg”:“hello world”}’
对应的就是本地数据库的地址ip+端口
index-demo
创建索引分片的名称
test
数据的名称
1
数据的id字段
?pretty&pretty
参数设定位json格式
-d
数据的具体内容
“user”:“zhangsan”,“mesg”:“hello world”
修改数据:
curl -X PUT "localhost:9200/index-demo/test/1?pretty&pretty’ -H ‘content-Type: application/json’ -d
‘{“user”:“zhangsan”,“mesg”:“hello world”}’
curl -X POST ‘localhost:9200/index-demo/test/1/_update?pretty’ -H ‘Content-Type: application/json’ -d ‘{ “doc”: { “user”: “zhangsan”, “mesg”: “hello1 world1” } }’
删除:
curl -X DELETE "localhost:9200/index-demo/test/1?pretty&pretty’ -H ‘content-Type: application/json’ -d
‘{“user”:“zhangsan”,“mesg”:“hello1world1”}’
安装elk图形界面部署
cd /etc/logstash/conf.d/
vim system.conf
input{
file{
path =>"/var/log/messages"
type =>"system"
start_position =>"beginning"
#从头开始beginning,从结尾开始end
}
}
output{
elasticsearch {
hosts=>["192.168.39.30:9200","192.168.39.50:9200"]
index =>"system-%{+YYYY.MM.dd}"
}
}
logstash -f system.conf --path.data /opt/test2 &
cd /opt
rpm -ivh kibana-6.7.2-x86_64.rpm
vim /etc/kibana/kibana.yml
2行 取消注释
7行 取消注释改为server.host: "0.0.0.0"
28行 取消注释改为elasticsearch.hosts: ["http://192.168.39.30:9200","http://192.168.39.50:9200"]
37行 取消注释
96行 取消注释logging.dest: /var/log/kibana.log
113行 改为i18n.locale: "zh-CN"
touch /var/log/kibana.log
chown kibana:kibana /var/log/kibana.log
chmod 777 /var/log/messages
systemctl restart kibana.service
systemctl enable kibana.service
netstat -antp | grep 5601
网页输入http://192.168.39.60:5601
点击左边管理,索引模式
输入system*,下一步,创建
点击左边discover查看日志
API接口:
软件内部代码之间通信的接口 代码的连接 代码之间调用的接口
端口是对外提供访问程序的内存接口
filebeat:
1、可以在本机收集日志
2、也可以远程收集日志
3、轻量级的日志收集系统 可以在非java环境运行
logstash是在jvm环境中运行,资源消耗很大,启动一个logstash要消耗500M左右的内存
filebeat只消耗10M左右
The logstash hosts
hosts:[“192.168.39.50:5045”]
5044 logstash默认的端口
只要是logstash主机上没有被占用的端口都可以使用。大于1024.
特定程序的日志收集
192.168.39.30 node1 安装Elasticsearch,Elasticsearch-head,node,phantomjs
192.168.39.50 node2 安装Elasticsearch,Elasticsearch-head,node,phantomjs
192.168.39.60 APACHE 安装Logstash
192.168.39.31 filebeat 安装filebeat,http,nginx,mysql
node1,node2,logstash安装参考elk1文档
filebeat
yum -y install mysqld,httpd,nginx
cd /opt
tar -xf filebeat-6.7.2-linux-x86_64.tar.gz
mv filebeat-6.7.2-linux-x86_64.tar.gz filebeat
cd filebeat
vim filebeat.yml
20行
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
- /var/log/nginx/error.log
tags: ["nginx"]
fields:
service_name: 192.168.39.31_nginx
log_type: nginx
from: 192.168.39.31
- type: log
enabled: true
paths:
- /usr/local/mysql/data/mysql_general.log
tags: ["mysql"]
fields:
service_name: 192.168.39.31_mysql
log_type: mysql
from: 192.168.39.31
- type: log
enabled: true
paths:
- /var/log/httpd/access_log
- /var/log/httpd/error_log
tags: ["http"]
fields:
service_name: 192.168.39.31_http
log_type: http
from: 192.168.39.31
166行 注释output,hosts
179行
output.logstash:
# The Logstash hosts
hosts: ["192.168.39.60:5046"]
vim /etc/nginx/nginx.conf
38 server {
39 listen 8888;
40 listen [::]:8888;
41 server_name _;
42 root /usr/share/nginx/html;
Apache服务器
cd /etc/logstash/conf.d
vim nmh_5046.conf
input{
beats {
port => "5046"
}
}
output{
if "nginx" in [tags] {
elasticsearch {
hosts=>["192.168.39.30:9200","192.168.39.50:9200"]
index =>"%{[fields][service_name]}-%{+YYYY.MM.dd}"
}
}
if "mysql" in [tags] {
elasticsearch {
hosts=>["192.168.39.30:9200","192.168.39.50:9200"]
index =>"%{[fields][service_name]}-%{+YYYY.MM.dd}"
}
}
if "http" in [tags] {
elasticsearch {
hosts=>["192.168.39.30:9200","192.168.39.50:9200"]
index =>"%{[fields][service_name]}-%{+YYYY.MM.dd}"
}
}
}
filebeat服务器
nohup ./filebeat -e -c filebeat.yml > filebeat.out &
Apache服务器
logstash -f nginx_61.conf --path.data /opt/test9 &
网页输入192.168.39.30:9100
输入192.168.39.30:9200查看是否有nginx,mysql,http
查看索引
nohup ./filebeat -e -c filebeat.yml> filebeat.out &
-e:输出到标准输出
-c:指定配置文件
nohup:在系统的后台运行,不会因为终端的关闭导致程序停止运行
kafka 带入集群当中
zookeeper集群+kafka集群
zookeeper是一个开源的,分布式的,为了分布式架构协调服务的apache的项目
保存元数据
zookeeper的工作机制:
观察者模式设计的分布式服务器管理架构。
负载存储和管理元数据,记录集群的变化。保存集群变化的信息。
zookeeper的特点
1、在集群中分为领导者和追随者,组成的集群
2、只要有半数以上的节点正常工作,整个zookeeper就可以正常工作。zookeeper集群在部署时一般选在奇数台
3、全局数据一致,每个zookeeper不论是领导者还是追随者,在访问他们的数据时都是一致的
4、数据更新的原子性,一次更新数据,要么都成功,要么都失败
5、数据更新的实时性6
6、领导者追随者根据投票产生
选举机制:
A B C
1、服务器A启动 发起一次选举,A会投自己一票。A有一票,不够半数。选举无法完成。A进行looking
2、服务器B启动,再发起一次选举,服务器B也投自己一票,服务器A和服务器B会做一个比较,myid,谁的myid大,如果A比B小,A会把票改投给B,2票,B自动当选为leader
3、C启动,自动成为追随者
192.168.39.31
192.168.39.32
192.168.39.33
zookeeper选举
三台同步
systemctl stop firewalld
setenforce 0
ntp ntp.aliyun.com
ntpdate ntp.aliyun.com
date
cd /opt
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
java -version
托文件
tar -xf apache-zookeeper-3.5.7-bin.tar.gz
ls
mv apache-zookeeper-3.5.7-bin zookeeper
cd zookeeper/
ll
cd conf/
ll
cp zoo_sample.cfg zoo.cfg
ll
vim zoo.cfg
11行 dataDir=/opt/zookeeper/data
dataLogDir=/opt/zookeeper/logs
14行 server.1=192.168.39.31:3188:3288
server.2=192.168.39.32:3188:3288
server.3=192.168.39.33:3188:3288
mkdir /opt/zookeeper/logs
mkdir /opt/zookeeper/data
echo 1 > /opt/zookeeper/data/myid
vim /etc/init.d/zookeeper
#!/bin/bash
#chkconfig:2345 20 90
#description:Zookeeper Service Control Script
ZK_HOME='/opt/zookeeper'
case $1 in
start)
echo "---------- zookeeper 启动 ------------"
$ZK_HOME/bin/zkServer.sh start
;;
stop)
echo "---------- zookeeper 停止 ------------"
$ZK_HOME/bin/zkServer.sh stop
;;
restart)
echo "---------- zookeeper 重启 ------------"
$ZK_HOME/bin/zkServer.sh restart
;;
status)
echo "---------- zookeeper 状态 ------------"
$ZK_HOME/bin/zkServer.sh status
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
esac
// 设置开机自启
chmod +x /etc/init.d/zookeeper
chkconfig --add zookeeper
//分别启动 Zookeeper
service zookeeper start
//查看当前状态
service zookeeper status
chmod +x /etc/init.d/zookeeper
chkconfig --add zookeeper
service zookeeper start
service zookeeper status
server.1=192.168.39.31:3188:3288
server.2=192.168.39.32:3188:3288
server.3=192.168.39.33:3188:3288
server.1 数字id也就是服务器对应的myid
192.168.39.31 服务器ip地址
3188:zookeeper集群内部通信的端口
3288:重新选举端口,万一leader挂了。用这个端口进行内部通信,选举新的leader
kafka概述:
消息队列:MQ
在高并发环境下,同步的请求来不及处理,请求太多造成阻塞
比如说大量请求并发到数据库,too many connection报错
消息队列,使用异步处理方式,可以缓解系统处理请求的压力。
kafka的作用:
1、异步处理
2、系统解耦
每个系统之间独立运行,互相之间没有必然的依赖关系。
微服务架构中的通信对于解耦来说至关重要
各个微服务之间独立运行,分别处理各自的请求和消息。提高整个系统的吞吐量和处理能力
尤其是电商的订单系统,网站的工单系统,典型的一个消息队列场景
3、负载均衡
消息队列的负载均衡:把任务发送到多个消费者,多个生产者可以并行处理队列中的消息。
4、流量控制和限流
通过延迟放方法,处理生产速率和消费者的处理速度(代理控制)
5、数据同步和分发
跨系统的数据同步和日志收集
6、任务调度和定时任务
7、实时数据处理
8、备份和回复
消息队列的模式
1、点对点 一对一 消费者消费完数据之后,生产者会自动清除已消费的数据
一个生产者对应一个消费者(淘汰)
2、发布/订阅模式(一对多,观察者模式,消费者数据在消费完之后不会被清除(保留一段时间))
生产者发布一个消息,可以是一个消费者使用,也可以是多个消费者同时使用(主流)
kafka就是发布/订阅模式的消费队列。RabbitMQ也是发布/订阅模式的消息队列。小集群的内部使用
大数据的实时处理领域
kafka的特性
高吞吐量,低延迟
每秒可以处理几十万条数据,延迟只有几毫秒
集群的可扩展性(热扩展)
消息的持久化:生产者发布的消息可以保存到磁盘当中,防止数据丢失(有时间限制)
容错性:挂了一个可以继续使用
高并发:数千个客户端可以同时读写
kafka的组件:
1、tpoic 主题,kafka的基本单元,所有生产者发布的消息都是发到主题
消费者订阅主题,然后消费生产者发布的消息
生产者 生产者把消息发布到主题
消费者 订阅主题,消费生产者发布的消息
分区:每个主题都可以分成多个分区,每个分区都是数据的有序子集
分区当中保留数据,按照偏移量来有序的存储数据,消费者可以根据偏移量来消费指定分区当中的消息(一般不用)
偏移量:消息在分区当中的唯一标识,跟踪和定位消息所在位置,消费者可以根据偏移量来处理信息
分区还有备份的作用:我们在创建主题时创建分区,创建分区时要指定副本数
分区和我们执行的集群机器数量一般是保持一致
副本:备份分区中的消息。最少要2个,互为备份。
经纪人(broker):经纪人处理生产者和消费者的请求(kafka)元数据(zookeeper)
zookeeper:保存元数据。
kafka的工作流程:
生产者将消息发布到指定的主题,每个消息都附带一个key和value
主题是有多个分区的,生产者将消息写入一个分区(带偏移量)
经纪人(kafka)分配和处理生产者的发布请求,偏移量也是经纪人分配(在分区中是唯一)。
消费者订阅主题,获取全量的消费者的消费信息(默认模式),也可以从指定的分区获取消息(代码完成,一般不用)
生产者发布的消息会在本地保留一段时间,防止消费者延迟或者处理速度国漫,导致没有成功消费。保留时间:7天
kafka-topics.sh --create --bootstrap-server 192.168.39.31:9092,192.168.39.32:9092,192.168.168.39.33:9092 --replication-factor 2 --partition 3 --topic test1
–replication-factor 2:创建分区的副本数,最少2个
–partition 3:分区数
–topic test1:主题名称
192.168.39.31
192.168.39.32
192.168.39.33
三台同时
tar -xf kafka_2.13-3.4.1.tgz
mv kafka_2.13-3.4.1 /usr/local/kafka
cd /usr/local/kafka/config/
vim server.properties
24 broker.id=0 每台主机必须不一样
34 listeners=PLAINTEXT://192.168.39.31:9092 每台地址跟本机相同
44 num.network.threads=3
#broker处理网络请求的线程数,一般不动
47 num.io.threads=8
#处理磁盘读写的线程数,数制一定大于磁盘数量
51 socket.send.buffer.bytes=102400
#发送套接字的缓冲区的大小
54 socket.receive.buffer.bytes=102400
#接收套接字缓冲区的大小
57 socket.request.max.bytes=104857600
#请求套接字缓冲区的大小
63 log.dirs=/usr/local/kafka/logs
64 #日志存放路径
68 num.partitions=1
69 #创建主题时,经纪人指定的分区数,如果指定的分区数不同,这个值可以覆盖
106 log.retention.hours=168
107 #消息的本地持久化保留的时间,168小时
126 zookeeper.connect=192.168.39.31:2181,192.168.39.32:2181,192.168.38.33:2181
vim /etc/profile
export KAFKA_HOME=/usr/local/kafka
export PATH=$PATH:$KAFKA_HOME/bin
source /etc/profile
vim /etc/init.d/kafka
#!/bin/bash
#chkconfig:2345 22 88
#description:Kafka Service Control Script
KAFKA_HOME='/usr/local/kafka'
case $1 in
start)
echo "---------- Kafka 启动 ------------"
${KAFKA_HOME}/bin/kafka-server-start.sh -daemon ${KAFKA_HOME}/config/server.properties
;;
stop)
echo "---------- Kafka 停止 ------------"
${KAFKA_HOME}/bin/kafka-server-stop.sh
;;
restart)
$0 stop
$0 start
;;
status)
echo "---------- Kafka 状态 ------------"
count=$(ps -ef | grep kafka | egrep -cv "grep|$$")
if [ "$count" -eq 0 ];then
echo "kafka is not running"
else
echo "kafka is running"
fi
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
esac
service kafka start
netstat -antp | grep 9092
kafka-topics.sh --create --bootstrap-server 192.168.39.31:9092,192.168.39.32:9092,192.168.39.33:9092 --replication-factor 2 --partitions 3 --topic test1
#创建主题
kafka-console-producer.sh --broker-list 192.168.39.31:9092,192.168.39.32:9092,192.168.39.33:9092 --topic test1
#生产者创建消息
kafka-console-consumer.sh --bootstrap-server 192.168.39.31:9092,192.168.39.32:9092,192.168.39.33:9092 --topic test1 --from-beginning
#消费者消费生产者创建的消息
kafka-topics.sh --describe --bootstrap-server 192.168.39.31:9092,192.168.39.32:9092,192.168.39.33:9092
#查询集群中的主题详细信息
kafka-topics.sh --list --bootstrap-server 192.168.39.31:9092,192.168.39.32:9092,192.168.39.33:9092
#列出Kafka集群中当前存在的所有主题
总结:
zookeeper就是总结集群的元数据
kafka的工作流程
组件的作用
kafka的消息堆积该如何解决:
消费者出现了延迟或者处理能力太差,导致消息堆积
1、减少kafka持久化的保存时间
2、修改主题的分区数,扩大分区的数量,提高消费者获取的通道
3、可以指定多个消费者共同工作,处理消息的挤压
elk+f+kafka
![image-20240806090943017](ELK%E6%97%A5%E5%BF%97%E7%B3%BB%E7%BB%9F.assets/image-20240806090943017.png)
192.168.39.30 es1 Elasticsearch+Elasticsearch-head+phantomjs+node
192.168.39.50 es2 Elasticsearch+Elasticsearch-head+phantomjs+node
192.168.39.60 logstash+kibana
192.168.39.31 zookeeper+kafka
192.168.39.32 zookeeper+kafka
192.168.39.33 zookeeper+kafka
192.168.39.40 filebeat+nginx
192.168.39.40
cd /usr/local/filebeat
vim filebeat.yml
filebeat.prospectors:
- type: log
enabled: true
paths:
- /var/log/nginx/access_log
tags: ["access"]
- type: log
enabled: true
paths:
- /var/log/nginx/error_log
tags: ["error"]
#添加输出到 Kafka 的配置
161行
output.kafka:
enabled: true
hosts: ["192.168.39.31:9092","192.168.39.32:9092","192.168.39.33:9092"] #指定 Kafka 集群配置
topic: "nginx" #指定 Kafka 的 topic
#启动 filebeat
nohup ./filebeat -e -c filebeat.yml> filebeat.out &
192.168.39.60
部署 ELK,在 Logstash 组件所在节点上新建一个 Logstash 配置文件
cd /etc/logstash/conf.d/
vim kafka.conf
input {
kafka {
bootstrap_servers => "192.168.39.31:9092,192.168.39.32:9092,192.168.39.33:9092"
#kafka集群地址
topics => "nginx"
#拉取的kafka的指定topic
type => "nginx_kafka"
#指定 type 字段
codec => "json"
#解析json格式的日志数据
auto_offset_reset => "latest"
#拉取最近数据,earliest为从头开始拉取
decorate_events => true
#传递给elasticsearch的数据额外增加kafka的属性数据
}
}
output {
if "access" in [tags] {
elasticsearch {
hosts => ["192.168.39.30:9200","192.168.39.50:9200"]
index => "nginx_access-%{+YYYY.MM.dd}"
}
}
if "error" in [tags] {
elasticsearch {
hosts => ["192.168.39.30:9200","192.168.39.50:9200"]
index => "nginx_error-%{+YYYY.MM.dd}"
}
}
}
#启动 logstash
logstash -f kafka.conf --path.data /opt/test9 &
4.浏览器访问 http://192.168.39.60:5601 登录 Kibana,
单击“Create Index Pattern”按钮添加索引“filebeat_test-*”,单击 “create” 按钮创建,
单击 “Discover” 按钮可查看图表信息及日志信息。
RSYNC 远程同步
上行 客户端同步到服务端
下行 服务端同步到客户端
开源的快速备份的工具,一般是系统 自带的
可以在不同主机之间同步整个目录树(目录)
在远程同步的任务中,负责发起rsync的叫做发起端,也就是服务端,负责响应的同步请求的,就是客户端
rsync的特点:
1、支持拷贝文件,链接文件等等
2、可以同步整个目录
3、可以支持保留源文件或者目录的权限等等
4、可以实现增量同步
同步方式
1、完整备份
2、增量备份
常用的选项:
1、-a 归档模式,保留权限
2、-v 显示同步的详细过程
3、-z 压缩,在传输的过程中对文件进行压缩
4、-H 同步硬连接
5、–delete 同步删除文件
6、-l 同步连接文件
7、-r 递归,所有
inotify-tools
inotify 实时监控
inotify watch 监控文件系统的变化
inotify wait 监控修改,创建,移动,删除,属性修改(权限,所有者,所属组)如果有变动,立即输出结果
inotifywait -mrq -e modify,create,move,delete,attrib /opt/xy102
m 持续监控
r 递归整个目录 只要变化包含子目录的变化全部记录
q 简化输出信息
e 指定监控的事件,
test1 上行
test2 下行
test1
rpm -q rsync
vim /etc/rsyncd.conf
uid = root
gid = root
use chroot = yes
#是否禁锢在源目录
address = 192.168.39.34
port 873
#监听地址
# max connections = 4
pid file = /var/run/rsyncd.pid
log file = /var/log.rsyncd.log
hosts allow = 192.168.39.0/24
#允许访问的客户端的ip地址
dont compress = *.gz *.bz2 *.tgz *.zip *.rar *.z
#在传输过程中,不再进行压缩的文件类型
[test]
#共享模块的名称,后续通过模块的名称来进行同步
path = /opt/test
#源目录,就是同步的目录
#comment = test
#备注信息
read only = no
#源目录,客户端可以读,也可以写
auth users = backuper
#授权登录的账户名称
secrets file = /etc/rsyncd_users.db
#授权登录账户的密码文件
vim /etc/rsyncd_users.db
backuper:123456
chmod 600 /etc/rsyncd_users.db
cd /opt
ll
mkdir /opt/test
chmod 777 /opt/test/
netstat -antp | grep 873
systemctl restart rsyncd
test2
tar -xf inotify-tools-3.14.tar.gz、
yum -y install make
cd inotify-tools-3.14/
./configure
make -j 4 && make
cd /opt
mkdir xy102
chmod 777 /opt/xy102/
inotifywait -mrq -e modify,create,move,delete,attrib /opt/xy102
#另开同一台test2可以在/opt/xy102同步操作
cd /opt/xy102
vim inotify.sh
#!/bin/bash
inotify_cmd="inotifywait -mrq -e modify,create,move,delete,attrib /opt/xy102"
rsync_cmd="rsync -azH --delete --password-file=/etc/server.pass /opt/xy102 backuper@192.168.39.34::test/"
$inotify_cmd | while read DIRECTORY EVENT FILE
do
if [ $(pgrep rsync | wc -l ) -le 0 ]
then
$rsync_cmd
fi
done
chmod 777 inotify.sh
./inotify.sh
#!bin/bash
inotify_cmd=“inotifywait -mrq -e modify,create,move,delete,attrib /opt/xy102”
rsync_cmd=“rsync -azH --delelte --passwd-file=/etc/server.pass /opt/xy102 backuper@192.168.39.34::test”
.tar.gz、
yum -y install make
cd inotify-tools-3.14/
./configure
make -j 4 && make
cd /opt
mkdir xy102
chmod 777 /opt/xy102/
inotifywait -mrq -e modify,create,move,delete,attrib /opt/xy102
#另开同一台test2可以在/opt/xy102同步操作
cd /opt/xy102
vim inotify.sh
#!/bin/bash
inotify_cmd=“inotifywait -mrq -e modify,create,move,delete,attrib /opt/xy102”
rsync_cmd=“rsync -azH --delete --password-file=/etc/server.pass /opt/xy102 backuper@192.168.39.34::test/”
$inotify_cmd | while read DIRECTORY EVENT FILE
do
if [ $(pgrep rsync | wc -l ) -le 0 ]
then
$rsync_cmd
fi
done
chmod 777 inotify.sh
./inotify.sh
#!bin/bash
inotify_cmd="inotifywait -mrq -e modify,create,move,delete,attrib /opt/xy102"
rsync_cmd="rsync -azH --delelte --passwd-file=/etc/server.pass /opt/xy102 backuper@192.168.39.34::test"
--delete 全同步,将两个文件中不同的文件将其删除