目录
- 1. 认识kafka
- 1. 搭建单机kafka
- 2. 单机基准测试
- 3. 搭建 kafka伪集群(待补充)
- 4. kafka 基本概念
- 5. 幂等性
1. 认识kafka
1. 搭建单机kafka
- 将kafka的安装包上传到虚拟机,并解压
cd /usr/loacl/
tar -zxvf kafka_2.13-2.6.0.tgz
cd /usr/local/kafka_2.13-2.6.0
- 修改 server.properties
cd /usr/local/kafka_2.13-2.6.0/config
vim server.properties
# 修改brock的id
brock.id=0
# 修改kafka数据存放的位置,kafka数据默认以log的方式存储
log.dirs=/usr/local/kafka_2.13-2.6.0/data
- 启动kafka服务器
cd /usr/local/kafka_2.13-2.6.0
./bin/kafka-server-start.sh config/server.properties
- 查看端口号占用的进程
netstat -tunlp|egrep "(2181|9092)"
2181: 是zookeeper的默认端口号
9092: 是kafka 的默认端口号
- 单机连通性测试,启动两个xshell客户端,一个用于生产者发送信息,一个用于消费者消费信息。
- 创建一个topics名为test的主题
# zookeeper 服务器地址
--zookeeper localhost:2181
# 创建副本数为2
--replication-factor 1
# 分区数为1
--partitions 1
# 主题为test
--topic test
./bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
- 启动一个kafka的produce生产者
cd /usr/local/kafka_2.13-2.6.0/
./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
- 启动一个kafka的consumer消费者
cd /usr/local/kafka_2.13-2.6.0/
./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
- 此时我们从producer中输入任何单词,发送之后消费者consumer都能够接收到。
2. 单机基准测试
- 生产者基准测试
bin/kafka-producer-perf-test.sh --topic test --num-records 500000 --throughput -1 --record-size 1000 --producer-props bootstrap.servers=192.168.216.130:9092 acks=1
--topic 主题名
--num-records 总共指定生产数据量(默认为500W)
--throughput 指定吞吐量——限流(-1代表不限流)
--record-size record数据的大小(字节为单位)
--producer-props 集群地址,ack=1,指定ack模式
# 测试结果
500000 records sent, 15953.543282 records/sec (15.21 MB/sec), 1899.70 ms avg latency, 4087.00 ms max latency, 1689 ms 50th, 3327 ms 95th, 3921 ms 99th, 4070 ms 99.9th.
# 意思是50W条数据已经发送完毕;每秒大概发送1.6W条数据,约为15.21MB每秒;平均延迟为1899.70毫秒;最大延迟为4087毫秒;
- 消费者基准测试
bin/kafka-consumer-perf-test.sh --topic test --fetch-size 1048576 --messages 500000 --broker-list 192.168.216.130:9092
start.time | 2020-10-29 21:29:56:824 |
end.time | 2020-10-29 21:30:01:503 |
data.consumed.in.MB 共计消费的数据 | 476.8372 |
MB.sec 每秒消费的数量 | 101.9101 |
data.consumed.in.nMsg | 500002 |
nMsg.sec 每秒消费的数据 | 106860.8677 |
rebalance.time.ms | 1603978197378 |
fetch.time.ms | -1603978192699 |
fetch.MB.sec | -0.0000 |
fetch.nMsg.sec | -0.0003 |
3. 搭建 kafka伪集群(待补充)
搭建kafka伪集群之前,先要有zookeeper伪集群。就好像单机Kafka也需要有单机zookeeper。
- 搭建zookeeper伪集群
- kafka伪集群复制配置文件
cd/usr/local/kafka_2.13-2.6.0
cp config/server.properties config/server-1.properties
cp config/server.properties config/server-2.properties
cp config/server.properties config/server-3.properties
- 修改 每个server 的配置文件 server-x.properties
vim config/server-1.properties:
host.name=192.168.216.130
broker.id=1
port=9093
log.dir=/usr/local/kafka_2.13-2.6.0/kafka_data/server1
zookeeper.connect=master:2182,master:2183,master:2184
vim config/server-2.properties:
host.name=192.168.216.130
broker.id=2
port=9094
log.dir=/usr/local/kafka_2.13-2.6.0/kafka_data/server2
zookeeper.connect=master:2182,master:2183,master:2184
vim config/server-3.properties:
host.name=192.168.216.130
broker.id=3
port=9095
log.dir=/usr/local/kafka_2.13-2.6.0/kafka_data/server3
zookeeper.connect=master:2182,master:2183,master:2184
4. kafka 基本概念
Producer : 消息和数据的生产者,向Kafka的一个Topic发布消息的进程、代码或服务;
Consumer : 消息和数据的消费者,订阅数据(Topic)并且处理其发布的消息的进程、代码或服务;
Consumer Group : 逻辑概念,对于同一个topic,会广播给不同的group,一个group中,只有一个consumer可以消费该消息;
Broker : 物理概念,Kafka集群中的每个Kafka节点;
Topic : 逻辑概念,Kafka消息的类别,对数据进行区分、隔离;
Partition : 物理概念,Kafka下数据存储的基本单位,一个Topic数据会被分散存储在多个Partition中,每个Partition中的消息是有序的;
Replication : 同一个Partition可能会有多个Replia,多个Replica之间数据一般是一样的;
Replication Leader : 一个Partition的多个Replica上,需要一个Leader负责该Partition上与Producer和Consumer交互;
Replication Manager : 负责管理当前broker所有分区和副本的信息,处理KafkaController发起的一些请求,副本状态的切换、添加/读取消息等。
5. 幂等性
- 生产这消息重复问题:
即Kafka生产者生产消息到partition分区中,如果直接发送消息,Kafka会将消息保存到分区中,并且Kafka会返回一个 ACK 给生产者,表示当前操作是否成功,即Kafka分区是否保存了这条消息。如果ACK响应的过程失败了,此时生产者会认为Kafka分组没有接收到生产者生产的消息,生产者就会重试,继续发送没有发送成功的消息。那么此时Kafka就会保存了两条一模一样的消息。 - 解决办法:
- 当Kafka的生产者生产消息时,会增加一个Pid(生产者的唯一编号)和sequence number (针对消息的一个递增序列)。
- 发送消息时,会连着 pid 和sequence number 一块发送。
- Kafka 接收消息,会将消息和pid、sequence number 一并保存。
- 如果ACK响应失败,生产者重试,再次发送消息时,Kafka会根据第二次接收到的pid、sequence number 判断这条消息是否需要被保存下来。
- 判断条件:生产者发送过来的 sequence number 是否小于等于 partition 中消息对应的sequence number。 若小于,则说明已经保存过了。 ·