搭建kafka集群
kafka_2.13-2.7.1复制3份,修改server.properties配置文件。zookeeper.connect未zk集群地址,broker.id分别为1,2,3。端口为9092-9094。
broker.id=3
host.name=127.0.0.1
port=9094
log.dirs=E:\kafka\logs\log3
zookeeper.connect=localhost:2181,localhost:2182,localhost:2183
分别通过 cmd 进入每个 Kafka 实例,输入命令启动:
bin\windows\kafka-server-start.bat .\config\server.properties
集群搭建完成!
如果要让非本机访问:host.name要配置本机机器ip,eg:192.168.217.128
分区策略;
1、轮询策略。2、随机策略 3、按键保存策略
默认策略:没指定key的时候就是轮询策略,存在KEY就按键保存策略了。
自定义分区策略:public class MyParatitioner implements Partitioner
#创建topic my_part_test 3个副本 5个分区
#副本数量不能大于broke数量,创建主题是分区数量最好为代理数量的整数倍。
#一个分区在磁盘上对应一个文件夹
kafka-topics --create --zookeeper localhost:2181 --replication-factor 3 --partitions 5 --topic my_part_test
- acks=0,生产者无需等待代理返回确认,就是可以连续发送,但是无法保证消息是否被代理收到。
- acks=1,生产者需要等待Leader副本以及成功写入日志。这种方式降级了消息丢失的可能性,但是也只是Leader写入日志而不管Follower是否写入。
- acks=-1,Leader副本和所有Follower都写入日志才会向生产者发送确认信息。
假如每秒钟需要从主题写入和读取1GB数据,而消费者1秒钟最多处理50MB的数据,那么这个时候就可以设置20-25个分区
消费者消费记录的offset会存储到:__consumer_offsets队列第N个分区中。N计算规则如下:
//defaultConsumerGroup 为消费组ID
int hashCode = Math.abs("defaultConsumerGroup".hashCode());
int partition = hashCode % 50;
kafka如何保证消息有序
方案一,kafka topic 只设置一个partition分区 。kafka默认保证同一个partition分区内的消息是有序的,则可以设置topic只使用一个分区,这样消息就是全局有序,缺点是只能被consumer group里的一个消费者消费,降低了性能,不适用高并发的情况
方案二,producer将消息发送到指定partition分区,既然kafka默认保证同一个partition分区内的消息是有序的,则producer可以在发送消息时可以指定需要保证顺序的几条消息发送到同一个分区,这样消费者消费时,消息就是有序。
producer发送消息时具体到topic的哪一个partition分区,提供了三种方式
1)指定分区
2)不指定分区,有指定key 则根据key的hash值与分区数进行运算后确定发送到哪个partition分区
3)不指定分区,不指定key,则轮询各分区发送