前言
Kafka 起初是由LinkedIn公司采用scala 语言开发的一个多分区、多副本且基于zookeeper 协调的分布式消息系统(已捐献给Apache基金会)。
高吞吐、可持久化、可水平扩展、支持流数据等多种特性
它所扮演的三大角色:
-
消息系统:kafka和传统的消息系统都具备:系统解耦、冗余存储、流量削峰、缓冲、异步通信、扩展性、可恢复性等
-
存储系统:kafka把消息持久化到磁盘,相比较其他基于内存存储的系统而言,有效地降低了数据丢失的风险。我们可以把Kafka作为长期的数据存储系统来使用,只需要把对应的数据保留策略设置为永久或启动主题的日志压缩功能。
-
流式处理平台:kafka 不仅仅为每个流行的流式处理框架提供了可靠的数据来源,还提供了一个完整的流式处理类库:窗口、连接、变换、聚合等各类操作
架构
若干个Producer、若干个broker、若干个consumer,以及一个Zoookeeper集群构成,zookeeper是Kafkaf用来负责集群元数据的管理和控制器的选举。producer将消息发送到broker,broker负责将消息存储,而consumer负责从broker订阅并消费消息。
broker 、主题
broker(服务代理节点),对于kafka而言,broker可以简单地看作一个独立的Kafka服务节点(Kafka服务实例)。大多数情况下也可以把broker看作是一台Kafka服务器(前提是一台服务器上部署一个Kafka实例);多个Broker组成一个Kafka集群。
kafka中消息以主题为单位进行归类,生产者负责将消息发送到特定的主题,而消费者负责订阅主题并消费消息。
主题是一个逻辑上的概念。它还可以细分为多个分区,一个分区只属于单个主题;同一主题下的不同分区包含的消息是不同的。分区在存储层面可以看作一个可追加的日志问文件,消息被写入到分区日志文件的时候会分配一个特定的偏移量。偏移量是消息在分区中的唯一标识。kafka 是通过它来保证消息在分区内的顺序性的。
分区规则
每一条消息被发送到broker之前,会根据分区规则选择存储到哪个具体的分区。
如果说,分区规则设置的合理的话,所有消息都可以均匀地分配到不同的分区中。
如果一个主题只对应一个文件,那么这个文件所在的机器的I/O将成为这个主题的性能瓶颈,分区就可以解决这个问题。
通过增加分区的数量可以实现水平扩展。
多副本
Kafka 为分区引入多副本机制,通过增加副本数量可以提升容灾能力。
同一个分区的不同副本中保存的是相同的消息
副本关系:一主多从,leader副本负责处理读写请求,follower副本只负责重新选举新的leader副本。
通过多副本机制实现了故障的自动转移(当Kafka集群中某个broker挂了仍然能保证服务可用)
原理:消息先发送到leader副本,然后follower副本才能从leader副本中拉取消息同步。(同步期间内follower 副本相对leader副本有一定程度的滞后)。
ISR方式
Kafka 复制机制既不是完全的同步复制,也不是单纯的异步复制。(同步复制要求所有工作的follower副本都复制完,这条消息才会被确认为已成功提交,这种方式极大影响了性能;异步复制方式下,follower副本异步地从leader副本复制数据,数据只要被leader副本写入就被认为已经成功提交,这种情况下,如果follow副本都没有复制完,leader副本宕机,则造成数据丢失。Kafka使用这种ISR方式则有效权衡了数据可靠性和性能之间的平衡)
服务端参数配置
这些参数都配置在server.properties文件中
- listeners:
broker监听客户端连接地址列表(客户端要连接broker的入口地址列表);配置格式为protocol://hostname:port;Kafka当前支持的协议类型有plaintext、ssl、sasl_ssl等;如果主机名是0.0.0.0 表示绑定所有的网卡。此参数关联的还有advertised.listeners 主要用于Iaas环境,使用advertised.listeners参数绑定公网ip提供外部客户端使用,而listeners参数绑定私网IP供broker间通信使用。
- message.max.bytes
该参数用来指定broker所能接收消息的最大值(默认976.6KB)。修改此参数,要考虑客户端参数max.request.size、消费端max.message.bytes参数的影响,为了避免因为修改message.max.bytes参数而引起的级联影响,建议在修改此参数之前考虑分拆消息的可行性。