ELK+filebeat+kafka

ELK+filebeat+kafka

elk

elk的架构

elk:统一日志收集系统

  • elasticsearch:分布式的全文索引引擎点非关系型数据库,存储所有的日志信息,主和从最少需要2台。(非关系型数据库,json格式)
  • logstash:动态的从各种指定的数据源,获取数据,而且对数据进行过滤,分析。按照统一的格式发送到es。(收集日志)
  • kilbana:把es的数据进行展示,进行客户端可以理解的操作,汇总,分析和搜索数据的平台。(图形化的工具)

数据流向

  1. logstash收集日志数据收集到的数据按照es
  2. 的格式,发送到数据库
  3. 在图像界面展示--kibana
  4. 客户端访问kibana

数据库,99%都是物理服务器。

nginx可以是微服务

redis可以是微服务部署

keep/lvs

docker可以部署,k8s不需要

ELK的部署

u1 192.168.246.6 安装elasticsearch

u2 192.168.246.7 安装elasticsearch

u3 192.168.246.8 安装logstash与kilbana

csharp 复制代码
#都需安装Java环境
apt -y install openjdk-8-jre-headless
#查看安装版本
java -version
openjdk version "1.8.0_432"
OpenJDK Runtime Environment (build 1.8.0_432-8u432-ga~us1-0ubuntu2~22.04-ga)
OpenJDK 64-Bit Server VM (build 25.432-bga, mixed mode)


#u1u2
dpkg -i elasticsearch-6.7.2.deb
cd /etc/elasticsearch/
#内存不能少于4G安装es logstah
free -h   #查看内存
echo 3 > /proc/sys/vm/drop_caches   #清理内存

cp elasticsearch.yml elasticsearch.yml.bak

vim elasticsearch.yml
17 cluster.name: my-elk
23 node.name: node1    #u2需要改为node.name:node2
24 node.master:true    #u2需要改为node.master:false
#表示该节点是否为主节点
26 node.data: true
#表示该节点是否为数据节点
56 network.host:0.0.0.0
#修改监听地址
60 http.port:9200
#es对外提供的默认端口
66 transport.tcp.port:9300
#指定es集群内部的通信接口
70 discovery.zen.ping.unicast.hosts:["192.168.233.10:9300","192.168.233.20:9300"]
#集群节点通过单播的形式,通过9300端口实现内部通信
72 http.cors.enabled: true
73 #开启跨域访问
74 http.cors.allow-origin: "*"
#允许跨域访问的地址域名为所有
csharp 复制代码
#重启elasticsearch服务
systemctl restart elasticsearch.service

#检查elasticsearch访问是否成功启动

#查看日志
tail -f /var/log/syslog
#查看端口
netstat -antp | grep 9200
#浏览器查看
u1  192.168.246.6:9200
u2  192.168.246.7:9200
csharp 复制代码
#u3
dpkg -i kibana-6.7.2-amd64.deb
dpkg -i logstash-6.7.2.deb

systemctl restart logstash.service
cd /usr/share/logstash/bin/
ln -s /usr/share/logstash/bin/logstash /usr/local/bin/

cd /etc/kibana/
cp kibana.yml kibana.yml.bak.2024.13.30

2 server.port:5601
7 server.host:"0.0.0.0"
28 elasticsearch.hosts: ["http://192.168.246.6:9200","http://192.168.246.7:9200"]
37 kibana.index: ".kibana"
96 logging.dest: /var/log/kibana.log
113 i18n.locale: "zh-CN"

touch /var/log/kibana.log
chown kibana.kibana /var/log/kibana.log

systemctl restart kibana.service
netstat -antp | grep 5601
csharp 复制代码
cd /etc/logstash/conf.d/
#logstash默认的收集文件在conf.d
vim system.conf


input {
        file{
		   path=>"/var/log/syslog"  
		   #指定要收集的日志文件的路径
		   type=>"system"  
		   #自定义索引的标志类型
		   start_position=>"beginning"  
		   #表示从哪个位置开始收集日志,end
		}
}

output {
       elasticsearch {
	   hosts => ["192.168.246.6:9200","192.168.246.7:9200"]
	   index => "system-%{+YYYY.MM.dd}"
	   }
}


