您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 人事档案/员工关系 > Kafka知识总结PPT
Kafka-扮演角色•消息系统:Kafka和传统的消息系统(也称作消息中间件)都具备系统解耦、冗余存储、流量削峰、缓冲、异步通信、扩展性、可恢复性等功能。与此同时,Kafka还提供了大多数消息系统难以实现的消息顺序性保障及回溯消费的功能。•存储系统:Kafka把消息持久化到磁盘,相比于其他基于内存存储的系统而言,有效地降低了数据丢失的风险。也正是得益于Kafka的消息持久化功能和多副本机制,我们可以把Kafka作为长期的数据存储系统来使用,只需要把对应的数据保留策略设置为“永久”或启用主题的日志压缩功能即可。•流式处理平台:Kafka不仅为每个流行的流式处理框架提供了可靠的数据来源,还提供了一个完整的流式处理类库,比如窗口、连接、变换和聚合等各类操作。摘自《深入理解Kafka-核心涉及与实践原理》Kafka-高吞吐低延迟•Kafka的数据虽然是写入磁盘,但写入速度是很快的;因为每次都是写入操作系统的页缓存(pagecache),然后由操作系统自行决定什么时候把页缓存中的数据写入磁盘上;–操作系统缓存:页缓存是内存中分配的,Kafka不直接参与物理的I/O操作,而是交由操作系统来完成;–顺序读:Kafka采用追加方式,避免了磁盘的随机读写操作;–零拷贝:使用sendfile为代表的零拷贝技术加强网络间的数据传输效率;Kafka版本历史版本发布时间0.8.0ReleaseReleasedDecember3,20130.9.0.0ReleasedNovember23,20150.10.0.0ReleasedMay22,20160.11.0.0ReleasedJune28,20171.0.0ReleasedNovember1,20171.1.0ReleasedMarch28,20182.0.0ReleasedJuly30,20182.1.0ReleasedNov20,20182.2.0ReleasedMar22,20192.3.0ReleasedJun25,2019Kafka基础架构Kafka-生产者介绍•Producer:消息生产者,负责创建消息,然后投递到Kafka中;•Topic:Kafka中的消息以主题为单位进行归类,生产者负责将消息发送到特定的主题;•Partition:主题是一个逻辑概念,它还可以细分为多个分区,一个分区只属于单个主题;同一主题下的不同分区包含的消息是不同的;•拦截器(Interceptor),拦截器链:过滤消息,修改消息,统计等,这里特指生产者消息;•序列化器(Serializer,必须),StringSerializer,Protostuff,Thrift等,可自定义;•分区器(Partitioner),默认DefaultPartitioner,如果key不为null,那么默认的分区器会对key进行哈希(采用MurmurHash2算法,具备高运算性能及低碰撞率),最终根据得到的哈希值来计算分区号,拥有相同key的消息会被写入同一个分区。如果key为null,那么消息将会以轮询的方式发往主题内的各个可用分区;可自定义;•......Kafka-副本机制•副本机制(Replica):一主多从(主leader副follow,副本因子);•leader:负责处理读写请求;follower:负责与leader副本消息同步;当leader副本出现故障时,从follower副本中重新选举新的leader副本;•AR(AssignedReplicas),分区中的所有副本;ISR(In-SyncReplicas),所有与leader副本保持一定程度同步的副本(包括leader副本在内);OSR(Out-of-SyncReplicas),与leader副本同步滞后太多的副本;•ISR和OSR都是AR集合中的一个子集;并且AR=ISR+OSR,正常来说OSR应该是0;•如果follow副本落后太多,leader会将其从ISR移到OSR;同样,如果OSR达到条件,会被移动到ISR;•只有ISR的副本才能进行leader选举;Kafka-副本选举•KafkaLeader副本选举:并非多数投票机制,而是优先副本(PreferredReplica);•优先副本:AR集合中第一个存活的副本,并且该副本在ISR集合中;比如AR集合[0,1,2],那么优先副本就是0;理想情况下,优先副本应该就是该分区的leader副本,所以也可以称之为PreferredLeader;•auto.leader.rebalance.enable,自动执行优先副本的选举;Kafka-日志存储•Kafkatopic和partition都是逻辑上的概念,而分区副本则是对应一个Log(文件夹);每个Log对应一至多个LogSegment(文件),每个还可以细分为索引文件(.index)、日志存储文件(.log)和快照文件等;•.log(消息存储),.index(偏移量索引),.timeindex(时间戳索引),还会有其他的各种文件;•日志清理:(broker参数:log.cleanup.policy);粒度可到topic级别;日志删除(delete):默认策略,「基于时间」「基于大小」「基于偏移量」;日志压缩(compact):LogCompaction对于有相同key的不同value值,只保留最后一个版本;同时支持两种策略;Kafka-生产者-重要参数•acks:消息确认,生产者在什么情况下认为消息是成功写入;1,默认值,只要leader副本成功写入消息,就会响应成功,表示写入成功;可靠性与吞吐量折中方案;0,生产者发送消息之后不需要等待任何服务端的响应;吞吐量最大;-1或者all,需要等待ISR中的所有副本都成功写入消息之后才返回成功;可靠性最大;参数用途bootstrap.serversKafkaBroker集群地址key.serializer发送的Key序列化类value.serializer发送的value序列化类max.request.size生产者能发送消息的最大值,默认值1MBretries生产者重试次数,默认是0retry.backoff.ms设置两次重试之间的时间间隔,避免无效的频繁重试,默认100compression.type消息压缩方式,默认值为“none”表示消息不会压缩;该参数还可以配置为“gzip”“snappy”和“lz4”等;Kafka-消费者•ConsumerGroup:每个消费者一般都属于一个特定的消费组,当消息发布到主题后,只会被投递给订阅它的每个消费组中的一个消费者;•消费者可以不属于任一个消费组,不过这种不常见;这个Kafka集群有两台server,4个分区(p0-p3);有两个消费者组订阅了这个主题;消费组A有2个消费者,消费组B有4个消费者;按照Kafka默认的规则,最后的分配结果是消费组A中的每一个消费者分配到1个分区,消费组B中的每一个消费者分配到2个分区,两个消费组之间互不影响。每个消费者只能消费所分配到的分区中的消息。换言之,每一个分区只能被一个消费组中的一个消费者所消费。Kafka-消费线程•一般而言,分区是消费线程的最小划分单位;所以理论上来说,分区数和消费者数应该是1比1的;因为默认情况下一个分区只能被一个消费者消费,而一个消费者则可以消费多个分区;如果消费者个数大于分区个数的话,就会有消费者消费不到任何分区,处于空闲的状态。•主流且推荐的方式:一个消费线程消费一个分区;•非主流方式:多个消费线程同时消费同一个分区,需要通过assign()、seek()等方法自定义实现,这样可以打破原有的消费线程的个数不能超过分区数的限制,进一步提高了消费的能力。不过这种实现方式对于位移提交和顺序控制的处理就会变得非常复杂,实际应用中使用得极少;Kafka-分区重分配•rebalance:表示消费者组下的所有consumer通过某种规则来分配所订阅topic的每个分区。所分配的这个过程就称为rebalance;也可以说,将分区的所有权从一个消费者移到另一个消费者称为rebalance;•什么时候触发rebalance:消费者组加入/减少消费者;消费者组订阅topic分区发生变化;消费者组订阅主题数量发生变更;•如何进行rebalance:partition.assignment.strategy,分区分配策略,默认RangeAssignor;RangeAssignor,RoundRobinAssignor,StickyAssignor,自定义分区策略;Kafka-消费位移•offset:消费位移存储在Kafka内部的主题__consumer_offsets中,消费者在消费完消息之后需要提交offset;在Kafka中默认的消费位移的提交方式是自动提交,自动提交指的是定期提交,而不是每消费一条就提交一条;而手动提交可以细分为同步提交和异步提交;•enable.auto.commit,是否自动提交消费位移,默认为true;•auto.commit.interval.ms,自动提交消费位移时间间隔,默认是5s(enbale.auto.commit参数设置为true时才生效);•auto.offset.reset,该参数用于控制消息从哪里开始消费:–“earliest”:当分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费;–“latest”:当分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据;–“none”:topic各分区都存在已提交的offset时,从offset后开始消费;只要有一个分区不存在已提交的offset,则抛出异常;Kafka-消费者参数参数含义bootstrap.serversKafkaBroker集群地址group.id消费者组名称client.id消费者客户端的id,如果不设置,KafkaConsumer会自动生成一个字符串“consumer-”与数字的拼接key.deserializer和value.deserializerkey和value对应的反序列化器fetch.min.bytes拉取数据时,一次拉取的最小数据量,默认为1Bfetch.max.bytes拉取数据时,一次拉取的最大数据量,默认为50MBfetch.max.wait.msKafka等待时间,如果Kafka中没有足够多的消息而满足不了fetch.min.bytes参数的要求,那么最终会等待500msmax.poll.records一次拉取请求中拉取的最大消息数,默认值为500(条)Kafka-小问题•(1)Kafka能否保证消息有序?•Kafka的分区在存储层面可以看作是一个可追加的日志(Log)文件,消息在被追加到分区日志文件的时候都会有一个特定的偏移量(offset),Kafka通过它来保证消息在分区内的顺序性,不过offset只针对分区,也就是说,Kafka保证的是分区有序而不是主题有序。因此,如果要想消息有序,可以使用单分区,但这也就相当于抛弃了Kafka主要的功能。•(2)和MQ不同的是,kafka消息消费后可以保留;Kafka集群可以选择保留所有消息—无论他们是否已被消费—并通过一个可配置的参数来控制。举个例子,如果保留策略设置为2天,一条消息发布后两天内,可以随时被消费,两天过后这条记录会被抛弃并释放磁盘空间。Kafka的性能和数据大小无关,所以长时间存储数据没有什么问题。•(3)Kafka不支持读写分离–读写分离应用场景:读多写少;–Kafka主要用于消息中间价,而非数据存储;Kafka命令行工具脚本含义kafka-configs.sh用于配置管理kafka-console-consumer.sh用于消息生产kafka-console-producer.sh用于消息消费kafka-topics.sh用于主题管理kafka-server-start.sh用于Ka
本文标题:Kafka知识总结PPT
链接地址:https://www.777doc.com/doc-7310846 .html