elk的架构
es数据库:非关系型数据库,json格式
logstash:收集日志
kibana:图形化的工具
↓
以上三种结合起来即为日志收集系统
filebeat
- 作用:filebeat是一款轻量级的日志收集工具,不依赖java环境,用来替代在机器上没有java环境的情况下进行日志收集
filebeat启动收集日志,只要10m左右的内存
bash
filebeat.inputs:
type: log
enabled: true
paths:
- /var/log/nginx/access.log
- /var/log/nginx/error.log
tags: ["nginx"]
#标签,为了后续logstash进行识别的
fields:
service_name: 192.168.233.21 nginx
#设定显示的索引名称
log_type: nginx
from: 192.168.233.21
bash
type: log
enabled: true
paths:
- /usr/local/mysql/data/mysql_general.log
tags: ["mysql"]
fields:
service_name: 192.168.233.21_mysql
log_type: mysql
from: 192.168.233.21
zookeeper + kafka
zookeeper :开源的分布式框架协调服务
zookeeper的工作机制:
1、基于观察者模式设计的分布式结构,负责存储和管理架构当中的元信息,架构当中的应用接受观察者的监控,一旦数据有变化,它会通知对应的zookeeper,保存变化的信息
特点:
-
1、最少要有3台机器,一个领导者(leader),多个跟随者(follower)组成
-
2、zookeeper要有半数以上的节点存活,集群就可正常工作,所以都是奇数台部署
-
3、全局数据一致
-
4、数据更新的原子性:要么都成功,要么都失败
-
5、实时性
zookeeper的数据架构:
1、统一命名服务,不是以ip来记录,可以用域名也可以用主机名来记录信息
2、统一配置管理,所有节点信息的配置要一致
3、统一集群管理,在整个分布式的环境中,必须实时的掌握每个节点的状态,如果状态发生变化,要及时更新
kafka消息队列
服务端向客户端发送一个指令,客户端收到指令并且通过这个指令反馈到服务端,完成一个异步方式的通信的流程
kafka消息队列 -----------》大数据场景非常合适
rabbitMQ ------------》适合处理小场景的数据请求
activeMQ -------------》适合处理小场景的数据请求
消息队列的应用场景:
1、异步处理
- 用户的短信验证码,邮件通知
2、系统解耦
-
微服务架构中的服务之间的通信
-
降低各个组件之间的依赖程度(耦合度),提高组件的灵活性和可维护性
3、负载均衡
- 高并发系统中的任务处理
4、流量控制和限流
-
根据api请求来进行处理,通过控制消息的生产速度和消费的处理速度来完成限流
-
端口:应用和应用之间通信
-
api接口:应用程序内部各个组件之间通信的方式
5、任务调度和定时任务:
- 消息队列可以定时的进行任务调度,按照消费者的计划生成对应的数据
6、数据同步和分发:
-
日志收集和数据收集
-
远程的实现数据的统一管理
7、实时数据处理
8、备份和恢复
消息队列的模式:
1、点对点(1对1),生产者生产消息,消费者消费
2、发布/订阅模式
消息的生产者发布一个主题,其他的消费者订阅这个主题,从而实现一对多
主题:topic
kafka组件的名称:
1、主题 topic,主题是kafka数据流的一个基本的单元,类似于数据的管道,生产者将消息发布到主题,其他的消费者订阅主题,来消费消息,主题可以被分区,分区有偏移量
2、生产者:将消息写入主题和分区
3、消费者:从主题和分区当中消费发布的消息,一个消费者可以订阅多个主题
4、分区:一个主题可以被分为多个分区,每个分区都是数据的有序的子集,分区越多,消费者消费的速度就越快,可以避免生产者的消费堆积,分区当中有偏移量,按照偏移量进行有序存储,消费者可以独立的读写每个分区的数据,一般是不考虑的,只有在消息出现堆积的时候,会考虑扩展分区数
kafka的消费堆积出现,应该如何处理:
消费者没有及时处理生产者发布的消息,导致消息堆积
1、扩展分区数
5、偏移量:消息在分区当中的唯一标识
test1 test2 test3 分区1
0 1 2
6、经纪人:zookeeper,存储分区的信息,kafka集群的元数据
log.retention.hours=168
(单位为小时,即7天,默认是7天)
消费队列当中,数据保存的最大时间
bash
./kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
bash
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个副本,不宜超过6个,影响性能,副本数必须是偶数
--partitions 3:定义分区数
./kafka-topics.sh --list --bootstrap-server 192.168.233.61:9092
:查看主题数
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-console-producer.sh --broker-list 192.168.233.61:9092,192.168.233.62:9092,192.168.233.63:9092 --topic test1
(生产)
- 修改主题的分区数:
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
Topic: test1 TopicId: 2vuwpY75Qj2bk2e9EYS4Vg PartitionCount: 3 ReplicationFactor: 2 Configs:
Topic: test1 Partition: 0 Leader: 1 Replicas: 1,0 Isr: 1,0
Topic: test1 Partition: 1 Leader: 0 Replicas: 0,2 Isr: 0,2
Topic: test1 Partition: 2 Leader: 2 Replicas: 2,1 Isr: 2,1
leader: 每一个分区都有一个leader
领导者负责处理分区的读写操作
Replicas: 副本数0 1 2分别对应每个leader
Isr: 表示和哪个leader进行同步
Partition: 分区的数量
- 删除topic:
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集群上创建主题
bash
kafka {
bootstrap_servers => "192.168.233.61:9092,192.168.233.62:9092,192.168.233.63:9092"
topics => "nginx_mysql"
type => "nginx_kafka"
codec => "json"
指定数据的格式是json
auto_offset_reset => "latest"
latest:从尾部开始
earliest: 从头部开始
decorate_events => true
传递给es的数据额外的附加kafka的属性数据
}
bash
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}"
}
}
}