初识kafka

前一节介绍了消息队列的基本知识,最后我们提出了消息队列的优缺点。
当公司需要维护多个消息队列,例日志、跟踪、指标信息。这些消息队列有很多重复的地方,每个系统又有缺陷和不足。而且接下来会有更多的地方使用到消息队列,所以我们需要一个单一的集中式系统来管理这些消息队列,kafka就登场了。
在这一次主要介绍kafka中的基础知识:

  1. 消息和批次
    kafka中的数据单元被称为消息,就比如数据库中的一条记录,消息可以有一个可选的元数据就是键(描述数据的数据被称为元数据,一个消息是一条数据,键就是元数据)
    键和消息都是字节数组,当想要把消息以可控的方式写入某个分区的时候就会用到键(分区后面会解释),像java中的HashMap,为键生成一个一致性的散列值,然后是用散列值对分区进行取模,最后决定选取那个分区。
    消息会分批次进行处理,批次就是一组消息,这些消息属于一个主题和分区,分批次传递可以减少网络上的开销,但是批次越大,单位时间内传输的时间就越长、单个消息传输时间就越长,所以要权衡利弊,批次中的消息会被压缩。
  2. 模式
    对于kafka来说消息就是不好理解的字节数组,所以通过特定的消息模式可以让消息内容更方便理解比如
    JSON、XML 它们都非常利于理解、好用,但是缺乏强类型的管理能力,不同版本的兼容性也不好
    Apache Avro 提供一种紧凑的序列化格式,模式和消息是分开的,当模式发生变化时不需要重新生成代码,也支持强类型的转化,兼容能力也比较好
  3. 主题和分区
    kafka中消息通过主题进行分类,比如数据库中的表,主题会被分为多个分区,消息以追加的方式写入分区如下图,分区可以分布在不同的服务器上也就是说一个主题可以跨多个服务器
  4. linux命令 kafka 查看groupid_消息队列

  5. 生产者消费者
    在发布与订阅系统中,生产者创建消息写入系统,一般情况下一个消息会被发布到一个主题上,生产者默认均匀的把消息分布到所有分区里。在某些情况也可以将消息指定到某个分区,通过消息键和分区器(后面会详细介绍)
    消费者读取消息,消费者可以订阅一个或多个主题,它们按顺序读取消息,通过偏移量来区分消息是否被读过,偏移量是一种元数据,一个不断递增的数值,创建消息时kafka会将其写入消息,在给定的分区里消息的偏移量都是唯一的,消费者会将最后读取的消息偏移量放在zookeeper或者kafka上保证关闭后重新读取状态不会丢失。
    消费者时消费者群组中的一部分,可以多个或一个消费者读取一个主题上的内容,群组来保证每个分区每次只能被一个消费者所读取。
  6. broker和集群
    broker是kafka的服务器,所做的任务如下图
  7. linux命令 kafka 查看groupid_kafka_02

  8. broker是集群的组成部分,每个集群都有一个broker来充当集群控制器的角色,控制器负责管理工作,将任务分配给broker和监控broker。集群中一个分区从属于一个broker被称为首领,分区可以将其分配给其他broker这时候会发生分区复制,这样可以保证当首领挂了以后,可以由其他broker接管,这时候需要相关的生产者消费者都重新链接到新的首领。
    保留消息策略:Kafka broker默认的保留策略是要么保留一段时间(如7天)要么保留消息到达一定的大小(如1GB)当消息达到这些上限的时候旧的消息就会被清理。
  9. 多集群
    多集群带来的好处:
    1、数据类型的分离
    2、安全需求隔离
    3、多数据中心(灾难恢复)
    如果是多集群就需要在多个集群之间复制消息,比如用户修改了信息我们需要在所有的数据中心中都看到他们的修改,但是kafka本身只支持单个集群内的消息复制
    kafka提供了一个工具MirrorMarker它可以实现集群与集群之间的消息复制,MirrorMarker中包含了一个生产者和消费者两者通过一个队列相连,消费者从一个集群读消息,生产者把消息发送到另一个集群中,如下图:
  10. linux命令 kafka 查看groupid_消息队列_03

  11. 两个本地集群被聚集到一个聚集集群中,然后MirrorMarker将其复制到其他数据中心