Kafka:

  1. 定位:分布式的消息队列系统,同时提供数据分布式缓存功能(默认7天)削峰,解耦(高内聚,低耦合)
  2. 消息持久化到磁盘,达到O(1)访问速度,预读和后写,对磁盘的顺序访问(比内存随机访问还要快)
  3. Streaming(分布式的实时计算框架)
    Kafka目标成为队列平台
  4. 基本组件:
    Broker:每一台机器是一个Broker
    Producer:日志消息生产者,主要写数据
    Consumer:日志消息消费者,主要读数据
    Topic:是虚拟概念,不同的consumer去指定的topic去读数据,不同producer可以往不同的topic去写(发布消息)
    Partition:是实际概念,文件夹,是在Topic的基础上做了进一步分层
    message:offset,key.value,timestamp
  5. Partition功能:负载均衡,需要保证消息的顺序性
    顺序性的保证:订阅消息是从头往后读取的,写消息是尾部追加,所以整体消息是顺序的
    如果有多个partiton存在,可能会出现顺序不一致的情况,原因:每个Partition相互独立
  6. Topic:逻辑概念
    一个或多个Partition组成一个Topic
  7. Partition以文件夹的形式存在
  8. Partition有两部分组成:
    (1)index log:(存储索引信息,快速定位segment文件)
    (2)message log:(真实数据的所在)
  9. 参考HDFS多副本的方式来完成数据高可用
    如果设置一个Topic,假设这个Topic有5个Partition,3个replication,此时该topic共有15个partition
    Kafka分配replication的算法:
    假设:
    将第i个Partition分配到(i % N)个Broker上 10%3 取模(取余)
    将第i个Partition的第j个replication分配到( (i+j) % N)个Broker上
    虽然Partition里面有多个replication
    如果里面有M个replication,其中有一个是Leader,其他M-1个follower
  10. zookeeper保证系统的可用性,zk中会保存一些meta信息(topic)
  11. 物理上,不同的topic的消息肯定是分开存储的
  12. 偏移量——offset:用来定位数据读取的位置
  13. kafka内部最基本的消息单位——message
  14. 传输最大消息message的size不能超过1M,可以通过配置来修改
  15. Consumer Group
  16. 传输效率:zero-copy
    0拷贝:减少Kernel和User模式上下文(context)的切换
    直接把disk上的data传输给socket(套接字),而不是通过应用程序来传输
  17. Kafka的消息是无状态的,消费者必须自己维护已消费的状态信息(offset)
    减轻Kafka的实现难度
  18. Kafka内部有一个时间策略:SLA——消息保留策略(消息超过一定时间后,会自动删除)
  19. 交付保证:
    at least once:至少一次(会有重复、但不丢失)
    at most once:最多发送一次(不重复、但可能丢失)
    exactly once:只有一次(最理想),目前不支持,只能靠客户端维护(去重操作)
  20. Kafka集群里面,topic内部由多个partition(包含多个replication),达到高可用(HA)的目的:
    日志副本:保证可靠性
    角色:主、从
    ISR:是一个集合,只有在集合中的follower,才有机会被选为leader
    如何让leader知道follower是否成功接收数据(心跳,ack)
    如果心跳正常,代表节点活着
  21. 怎么算“活着”
    (1)心跳
    (2)如果follower能够紧随leader的更新,不至于被落的太远
    如果一旦挂掉,从ISR集合把该节点删除掉