logstash -f system.conf --path.data /opt/test1 &
-f file:丛指定文件开始收集
--path.data /opt/test1:每启动-个logstash 就会有一个数据文件,默认都在/var/log/logstash

apt -y install nginx

刷新



logstash:是一个重量级的工具,占用很大的内存空间。只能收集本机的服务,没有办法远程发送

filebeat结合logstash实现远程的日志收集。

filebeat

  • filebeat是一款轻量级的日志收集工具,不依赖java环境
  • 用来替代在机器上没有java环境的情况下进行日志收集。filebeat启动收集日志,只要10M左右内存。
csharp 复制代码
#u5
vim /etc/my.cnf
#打开mysql的日志
general_log=on
general_log file=/usr/local/mysql/data/mysql_general.log


tar -xf filebeat-6.7.2-linux-x86 64.tar.gz
mv filebeat-6.7.2-linux-x86_64 /usr/local/filebeat
cp filebeat.yml filebeat.yml.bak
vim filebeat.yml

- type: log

  # Change to true to enable this input configuration.
  enabled: true

  # Paths that should be crawled and fetched. Glob based paths.
  paths:
    - /var/log/nginx/access.log
    - /var/log/nginx/error.log
  tags: ["nginx"]
  #标签,为了后续logstash进行识别的
  fields:
    service_name: 192.168.246.10_nginx
    #设定显示的索引名称
    log_type: nginx
    from: 192.168.246.10

- type: log
  enabled: true
  paths:
    - /usr/local/mysql/data/mysql_general.log
  tags: ["mysql"]
  fields:
    service_name: 192.168.246.10_mysql
    log_type: mysql
    from: 192.168.246.10
      seccomp:
  default_action: allow

syscalls:
  - action: allow
    names:
    - rseq

logstash的端口,不是说logstash一定是5044,理论上来说可以是任意端口,默认的logstash起始端口

csharp 复制代码
#u3
cd /etc/logstash/conf.d
vim test1.conf


input {
    beats { port => "5044" }
}

output {
       if "nginx" in [tags] {
	   elasticsearch {
	          hosts => ["192.168.246.6:9200","192.168.246.7"]
			  index => "%{[fields][service_name]}-%{+YYYY.MM.dd}"
	   }
	   }
	   if "mysql" in [tags] {
	   elasticsearch {
	          hosts => ["192.168.246.6:9200","192.168.246.7"]
			  index => "%{[fields][service_name]}-%{+YYYY.MM.dd}"
	   }
	   }
}
csharp 复制代码
#u5
root@u5:/usr/local/filebeat# ./filebeat -e -c filebeat.yml
-e输出的格式为标准输出
-c指定配置文件
csharp 复制代码
#u3
logstash -f testl.conf --path.data /opt/test4

访问u5的nginx与mysql

zookeeper+kafka

zopkeepr

zopkeepr: 开源的分布式框架协调服务。

zookeeper的工作机制

基于观察者模式设计的分布式结构,负责存储和管理架构当中的元信息,架构当中的应用接受观察者的监控,一旦数据有变化,通知对应的zookeeper,保存变化的信息。

zookeeper的特点

1、最少要有3台机器,一个领导者(leader),多个跟随者(follower)

2、zookeeper要有半数以上的节点存活,整个架构就可以正常工作,所以都是奇数台部署

3、全局数据一致

4、数据更新的原子性,要么都成功。要么都失败。

5、实时性。

zookeeper的数据架构

1、统一命名服务,不是以ip来记录,可以用域名也可以是主机名来记录信息。

2、统一配置管理,所有的节点信息的配置要是一致。

3、统一集群管理,在整个分布式的环境中,必须实时的掌握每个节点的状态,如果状态发生变化,要及时更新。

zookeeper的安装

1 192.168.246.61

2 192.168.246.62

3 192.168.246.63

csharp 复制代码
tar -xf apache-zookeeper-3.5.7-bin.tar.gz
apt -y install openjdk-8-jre-headless

mv apache-zookeeper-3.5.7-bin zookeeper
cd zookeeper
cd conf
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg


tickTime=2000
#通信心跳时间,zookeeper的服务端和客户端之间心跳的检测间隔,单位是亳秒

initLimit=10
#集群内部的leader和follower之间的最多心跳间隔时间 10秒

syncLimit=5#leader和follower之间的通信超时间,5*2=10,10秒

