Skip to content

Latest commit

 

History

History
167 lines (106 loc) · 14.4 KB

Kafka并不难学!入门、进阶、商业实战.md

File metadata and controls

167 lines (106 loc) · 14.4 KB

Kafka并不难学!入门、进阶、商业实战

邓杰编著

第1章 了解消息队列和Kafka

在高并发的应用场景中,由于来不及同步处理请求,接收到的请求往往会发生阻塞。例如,大量的插入、更新请求同时到达数据库,这会导致行或表被锁住,最后会因为请求堆积过多而触发“连接数过多的异常”(Too Many Connections)错误。 因此,在高并发的应用场景中需要一个缓冲机制,而消息队列则可以很好地充当这样一个角色。消息队列通过异步处理请求来缓解系统的压力。

“消息队列”(Message Queue, MQ)从字面来理解,是一个队列,拥有先进先出(First Input First Output, FIFO)的特性。它主要用于不同进程或线程之间的通信,用来处理一系列的输入请求。 消息队列采用异步通信机制。即,消息的发送者和接收者无须同时与消息队列进行数据交互,消息会一直保存在队列中,直至被接收者读取。每一条消息记录都包含详细的数据说明,包括数据产生的时间、数据类型、特定的输入参数。

在实际的应用中,消息队列主要有以下作用。 · 应用解耦:多个应用可通过消息队列对相同的消息进行处理,应用之间相互独立,互不影响; · 异步处理:相比于串行和并行处理,异步处理可以减少处理的时间; · 数据限流:流量高峰期,可通过消息队列来控制流量,避免流量过大而引起应用系统崩溃; · 消息通信:实现点对点消息队列或聊天室等。

· 用户请求写数据到消息队列时,不与应用业务服务直接接触,中间存在一次缓冲。这极大地减少了应用服务处理用户请求的压力。 · 可以设置队列的长度,用户请求遵循FIFO原则。后来的用户请求处于队列之外时,是无法秒杀到商品的,这些请求会直接被舍弃,返给用户“商品已售完”的结果。

Kafka是一个分布式实时数据流平台,可独立部署在单台服务器上,也可部署在多台服务器上构成集群。它提供了发布与订阅功能。用户可以发送数据到Kafka集群中,也可以从Kafka集群中读取数据。

例如,通过获取消息记录主键(Key)的哈希值,然后使用该值对分区数取模运算,得到分区索引。

消费者(Consumer)从Kafka集群指定的主题(Topic)中读取消息记录。 在读取主题数据时,需要设置消费组名(GroupId)。如果不设置,则Kafka消费者会默认生成一个消费组名称。

每一个主题(Topic)中可以有一个或者多个分区(Partition)。在Kafka系统的设计思想中,分区是基于物理层面上的,不同的分区对应着不同的数据文件。 Kafka通过分区(Partition)来支持物理层面上的并发读写,以提高Kafka集群的吞吐量。

每个分区(Partition)内部的消息记录是有序的,每个消息都有一个连续的偏移量序号(Offset)。 一个分区只对应一个代理节点(Broker),一个代理节点可以管理多个分区。

在Kafka系统中,每个主题(Topic)在创建时会要求指定它的副本数,默认是1。通过副本(Replication)机制来保证Kafka分布式集群数据的高可用性。

被实际写入到Kafka集群并且可以被消费者应用程序读取的数据,被称为记录(Record)。每条记录包含一个键(Key)、值(Value)和时间戳(Timestamp)。

· 生产者(Producer)负责写入消息数据。将审计日志、服务日志、数据库、移动App日志,以及其他类型的日志主动推送到Kafka集群进行存储。

· 消费者(Consumer)负责读取消息数据。例如,通过Hadoop的应用接口、Spark的应用接口、Storm的应用接口、ElasticSearch的应用接口,以及其他自定义服务的应用接口,主动拉取Kafka集群中的消息数据。

Kafka是一个分布式系统,用Zookeeper来管理、协调Kafka集群的各个代理(Broker)节点。当Kafka集群中新添加了一个代理节点,或者某一台代理节点出现故障时,Zookeeper服务将会通知生产者应用程序和消费者应用程序去其他的正常代理节点读写。

活动流数据,是指浏览器访问记录、页面搜索记录、查看网页详细记录等站点内容。 运营数据,是指服务器的基本指标,例如CPU、磁盘I/O、网络、内存等。

系统还需具有支持分区、分布式、能实时处理消息等特点,并能在机器出现故障时保证数据不丢失。

