目录

  • 1. 认识kafka
  • 1. 搭建单机kafka
  • 2. 单机基准测试
  • 3. 搭建 kafka伪集群(待补充)
  • 4. kafka 基本概念
  • 5. 幂等性


1. 认识kafka

1. 搭建单机kafka

  1. 将kafka的安装包上传到虚拟机,并解压
cd  /usr/loacl/
tar -zxvf kafka_2.13-2.6.0.tgz
cd /usr/local/kafka_2.13-2.6.0
  1. 修改 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
  1. 启动kafka服务器
cd /usr/local/kafka_2.13-2.6.0
./bin/kafka-server-start.sh config/server.properties
  1. 查看端口号占用的进程
netstat -tunlp|egrep "(2181|9092)"

kafka查看端口 linux查看kafka端口_linux

2181: 是zookeeper的默认端口号

9092: 是kafka 的默认端口号

  1. 单机连通性测试,启动两个xshell客户端,一个用于生产者发送信息,一个用于消费者消费信息。
  2. 创建一个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
  1. 启动一个kafka的produce生产者
cd /usr/local/kafka_2.13-2.6.0/
./bin/kafka-console-producer.sh  --broker-list localhost:9092 --topic test
  1. 启动一个kafka的consumer消费者
cd /usr/local/kafka_2.13-2.6.0/
./bin/kafka-console-consumer.sh  --bootstrap-server localhost:9092 --topic test --from-beginning
  1. 此时我们从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模式

kafka查看端口 linux查看kafka端口_kafka_02

# 测试结果
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。

  1. 搭建zookeeper伪集群
  2. 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
  1. 修改 每个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。 若小于,则说明已经保存过了。 ·