#数据目录修改
dataDir=/opt/zookeeper/data
#添加日志目录
dataLogDir=/opt/zookeeper/logs

#默认端口
clieclientPort=2181
#添加
server.1=192.168.233.61:3188:3288
server.2=192.168.233.62:3188:3288
server.3=192.168.233.63:3188:3288
csharp 复制代码
cd /opt/zookeeper
mkdir data
mkdir logs
useradd -m -s /sbin/nologin zookeeper

cd /opt
chown -R zookeeper.zookeeper zookeeper/

cd /opt/zookeeper/data
#1
echo 1 > myid
#2
echo 2 > myid
#3
echo 3 > myid

cd /opt/zookeeper/bin
./zkServer.sh start
./zkServer.sh status   #查看状态

kafka消息队列

服务端向客户端发送一个指令,客户端收到指令并且通过这个指令反馈到服务端,完整一个异步方式的通信的流程

  • kafka消息队列----->大数据场景非常合适
  • rabbitMQ----->适合处理小场景的数据请求
  • activeMQ----->适合处理小场景的数据请求

消息队列的应用场景

  1. 异步处理

    用户的短信验证码,邮件通知

  2. 系统解耦

    微服务架构中的服务之间通信

    降低各个组件之间的依赖程度(耦合度),提高组件的灵活性和可维护性

  3. 负载均衡

    高并发系统中的任务处理

    消息队列把数个任务分发到多个消费者实例,电商平台的订单系统

  4. 流量控制和限流

    根据api请求来进行处理,通过控制消息的生产速度和消费的处理速度来完成限流。

    端口:应用和应用之间通信

    api接口:应用程序内部各个组件之间通信的方式

  5. 任务调度和定时任务:

    消息队列可以定时的进行任务调度,按照消费者的计划生成对应的数据

  6. 数据同步和分发:

    日志收集和数据收集

    远程的实现数据的统一管理

  7. 实时数据处理

  8. 备份和恢复

消息队列的模式

1、点对点,一对一,生产者生产消息,消费者消费消息,这个是一对一的。

2、发布/订阅模式

消息的生产者发布一个主题,其他的消费者订阅这个主题,从而实现一对多。

主题:topic

kafka组件的名称

  1. 主题 topic:主题是kafka数据流的一个基本的单元,类似于数据的管道,生产者将消息发布到主题,其他的消费者订阅主题,来消费消息,主题可以被分区,分区有偏移量
  2. 生产者:将消息写入主题和分区
  3. 消费者:从分区和主题当中接收发布的消息,一个消费者可以订阅多个主题。
  4. 分区:个主题可以被分为多个分区,每个分区都是数据的有序的子集,分区越多,消费者消费的速度就快,避免生产者的消费堆积。分区当中有偏移量,按照偏移量进行有序存储,消费者可以独立的读写每个分区的数据。
    如何读取分区的数据,一般是不考虑的。只有在消息出现堆积的时候,会考虑扩展分区数。

kafka的消费堆积出现应该如何处理

消费者没有及时处理掉生产者发布的消息,导致消息堆积。

  • 扩展分区数

偏移量:消息在分区当中的唯一标识

经纪人:zookeeper,存储分区的信息,kafka集群的元数据。

csharp 复制代码
tar -xf kafka 2.13-3.4.1.tgz
mv kafka 2.13-3.4.1 /usr/local/kafka
cd /usr/local/kafka/config
cp server.properties server.properties.bak
vim server.properties
24行左右
broker.id=1(三个服务器的都不一样)
34
listeners=PLAINTEXT://192.168.233.61:9092(填写本机的地址)
50
socket.send.buffer.bytes=102400
#发送套接字缓冲区的大小
socket.receive.buffer.bytes=102400#接受套接字缓冲区的大小
socket.request.max.bytes=104857600#请求套接字缓冲区的大小

65更改
log.dirs=/usr/local/kafka/logs
70
num.partitions=1
#创建主题时默认分区数,指定了其他的分区数,该数值可以被覆盖
109
log.retention.hours=168
#消费队列当中,娄数据保存的最大时间,默认是7天,单位是小时
130
zookeeper.connect=192.168 233.61:2181,192.168.233.62:2181,192.168.233.63:2181