从Kafka 0.8.2起,生产者(Producer)写数据时不再区分同步和异步,所有的操作请求均以异步的方式发送,这样大大地提高了客户端写数据的效率。 异步方式将数据批量的发送到Kafka不同的代理(Broker)节点,因此也减少了Kafka服务端的资源开销。这种方式在与Kafka系统进行网络通信时,能够有效地减少等待时间。

在Kafka 0.9版本以后,系统添加了安全机制,可以通过SSL和SASL安全机制来进行身份确认。生产者(Producer)和消费者(Consumer)必须进行身份验证,才能操作Kafka集群。 另外,Kafka代理(Broker)与Zookeeper集群进行连接时也需要身份验证。在设置了安全机制的Kafka集群中,数据均采用加密方式进行传输。由于加密方式依赖操作系统的CPU和Java虚拟机(Java Virtual Machine, JVM),所以,在采用加密方式传输数据时性能可能会降低。

Kafka 0.10及以后版本中添加了机架感知功能。引入机架感知的概念,能够显著提升Kafka集群的可用性。 如果所有备份数据都在一个单个机架上,一旦这个机架出现故障,则导致所有的备份数据变得不可用,这样是很危险的。所以,需要使用机架感知来让Kafka的备份数据分布到不同的机架上,以保证数据的高可用性。

Kafka数据流(Streams)实现了基于时间事件的实时流处理,用户可以使用时间戳来跟踪和查找消息记录。

第2章 安装及配置Kafka

Kafka的源代码是利用Scala语言编写的,它需要运行在Java虚拟机(Java Virtual Machine, JVM)上。因此,在安装Kafka之前需要先安装JDK。

Kafka是一个分布式消息中间件系统,它依赖ZooKeeper管理和协调Kafka集群的各个代理(Broker)节点。因此,在安装Kafka集群之前需要先安装ZooKeeper集群。

(1)卸载CentOS操作系统自带JDK环境。如果不存在自带的JDK环境,则可跳过此步骤。 

查找Java安装依赖库

[hadoop@dn1~]$ rpm -qa | grep java

卸载Java依赖库

[hadoop@dn1~]$ yum -y remove java*

Zookeeper是一个分布式应用程序协调服务系统,是大数据生态圈的重要组件。Kafka、Hadoop、HBase等系统均依赖Zookeeper来提供一致性服务。 Zookeeper是将复杂且容易出错的核心服务进行封装,然后对外提供简单易用、高效稳定的接口。

在Kafka系统中,核心组件的元数据信息均存储在Zookeeper系统中。这些元数据信息具体包含:控制器选举次数、代理节点和主题、配置、管理员操作、控制器。它们在Zookeeper系统中的分布如图2-30所示。

第3章 Kafka的基本操作

Kafka系统中的数据最终还需要保存到磁盘进行持久化。为了区分不同的业务数据,数据库会有命名空间(即:数据库名),每个命名空间下又有若干个表。 在Kafka系统中,为了区分业务数据,设计了“主题”这个概念。将不同类型的消息数据按一定的规则进行分类,最后将相同类型的业务数据存储到同一个主题中,

2.分区的作用 从性能方面来说,如果主题内消息数据只存储在一个代理节点,那该节点将很快会成为Kafka集群的瓶颈,无法实现水平扩展。因此,把主题内的消息数据分布到整个Kafka集群就是一件很重要的事情,而分区的引入则很好地解决了水平扩展的问题。 主题上的每个分区可以被认为是一个无限长度的数组,新来的消息数据可以有序地追加到该数组上。从物理意义上讲,每个分区对应一个文件夹。一个Kafka代理节点上可以存放多个分区。

在大数据场景中,企业的业务数据是非常宝贵的,数据存储的要求非常严格,不允许有数据丢失的情况出现。因此,需要有一种机制来保证数据的高可用。 4.副本的作用 为了保证消息数据的高可用性,主题中引入副本机制也是很有必要的。一个主题拥有多个副本,可以很好地避免数据丢失的风险。

第4章 将消息数据写入Kafka系统——生产

假如生产者客户端与Kafka集群节点间存在网络延时(100ms),此时发送10条消息记录,则延时将达到1s。而大数据场景下有着海量的消息记录,发送的消息记录是远不止10条,延时将非常严重。 大数据场景下,如果采用异步模式发送消息记录,几乎没有任何耗时,通过回调函数可以知道消息发送的结果。

例如,一个业务主题(ip_login)有6个分区。生产者客户端写入一条消息记录时,消息记录会先写入某个缓冲区,生产者客户端直接得到结果(这时,缓冲区里的数据并没有写到Kafka代理节点中主题的某个分区)。之后,缓冲区中的数据会通过异步模式发送到Kafka代理节点中主题的某个分区中。具体数据写入流程如图4-7所示。

