Kafka(一)
Apache Kafka是一个基于 zookeeper 协调的,开源的,分布式流式处理消息中间件。用于高性能数据管道(data pipelines)、流式处理(streaming analytics)、数据集成(data integration)和任务型(mission-critical)应用程序
简介
一、什么是流式事件处理(event streaming)?
1. 打个比方
如果软件比作人体的话,EventStream 就是人体的中枢神经系统。
2. 从技术的角度来说
-
always-on 的技术基础
-
从技术角度上讲,事件流包括:
-
实时地从事件源获取数据
- 包括:数据库、传感器、移动设备、云服务和软件应用程序
-
持久化
-
实时回溯、处理和响应事件流
-
路由到不同的目的地
-
3. 总结
事件流可以确保数据的连续流动和整理(interpretation of data),从而使正确的信息在正确的时间传输到正确的位置
二、流式事件处理(event streaming)能用来干嘛?
- 实时处理:支付和金融交易,如在证券交易所、银行和保险中
- 实时跟踪:和监控汽车、卡车、车队和货物,如物流和汽车行业
- 物联网:从物联网设备或其他设备(如工厂和风电场)持续捕获和分析传感器数据
- 移动应用:收集并立即响应客户互动和订单,如零售、酒店和旅游业以及移动应用程序
- 紧急情况:监控住院患者,预测病情变化,确保紧急情况下及时治疗
- 数据集成:连接、存储并提供公司不同部门产生的数据
- 事件驱动:作为数据平台、事件驱动架构和微服务的基础
三、Kafka 为嘛叫平台?和流式事件处理有啥区别?
1. Kafka 之所以叫平台,因为其 三大关键功能
端到端事件流
-
发布(写入)和订阅(读取)事件流
- 包括从其他系统连续导入/导出数据
-
持久可靠地存储事件流
- 支持长期存储和短期存储
-
响应事件流 or 回顾性处理
2. Kafka 的分布式特性
所有这些功能都是以分布式、高度可扩展、弹性、容错和安全的方式提供的。Kafka 可以部署在裸机硬件、虚拟机和容器上,也可以部署在本地和云中
四、Kafka 的基础架构
服务端(分布式系统) ---------- TCP ---------- 客户端
1. 服务端
- 可以单机或集群运行
- 可以跨越多个数据中心或云区域
- 一些服务端做为存储层,称为 Broker
- 一些服务端通过 Kafka Connect 连接 数据库、其他 Kafka 集群
- Kafka 具有高度的可扩展性和容错性
2. 客户端
-
客户端的应用程序和微服务
- 以并行、大规模、容错的方式读取、写入和处理事件流
- 现网络问题或机器故障容错
-
Kafka 官方和社区提供 Java、ScalaGo、Python、C/C++ 等客户端
五、核心概念
Kafka 高可扩展性关键设计:producers 和 consumers 完全解耦,彼此不可知
- 栗如:producers 不会因为 consumers 而阻塞
Kafka 保证 event 处理且仅处理一次(process events exactly-once)
1. 事件 event
-
也称为记录或消息
-
Kafka 读写数据的形式
结构 栗子 键 Alice 值 Made a payment of $200 to Bob 时间戳 Jun. 25, 2020 at 2:06 p.m 元数据头 none
2. 生产者 producers
- 向 Kafka 发布(写入)event 的应用程序客户端
3. 消费者 consumers
- 订阅(读取和处理)这些事件的应用程序
4. 主题 topic
-
event 属于 topic,并持久地存储在 topic 中
-
topic 类似于文件系统中的一个文件夹,event 就是该文件夹中的文件
- 栗如:payments 付款 topic
-
topic 一般有 0 到 n 个 producers 和 0 到 n 个 consumers
-
topic 中的 event 在使用后不会被删除,这点和传统的消息系统不同
- 您可以配置 topic 中的 event 保留多长时间
-
kafka 的性能和数据量的大小是无关的
- 零拷贝的文件系统,O(1) 的基于偏移量的读取复杂度
5. 分区 partition
-
通俗的理解
-
类似存在许多“桶”
- 这些桶分割 topic 的文件
- 且分散到不同的 kafka broker 中
-
这种分割对于 kafka 的 scalability 可扩展性非常重要
- 它允许客户端应用程序同时从多个 broker 读取和写入数据
-
-
当一个新 event 发布到 topic 时,它实际上会附加到该 topic 的一个分区(partition)中
- 具有相同 key 的 event 被写到同一个分区(partition)
- kafka 保证同一个分区(partition)内的 强一致性
-
分区模型
| Topic | 存储层 | 客户端 | 说明 |
|---|---|---|---|
| topic1 | P1 | producers1 写入 | topic1 分了 4 个分区 |
| topic1 | P2 | 2 个 producers 彼此完全独立 | |
| topic1 | P3 | producers1 写入 | events 被写入到 partition 中 |
| topic1 | P3 | producers2 写入 | event.key 相同的消息将分配到同一个 partition |
| topic1 | P4 | producers2 写入 | 同一个 partition 可以被不同的 producers 写入 |
六、副本集 replicated
为了使数据具有容错性和高可用性,每个 topic 可以有副本集( replicated)(冗余存储)
- 副本集 replicated 可以跨地区跨数据中心
- 副本集 replicated 通过数据冗余方法,提供容错特性
- 副本集 replicated 支持单节点停机维护(热更)
- 副本集 replicated 我们一般配置 3 个
- replicated 以 topic-partition 为单位进行