vim /etc/profile
export KAFKA HOME=/usr/local/kafka
export PATH=$PATH:$KAFKA HOME/bin
source /etc/profile

cd /usr/local/kafka/bin
./kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties

netstat -antp | grep 9092
csharp 复制代码
cd /opt
kafka-topics.sh --create --bootstrap-server 192.168.233.61:9092,192.168.233.62:9092,192.168.233.63:9092 --replication-factor 2 --partitions 3 --topic test1

--bootstrap-server:这里的地址一般是一个集群当中地址即可,默认的我们包含所有
--replication-factor 2:定义主题的副本数 2个副本,2-4个,副本是偶数。
partitions 3:定义分区数,3-6个

#查看集群当中的主题数
./kafka-topics.sh --list --bootstrap-server 192.168.233.61:9092

#生产服务器
kafka-console-producer.sh --broker-list 192.168.233.61:9092,192.168.233.62:9092,192.168.233.63:9092 --topic test1

#消费服务器
kafka-console-consumer.sh --bootstrap-server 192.168.233.61:9092,192.168.233.62:9092,192.168.233.63:9092 --topic test1 --from-beginning

#修改主题的分区数
kafka-topics.sh --describe --bootstrap-server 192.168.233.61:9092,192.168.233.62:9092,192.168.233.63:9092 | grep test1


leader: 每一个分区都有一个leader
领导者负责处理分区的读写操作

Replicas:副本数012分别对应每个leader
Isr: 表示和哪个leader进行同步
Partition:分区的编号

#修改
kafka-topics.sh --bootstrap-server 192.168.233.61:9092,192.168.233.62:9092,192.168.233.63:9092 --alter --topic test1 --partitions 6

#删除主题,需要先停止消费者
kafka-topics.sh --delete --bootstrap-server 192.168.233.61:9092,192.168.233.62:9092,192.168.233.63:9092 --topic test1

filebeat在kafka集群上创建主题

u5

177重新注释

csharp 复制代码
添加
output.kafka:
enabled: true
hosts: ["192.168.233.61:9092","192.168.233.62:9092","192.168.233.63:9092"]
topic: nginx mysql
csharp 复制代码
# u3
cd /etc/logstash/conf.d
vim kafka.conf

input {

     kafka {
       bootstrap_servers => "192.168.233.61:9092,192.168.233.62:9092,192.168.233.63:9092"
       topics => "nginx_mysql"
       type => "nginx_kakfa"
       codec => "json"
       auto_offset_reset => "latest"
       decorate_events => true
}
}

output {
    if "nginx-1" in [tags] {
    elasticsearch {
      hosts => ["192.168.233.10:9200","192.168.233.20:9200"]
      index => "%{[fields][service_name]}-%{+YYYY.MM.dd}"

    }
  }

  if "mysql-1" in [tags] {
    elasticsearch {
      hosts => ["192.168.233.10:9200","192.168.233.20:9200"]
      index => "%{[fields][service_name]}-%{+YYYY.MM.dd}"

    }
  }

}

#启动
logstash -f kafka.conf --path.date /opt/testa &
相关推荐
java1234_小锋5 分钟前
Zookeeper是如何解决脑裂问题的?
分布式·zookeeper·云原生
安的列斯凯奇10 分钟前
分布式事务介绍 Seata架构与原理+部署TC服务 示例:黑马商城
分布式·架构
2401_8712133010 分钟前
zookeeper+kafka
分布式·zookeeper·kafka
cmgdxrz3 小时前
性能测试05|JMeter:分布式、报告、并发数计算、性能监控
分布式·jmeter
孟秋与你3 小时前
【redisson】redisson分布式锁原理分析
java·分布式
小李不想输啦4 小时前
RabbitMQ端口操作
分布式·rabbitmq
运维&陈同学4 小时前
【Logstash01】企业级日志分析系统ELK之Logstash 安装与介绍
大数据·linux·elk·elasticsearch·云原生·自动化·logstash
todoitbo5 小时前
DockerCompose玩转Kafka单体与集群部署,Redpanda Console助力可视化管理
分布式·kafka·linq·redpanda·zookeeper集群·kafka集群
明达技术6 小时前
MR30分布式IO在火电厂区的广泛应用
分布式
prince056 小时前
Redisson 实现分布式锁
分布式