消息记录提交给send()方法后,实际上该消息记录被放入一个缓冲区的发送队列,然后通过后台线程将其从缓冲区队列中取出并进行发送;发送成功后会触发send方法的回调函数——Callback。

第5章 从Kafka系统中读取消息数据——消费

消费者客户端可以通过增加消费者组中消费者程序的个数来进行水平扩展,提升读取主题消息数据的能力。因此,在Kafka系统生产环境中,建议在创建主题时给主题分配多个分区,这样可以提高读取的性能。

在分布式环境下,有序列化和反序列化两个概念。 · 序列化:将对象转换为字节序列,然后在网络上传输或者存储在文件中; · 反序列化:将网络或者文件中读取的字节序列数据恢复成对象。

在传统企业应用中,不同的组件分布在不同的系统和网络中,通过序列化协议实现对象的传输,保证了两个组件之间的通信安全。经过序列化后的消息数据会转换成二进制。

Kafka系统中提供了反序列化的接口,以方便用户调用。用户可以通过自定义反序列化的方式来还原对象。

第6章 存储及管理数据

稀疏存储索引避免了索引文件占用过多的磁盘空间。

由于UDP协议是一种不可靠的传输协议,所以Kafka系统采用TCP协议作为服务间的通信协议。

这部分数据类型包含:int8、int16、int32和int64。对应到Java语言中,它们分别是byte、short、int和long。 2.可变数据类型 可变数据类型对应到Java语言中,常见的有Map、List等。 3.数组 数组对应到Java语言中,常见的有int[]、String[]等。

第7章 Kafka安全机制

基于这类场景考虑,在0.9版本之后,Kafka系统新增了两种安全机制——身份验证和权限控制,来确保存储数据的安全性。

因此,在Kafka系统中,还有另外一种安全机制——权限控制。 权限控制是指,对客户端操作(如读、写、删、改等)Kafka集群主题进行权限控制。

安装和配置SSL协议的步骤较多,大致步骤如下: (1)给每台代理节点创建一个临时密钥库; (2)创建私有证书CA; (3)给证书进行签名,其内容包含导出证书和签名、导入CA和证书到密钥库; (4)配置服务端和客户端。

Secure Sockets Layer简称SSL,它主要为网络通信提供安全保障。SSL协议利用数据加密技术,确保数据在网络中传输数据不会被截取和窃听。

SSL协议介于传输层协议和应用层协议之间,分为两层。 · 记录协议:建立在可靠的传输层协议之上,提供数据封装、压缩、加密等功能; · 握手协议:建立在记录协议之上,用于在实际传输数据之前,确认通信双方的身份。

第8章 用Kafka连接器建立数据管道

把Kafka系统作为一个中间传输介质。 例如,为了把海量日志数据存储到ElasticSearch中,可以先把这些日志数据传输到Kafka系统中,然后再从Kafka系统中将这些数据移出到ElasticSearch中进行存储。

Kafka系统在解除耦合的能力、系统安全性、数据处理效率等方面均表现不俗,因而,使用Kafka连接器来构建数据管道是一个最佳的选择。

第10章 监控与测试

通过Kafka的监控工具——Kafka Eagle系统,来减少日常的工作量。

3.查看Zookeeper性能指标历史曲线图 由于Kafka系统元数据信息会存储在Zookeeper系统中,Kafka集群的性能很大程度上依赖于Zookeeper集群的性能,所以监控Zookeeper集群的性能指标也是很有必要的。

第11章 Kafka与ELK套件的整合

LogStash是一个收集实时流式数据的收集引擎,也是一个接收、处理、转发日志数据的工具。它支持系统日志、Web日志、应用程序日志等类型的日志。

在一个海量数据应用场景中,数据采集的Agent是有很多个的,如果直接将采集的数据写入ElasticSearch进行存储,则ElasticSearch需要同时处理所有Agent上报的数据,这会给ElasticSearch集群服务端造成很大的压力。 因此,需要有一个缓冲区来缓解ElasticSearch集群服务端的压力。这里使用Kafka来做数据分流:将Agent上报的数据存储到消息队列,然后通过消费Kafka中的主题消息数据,并将消费后的消息数据存储到ElasticSearch集群中。这样不仅能缓解ElasticSearch集群服务端的压力,还能提高整个系统的性能、稳定性、扩展性。

第12章 Kafka与Spark实时计算引擎的整合

Spark是一种基于内存的分布式计算引擎,其核心为弹性分布式数据集(Resilient Distributed Datasets, RDD),它支持多种数据来源,拥有容错机制,支持并行操作。 Spark是专门为海量数据处理而设计的快速且通用的计算引擎,支持多种编程语言(如Java、Scala、Python等)。