一.kafka介绍
1.kafka定义
Kafka 是一个分布式的基于发布/订阅模式的消息队列(MQ,Message Queue),主要应用于大数据范畴的及时计算以及日志收集。
2.Kafka 简介
Kafka 是最初由 Linkedin 公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于 Zookeeper 和谐的分布式消息中间件系统,它的最大的特性就是可以及时的处置惩罚大量数据以满足各种需求场景,比如基于 hadoop 的批处置惩罚系统、低延迟的及时系统、Spark/Flink 流式处置惩罚引擎,nginx 访问日志,消息服务等等,用 scala 语言编写,
Linkedin 于 2010 年贡献给了 Apache 基金会并成为顶级开源项目。
3.为什么必要消息队列(MQ)
主要缘故原由是由于在高并发情况下,同步哀求来不及处置惩罚,哀求往往会发生阻塞。比如大量的哀求并发访问数据库,导致行锁表锁,最后哀求线程会堆积过多,从而触发 too many connection 错误,引发雪崩效应。
我们使用消息队列,通过异步处置惩罚哀求,从而缓解系统的压力。消息队列常应用于异步处置惩罚,流量削峰,应用解耦,消息通讯等场景。
当前比力常见的 MQ 中间件有 ActiveMQ、RabbitMQ、RocketMQ、Kafka 等。
4.使用消息队列的长处
(1)解耦
允许你独立的扩展或修改两边的处置惩罚过程,只要确保它们遵守同样的接口约束。
(2)可规复性
系统的一部分组件失效时,不会影响到整个系统。消息队列低落了进程间的耦合度,所以纵然一个处置惩罚消息的进程挂掉,加入队列中的消息仍然可以在系统规复后被处置惩罚。
(3)缓冲
有助于控制和优化数据流经过系统的速度,解决生产消息和消耗消息的处置惩罚速度不同等的情况。
(4)灵活性 & 峰值处置惩罚本领
在访问量剧增的情况下,应用仍然必要继承发挥作用,但是这样的突发流量并不常见。如果为以能处置惩罚这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会由于突发的超负荷的哀求而完全崩溃。
(5)异步通信
很多时间,用户不想也不必要立即处置惩罚消息。消息队列提供了异步处置惩罚机制,允许用户把一个消息放入队列,但并不立即处置惩罚它。想向队列中放入多少消息就放多少,然后在必要的时间再去处置惩罚它们。
5.消息队列的两种模式
(1)点对点模式(一对一,消耗者自动拉取数据,消息收到后消息清除)
消息生产者生产消息发送到消息队列中,然后消息消耗者从消息队列中取出而且消耗消息。消息被消耗以后,消息队列中不再有存储,所以消息消耗者不可能消耗到已经被消耗的消息。消息队列支持存在多个消耗者,但是对一个消息而言,只会有一个消耗者可以消耗。
(2)发布/订阅模式(一对多,又叫观察者模式,消耗者消耗数据之后不会清除消息)
消息生产者(发布)将消息发布到 topic 中,同时有多个消息消耗者(订阅)消耗该消息。和点对点方式不同,发布到 topic 的消息会被所有订阅者消耗。
发布/订阅模式是定义对象间一种一对多的依靠关系,使得每当一个对象(目的对象)的状态发生改变,则所有依靠于它的对象(观察者对象)都会得到通知并自动更新。
6.Kafka 的特性
高吞吐量、低延迟
Kafka 每秒可以处置惩罚几十万条消息,它的延迟最低只有几毫秒。每个 topic 可以分多个 Partition,Consumer Group 对 Partition 举行消耗操作,提高负载平衡本领和消耗本领。
可扩展性
kafka 集群支持热扩展
长期性、可靠性
消息被长期化到本地磁盘,而且支持数据备份防止数据丢失
容错性
允许集群中节点失败(多副本情况下,若副本数量为 n,则允许 n-1 个节点失败)
高并发
支持数千个客户端同时读写
7.kafka系统布局
(1)Broker
- 一台 kafka 服务器就是一个 broker。一个集群由多个 broker 构成。一个 broker 可以容纳多个 topic。
(2)Topic
- 可以理解为一个队列,生产者和消耗者面向的都是一个 topic。
- 类似于数据库的表名或者 ES 的 index
- 物理上不同 topic 的消息分开存储
(3)Partition
- 为了实现扩展性,一个非常大的 topic 可以分布到多个 broker(即服务器)上,一个 topic 可以分割为一个或多个 partition,每个 partition 是一个有序的队列。Kafka 只保证 partition 内的记载是有序的,而不保证 topic 中不同 partition 的序次。
- 每个 topic 至少有一个 partition,当生产者产生数据的时间,会根据分配策略选择分区,然后将消息追加到指定的分区的队列末了。
Partation 数据路由规则:
1.指定了 patition,则直接使用;
2.未指定 patition 但指定 key(相当于消息中某个属性),通过对 key 的 value 举行 hash 取模,选出一个 patition;
3.patition 和 key 都未指定,使用轮询选出一个 patition。
每条消息都会有一个自增的编号,用于标识消息的偏移量,标识序次从 0 开始。
每个 partition 中的数据使用多个 segment 文件存储。
如果 topic 有多个 partition,消耗数据时就不能保证数据的序次。严格保证消息的消耗序次的场景下(比方商品秒杀、 抢红包),必要将 partition 数量设为 1。
●broker 存储 topic 的数据。如果某 topic 有 N 个 partition,集群有 N 个 broker,那么每个 broker 存储该 topic 的一个 partition。
●如果某 topic 有 N 个 partition,集群有 (N+M) 个 broker,那么其中有 N 个 broker 存储 topic 的一个 partition, 剩下的 M 个 broker 不存储该 topic 的 partition 数据。
●如果某 topic 有 N 个 partition,集群中 broker 数量少于 N 个,那么一个 broker 存储该 topic 的一个或多个 partition。在实际生产情况中,只管克制这种情况的发生,这种情况容易导致 Kafka 集群数据不平衡。
分区的缘故原由:
●方便在集群中扩展,每个Partition可以通过调解以顺应它地点的机器,而一个topic又可以有多个Partition构成,因此整个集群就可以顺应任意大小的数据了;
●可以提高并发,由于可以以Partition为单元读写了。
(4)Replica
- 副本,为保证集群中的某个节点发生故障时,该节点上的 partition 数据不丢失,且 kafka 仍然能够继承工作,kafka 提供了副本机制,一个 topic 的每个分区都有若干个副本,一个 leader 和若干个 follower。
(5)Leader
- 每个 partition 有多个副本,其中有且仅有一个作为 Leader,Leader 是当前负责数据的读写的 partition。
(6)Follower
- Follower 跟随 Leader,所有写哀求都通过 Leader 路由,数据变动会广播给所有 Follower,Follower 与 Leader 保持数据同步。Follower 只负叱责份,不负责数据的读写。
- 如果 Leader 故障,则从 Follower 中选举出一个新的 Leader。
- 当 Follower 挂掉、卡住或者同步太慢,Leader 会把这个 Follower 从 ISR(Leader 维护的一个和 Leader 保持同步的 Follower 聚集) 列表中删除,重新创建一个 Follower。
(7)Producer
- 生产者即数据的发布者,该角色将消息 push 发布到 Kafka 的 topic 中。
- broker 接收到生产者发送的消息后,broker 将该消息追加到当前用于追加数据的 segment 文件中。
- 生产者发送的消息,存储到一个 partition 中,生产者也可以指定数据存储的 partition。
(8)Consumer
- 消耗者可以从 broker 中 pull 拉取数据。消耗者可以消耗多个 topic 中的数据。
(9)Consumer Group(CG)
- 消耗者组,由多个 consumer 构成。
- 所有的消耗者都属于某个消耗者组,即消耗者组是逻辑上的一个订阅者。可为每个消耗者指定组名,若不指定组名则属于默认的组。
- 将多个消耗者集中到一起去处置惩罚某一个 Topic 的数据,可以更快的提高数据的消耗本领。
- 消耗者组内每个消耗者负责消耗不同分区的数据,一个分区只能由一个组内消耗者消耗,防止数据被重复读取。
- 消耗者组之间互不影响。
(10)offset 偏移量
- 可以唯一的标识一条消息。
- 偏移量决定读取数据的位置,不会有线程安全的题目,消耗者通过偏移量来决定下次读取的消息(即消耗位置)。
- 消息被消耗之后,并不被马上删除,这样多个业务就可以重复使用 Kafka 的消息。
- 某一个业务也可以通过修改偏移量到达重新读取消息的目的,偏移量由用户控制。
- 消息终极还是会被删除的,默认生命周期为 1 周(7*24小时)。
(11)Zookeeper
- Kafka 通过 Zookeeper 来存储集群的 meta 信息。
- 由于 consumer 在消耗过程中可能会出现断电宕机等故障,consumer 规复后,必要从故障前的位置的继承消耗,所以 consumer 必要及时记载自己消耗到了哪个 offset,以便故障规复后继承消耗。
- Kafka 0.9 版本之前,consumer 默认将 offset 保存在 Zookeeper 中;从 0.9 版本开始,consumer 默认将 offset 保存在 Kafka 一个内置的 topic 中,该 topic 为 __consumer_offsets。
- 也就是说,zookeeper的作用就是,生产者push数据到kafka集群,就必须要找到kafka集群的节点在哪里,这些都是通过zookeeper去探求的。消耗者消耗哪一条数据,也必要zookeeper的支持,从zookeeper得到offset,offset记载上一次消耗的数据消耗到哪里,这样就可以接着下一条数据举行消耗。
二.摆设kafka集群
192.168.86.60 :Zookeeper+Kafka
192.168.86.70 :Zookeeper+Kafka
192.168.86.80 :Zookeeper+Kafka
1.上传软件包并解压
- cd /opt/
- tar xf kafka_2.13-2.8.2.tgz
复制代码 2.修改设置文件
3.修改情况变量
- 所有服务器操作
- vim /etc/profile
- export KAFKA_HOME=/usr/local/kafka
- export PATH=$PATH:$KAFKA_HOME/bin
复制代码
4. 启动kafka
- cd /usr/local/kafka/bin/
- ./kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
- netstat -lntp | grep 9092
复制代码
5.Kafka 命令行操作
- kafka/bin/kafka-topics.sh --zookeeper IP1:2181,IP2:2181,IP3:2181 --create --topic 主题名 --partitions 分区数 --replication-factor 副本数 #创建topic
- kafka/bin/kafka-topics.sh --zookeeper IP1:2181,IP2:2181,IP3:2181 --list #查看topic列表
- kafka/bin/kafka-topics.sh --zookeeper IP1:2181,IP2:2181,IP3:2181 --discribe --topic 主题名 #查看topic详细信息
- kafka/bin/kafka-topics.sh --zookeeper IP1:2181,IP2:2181,IP3:2181 --delete --topic 主题名 #删除topic
- kafka/bin/kafka-topics.sh --zookeeper IP1:2181,IP2:2181,IP3:2181 --alter --topic 主题名 --partitions 分区数 #修改topic的分区数(只能增不能减)
- kafka/bin/kafka-console-producer.sh --broker-list IP1:9092,IP2:9092,IP3:9092 --topic 主题名 #向topic推送数据
- kafka/bin/kafka-console-consumer.sh --bootstrap-server IP1:9092,IP2:9092,IP3:9092 --topic 主题名 [--from-beginning] #从topic拉取数据
复制代码 三. 搭建ELK+Filebead+zookeeper+kafka
IP地点 | 安装软件 | 192.168.86.10 | ElasticSearch | 192.168.86.20 | ElasticSearch、Kibana | 192.168.86.30 | ElasticSearch | 192.168.86.40 | Nginx、Logstash | 192.168.86.50 | Nginx、Filebeat | 192.168.86.60 | Zookeeper、Kafka | 192.168.86.70 | Zookeeper、Kafka | 192.168.86.80 | Zookeeper、Kafka | 修改Filebeat设置
- cd /usr/local/filebeat
-
- vim filebeat.yml
- 注释162、164行内容
- 163行起添加
- output.kafka:
- enabled: true
- hosts: ["192.168.86.60:9092","192.168.86.770","192.168.86.80"] #指定 Kafka 集群配置
- topic: "nginx" #指定 Kafka 的 topic
-
- ————————————
复制代码
欣赏器访问更新数据
- 启动 filebeat
- ./filebeat -e -c filebeat.yml
复制代码 修改Logstash设置
- cd /etc/logstash/conf.d/
- vim kafka.conf
复制代码
欣赏器访问kibana验证
欣赏器访问 http://192.168.86.20:5601 登录 Kibana,单击【管理】按钮【创建索引模式】,搜刮【nginx_kafka-*】单击 【下一步】按钮创建,选择【@timestamp】 按钮,【创建索引模式】;可检察图表信息及日志信息。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |