A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

【郑州校区】kafka笔记之Apache Kafka原理

6.1Apache Kafka原理-分片与副本机制
bin/kafka-topics.sh --create --zookeeper zk01:2181 --replication-factor 1 --partitions 1 --topic order
分片:solrcloud中有提及到。
                当数据量非常大的时候,一个服务器存放不了,就将数据分成两个或者多个部分,存放在多台服务器上。每个服务器上的数据,叫做一个分片。
副本:solrcloud中有提及到。
                当数据只保存一份的时候,有丢失的风险。为了更好的容错和容灾,将数据拷贝几份,保存到不同的机器上。
6.2Apache Kafka原理-消息不丢失机制6.2.1、生产者端消息不丢失
1) 消息生产分为同步模式和异步模式
2) 消息确认分为三个状态
a) 0:生产者只负责发送数据
b) 1:某个partition的leader收到数据给出响应
c) -1:某个partition的所有副本都收到数据后给出响应
3) 在同步模式下
a) 生产者等待10S,如果broker没有给出ack响应,就认为失败。
b) 生产者重试3次,如果还没有响应,就报错。
4) 在异步模式下
a) 先将数据保存在生产者端的buffer中。Buffer大小是2万条。
b) 满足数据阈值或者数量阈值其中的一个条件就可以发送数据。
c) 发送一批数据的大小是500条。
如果broker迟迟不给ack而buffer又满了
开发者可以设置是否直接清空buffer中的数据
6.2.2Borker端消息不丢失
broker端的消息不丢失,其实就是用partition副本机制来保证。
Producer  ack  -1. 能够保证所有的副本都同步好了数据。其中一台机器挂了,并不影像数据的完整性。
6.2.3、消费者端消息不丢失
只要记录offset值,消费者端不会存在消息不丢失的可能。只会重复消费。
6.3Apache Kafka原理-消息存储及查询机制6.3.1、文件存储机制
segment段中有两个核心的文件一个是log,一个是index。 当log文件等于1G时,新的会写入到下一个segment中。
通过下图中的数据,可以看到一个segment段差不多会存储70万条数据。
6.3.2、文件查询机制
6.4Apache Kafka原理-生产者数据分发策略
kafka在数据生产的时候,有一个数据分发策略。默认的情况使用DefaultPartitioner.class类。
这个类中就定义数据分发的策略。
1) 如果是用户制定了partition,生产就不会调用DefaultPartitioner.partition()方法
2) 当用户指定key,使用hash算法。如果key一直不变,同一个key算出来的hash值是个固定值。如果是固定值,这种hash取模就没有意义。
        Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions
3) 当用既没有指定partition也没有key。
数据分发策略的时候,可以指定数据发往哪个partition。
ProducerRecord 的构造参数中有partition的时候就可以发送到对应partition上
/** * Creates a record to be sent to a specified topic and partition * * @param topic The topic the record will be appended to * @param partition The partition to which the record should be sent * @param key The key that will be included in the record * @param value The record contents */public ProducerRecord(String topic, Integer partition, K key, V value) {
    this(topic, partition, null, key, value, null);
}
如果生产者没有指定partition,但是发送消息中有key,就key的hash值。
/** * Create a record to be sent to Kafka * * @param topic The topic the record will be appended to * @param key The key that will be included in the record * @param value The record contents */public ProducerRecord(String topic, K key, V value) {
    this(topic, null, null, key, value, null);
}
既没有指定partition,也没有key的情况下如何发送数据。
使用轮询的方式发送数据。
/** * Create a record with no key * * @param topic The topic this record should be sent to * @param value The record contents */public ProducerRecord(String topic, V value) {
    this(topic, null, null, null, value, null);
}
6.5Apache Kafka原理-消费者的负载均衡机制
一个partition只能被一个组中的成员消费。
所以如果消费组中有多于partition数量的消费者,那么一定会有消费者无法消费数据。
传智播客·黑马程序员郑州校区地址
河南省郑州市 高新区长椿路11号大学科技园(西区)东门8号楼三层
联系电话 0371-56061160/61/62
来校路线  地铁一号线梧桐街站A口出

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马