理论
Kafka重要概念:
Topic:话题、或者消息主题,是逻辑上的概念
Partition:分区,用于存放topic的数据
Partition offset:分区上消息的偏移量
Replicas of patition:分区的副本数量(大于等于 节点数量)
Brokers:指的是Kafka集群,一个Kafka节点称为一个broker
Producer:消息的生产者,其实就是服务
Consumer:消息的消费者
Leader: leader是负责所有分区的读写的节点,每个分区都有一台服务器充当leader
Follower:追随者,当leader不行的时候,成为新的leader
副本的数量≥1,小于等于节点数 节点是存储某一个话题,或多个话题
实例和节点相同:一个Kafka节点和一个Kafka实例 指的就是一台服务器
节点一:A B1 C1
节点二:B A1 C1
节点三:C A1 B1
理解的要点:
一个broker上可以创建多个topic,同一个topic也可以在集群的
Kafka集群会保留所有消息的发布记录,不管有没有被消费过,默认情况下,Kafka会把消息保留两天,两天内可以用于消费,之后将被丢弃以腾出空间
Consuman会保存元数据,这个元数据包括它消费的消息在哪个partition,偏移量是多少
Kafka不允许partition的副本数量多于集群节点数量
Consuman以消费者群的名称来标识自己,每个发布到topic的消息都会发送给订阅这个topic的消费群的一个消费者实例
Kafka只能保证一个partition中的消息是有序的,不能保证消息在多个partition中的分布是有序的
Zookeeper作用:传消息走zookeeper,收消息、发消息走Kafka,Kafka依赖于zookeeper来实现offset
如果启动zookeeper失败
[root@localhost ~]# ll /usr/local/zookeeper/data/ 第一种方式
总用量 8
-rw-r--r--. 1 root root 2 8月 24 15:53 myid
drwxr-xr-x. 2 root root 68 8月 24 16:09 version-2
-rw-r--r--. 1 root root 5 8月 24 15:55 zookeeper_server.pid
[root@localhost ~]# rm -rf /usr/local/zookeeper/data/zookeeper_server.pid
[root@localhost ~]# rm -rf /usr/local/zookeeper/data/version-2
[root@localhost ~]# netstat -anput | grep 2181 第二种方式
tcp6 0 0 :::2181 :::* LISTEN 70041/java
[root@localhost ~]# kill -9 70041
如果启动Kafka失败
[root@localhost ~]# echo 192.168.1.11:server.1 >> /etc/hosts 每个节点都添加server.1、server.2、server.3
安装zookeeper以及Kafka
[root@localhost ~]# tar -xzf zookeeper-3.4.12.tar.gz
[root@localhost ~]# tar -zxf kafka_2.12-2.1.0.tgz
[root@localhost ~]# mv zookeeper-3.4.12 /usr/local/zookeeper
[root@localhost ~]# mv kafka_2.12-2.1.0 /usr/local/kafka
[root@localhost ~]# cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg
[root@localhost ~]# vim /usr/local/zookeeper/conf/zoo.cfg
12 dataDir=/usr/local/zookeeper/data
13 dataLogDir=/usr/local/zookeeper/data
16 server.1=192.168.1.11:2888:3888
17 server.2=192.168.1.12:2888:3888
18 server.3=192.168.1.13:2888:3888
[root@localhost ~]# scp /usr/local/zookeeper/conf/zoo.cfg 192.168.1.12:/usr/local/zookeeper/conf/
root@192.168.1.12's password:
zoo.cfg 100% 1066 828.2KB/s 00:00
[root@localhost ~]# scp /usr/local/zookeeper/conf/zoo.cfg 192.168.1.13:/usr/local/zookeeper/conf/
root@192.168.1.13's password:
zoo.cfg 100% 1066 891.5KB/s 00:00
[root@localhost ~]# mkdir /usr/local/zookeeper/data
[root@localhost ~]# echo 1 > /usr/local/zookeeper/data/myid 其余节点依次排列1、2、3、4、5、、、
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# /usr/local/zookeeper/bin/zkServer.sh start 启动zookeeper
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@localhost ~]# /usr/local/zookeeper/bin/zkServer.sh status 查看状态
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower Mode: leader Mode: follower 节点中必有一个leader
[root@localhost ~]# vim /usr/local/kafka/config/server.properties
21 broker.id=1 第几台节点写几
31 listeners=PLAINTEXT://192.168.1.11:9092 监听本机9092端口
65 num.partitions=3 几个节点写几
123 zookeeper.connect=192.168.1.11:2181,192.168.1.12:2181,192.168.1.13:2181 写入集群IP
[root@localhost ~]# /usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
[root@localhost ~]# netstat -anput | grep 9092
tcp6 0 0 192.168.1.11:9092 :::* LISTEN 70599/java
kafka测试
[root@localhost ~]# /usr/local/kafka/bin/kafka-topics.sh --create --zookeeper 192.168.1.11:2181 --replication-factor=2 --partitions=3 --topic test
Created topic "test". 创建一个话题 test
[root@localhost ~]# /usr/local/kafka/bin/kafka-console-producer.sh --broker-list 192.168.1.11:9092 --topic test
>hello world!
> 第一个节点
[root@localhost ~]# /usr/local/kafka/bin/kafka-console-consumer.sh --bootstrap-server 192.168.1.12:9092 --topic test --from-beginning
hello world! 第二个节点
[root@localhost ~]# /usr/local/kafka/bin/kafka-console-consumer.sh --bootstrap-server 192.168.1.13:9092 --topic test --from-beginning
hello world! 第三个节点
[root@localhost conf]# firewall-cmd --add-port=2181/tcp --permanent
success
[root@localhost conf]# firewall-cmd --add-port=2888/tcp --permanent
success
[root@localhost conf]# firewall-cmd --add-port=3888/tcp --permanent
success
[root@localhost conf]# firewall-cmd --add-port=9092/tcp --permanent
success
[root@localhost conf]# firewall-cmd --reload
Success