最近公司项目中做了一个两个oracle数据库数据进行数据实时同步的功能,由于数据量和环境的因素,开发人员采用了kafka做为消息中间件来转发数据,笔者就进行了kafka的学习,记录了下面的文档,望大家多多指教,共同学习进步。
一、 Kafka介绍
Kafka是由Java和Scala编写的是一个分布式、高吞吐量、分区的、多副本的、多订阅者,基于zookeeper协调的分布式发布订阅消息系统(也可以当做MQ系统)
1、分布式:所有的producer、broker和consumer都会有多个,均匀分布并支持通过Kafka服务器和消费机集群来分区消息
2、高吞吐量:Kafka 每秒可以生产约 25 万消息(50 MB),每秒处理 55 万消息(110 MB)。
3、分区:Kafka中采用分区的设计有两个目的:一是可以处理更多的消息,而不受单体服务器的限制,Topic拥有多个分区,意味着它可以不受限制地处理更多数据;二是分区可以作为并行处理的单元。
二、 Kafka优点
1、解耦:允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。
2、冗余:许多消息队列所采用的"插入-获取-删除"范式中,在把一个消息从队列中删除之前
3、扩展性:因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可
4、灵活性 & 峰值处理能力:在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。
5、可恢复性:系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理
6、顺序保证:在大多使用场景下,数据处理的顺序都很重要。大部分消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理。(Kafka 保证一个 Partition 内的消息的有序性)
7、缓冲:有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况
8、异步通信:很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们
三、 主要应用场景
1、日志收集:一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer;
2、消息系统:解耦生产者和消费者、缓存消息等;
3、用户活动跟踪:kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后消费者通过订阅这些topic来做实时的监控分析,亦可保存到数据库;
4、 运营指标:kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告;
5、 流式处理:比如spark streaming和storm。
四、 名词介绍
1、Broker : Kafka 集群包含一个或多个服务器,服务器节点称为broker。broker存储topic的数据
2、Topic : 每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。
3、Partition:topic中的数据分割为一个或多个partition。每个topic至少有一个partition。每个partition中的数据使用多个segment文件存储。partition中的数据是有序的,从而保证消费是有顺序的。关于partition的分配,还有leader的选举,总得有个执行者。在kafka中,这个执行者就叫controller。kafka使用zookeeper在broker中选出一个controller,用于partition分配和leader选举。
4、Producer:生产者即数据的发布者,该角色将消息发布到Kafka的topic中。broker接收到生产者发送的消息后,broker将该消息追加到当前用于追加数据的segment文件中。生产者发送的消息,存储到一个partition中,生产者也可以指定数据存储的partition
5、Consumer: 消费者可以从broker中读取数据。消费者可以消费多个topic中的数据
6、Consumer group:每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属于默认的group)
7、Leader: 每个partition有多个副本,其中有且仅有一个作为Leader,Leader是当前负责数据的读写的partition。
8、**Follower:**作为Leader的追随者,所有写请求都通过Leader路由,数据变更会广播给所有Follower,Follower与Leader保持数据同步。如果Leader失效,则从Follower中选举出一个新的Leader。当Follower与Leader挂掉、卡住或者同步太慢,leader会把这个follower从“in sync replicas”(ISR)列表中删除,重新创建一个Follower
其实kafka这种结构我们可以把他想象成一共公司的组织架构,最上层的肯定是指某某公司,我们这儿用麻花疼的TX来举例,TX公司那么大,肯定是要分部门来进行管理,各个部门负责各自专业的事情,例如研发中心,产品中心,市场部,售后部等等,我们把每一个部门都当做一个Broker,由多个服务器组成的集群。那么问题又来了,topic又代表着什么呢。很形象地解释,例如研发中心的人,有人玩java,有人玩python,有人玩.net,有人玩前端等等,每个专业搞的项目可能不一样,所以他们就又分为多个topic主题,来分担研发中心各个项目的压力。最后java人群又会分成小组进行工作,一个小组可当成一个Partition分区,这个小组中的组长就是分区的Leader,其他组员可以当做followers,负责这个小组的需求进入和功能产出(分区数据写入和读取),如果小组长有事不在或者突然离职,则此小组会选举出followers作为新的Leader进行生产作业。很形象地说明了代码来源于生活。
五、 关系图
一个Topic可以认为是一类消息,每个topic将被分成多个partition(区),每个partition在存储层面是append log文件。任何发布到此partition的消息都会被直接追加到log文件的尾部,每条消息在文件中的位置称为offset(偏移量),offset为一个long型数字,它是唯一标记一条消息。它唯一的标记一条消息。kafka并没有提供其他额外的索引机制来存储offset,因为在kafka中几乎不允许对消息进行“随机读写”。
Partition 消息写入
生产者--kafka--消费者
kafka消费规则图
ZooKeeper 的作用