目录

消息队列

kafka(一种高吞吐量的分布式发布/订阅消息系统)

zookeeper(一种分布式协调技术)

zookeeper工作原理

zookeeper集群架构

zookeeper在kafka中的作用

单节点部署kafka

1:安装zookeeper

2:安装kafka

3:测试

群集部署kafka

1:zookeeper部署

2:kafka的部署

3:测试


消息队列

  • 消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象
  • 消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递
  1. 特征
    1. 存储:与依赖于使用套接字的基本 TCP 和 UDP 协议的传统请求和响应系统不同,消息队列通常将消息存储在某种类型的缓冲区中,直到目标进程读取这些消息或将其从消息队列中显式移除为止
    2. 异步:与请求和响应系统不同,消息队列通过缓冲消息可以在应用程序中公开一定程度的异步性,允许源进程发送消息并在队列中累积消息,而目标进程则可以挑选消息进行处理
  2. 需要消息队列的原因
    1. 解耦:允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束
    2. 冗余:消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险
    3. 扩展性:因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可
    4. 灵活性 & 峰值处理能力:在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见;使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃
    5. 可恢复性:系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理
    6. 顺序保证:大部分消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理(Kafka 保证一个 Partition 内的消息的有序性)
    7. 缓冲:有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况
    8. 异步通信:消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它

kafka(一种高吞吐量的分布式发布/订阅消息系统)

角色术语

核心概念

角色

Broker

Kafka集群包含一个或多个服务器,每个服务器被称为broker(经纪人)

Topic

每条发布到Kafka集群的消息都有一个分类,这个类别被称为Topic(主题)

Producer

指消息的生产者,负责发布消息到kafka broker

Consumer

指消息的消费者,从kafka broker拉取数据,并消费这些已发布的消息

Partition

Partition是物理上的概念,每个Topic包含一个或多个Partition,每个partition都是一个有序的队列。partition中的每条消息都会被分配一个有序的id(offset)

Consumer Group

消费者组,可以给每个Consumer指定消费组,若不指定消费者组,则属于默认的group

Message

消息,通信的基本单位,每个producer可以向一个topic发布一些消息

zookeeper(一种分布式协调技术)

  • 用来解决分布式环境当中多个进程之间的同步控制,让他们有序的去访问某种共享资源,防止造成资源竞争(脑裂)的后果
    • 脑裂是指在主备切换时,由于切换不彻底或其他原因,导致客户端和Slave误以为出现两个activemaster,最终使得整个集群处于混乱状态
  • 需要zookeeper解决单点故障问题:一个主从的分布式系统中,主节点负责任务调度分发,从节点负责任务的处理,而当主节点发生故障时,整个应用系统也就瘫痪了,那么这种故障就称为单点故障
    • 传统的解决方式是采用一个备用节点,这个备用节点定期向主节点发送ping包,主节点收到ping包以后向备用节点发送回复Ack信息,当备用节点收到回复的时候就会认为当前主节点运行正常,让它继续提供服务
    • 主节点并没有出现故障,只是在回复ack响应的时候网络发生了故障,这样备用节点就无法收到回复,那么它就会认为主节点出现了故障,接着,备用节点将接管主节点的服务,并成为新的主节点,此时,分布式系统中就出现了两个主节点(双Master节点)的情况

zookeeper工作原理

  • master启动
    • 向ZooKeeper中注册节点信息以编号最小作为选举算法,那么编号最小的节点将在选举中获胜并获得锁成为主节点,通过这种方式Zookeeper就完成了对两个Master进程的调度。完成了主、备节点的分配和协作
  • master故障
    • 主节点A 发生了故障,这时候它在ZooKeeper所注册的节点信息会被自动删除,而ZooKeeper会自动感知节点的变化,发现 主节点A  故障后,会再次发出选举,这时候  主节点B  将在选举中获胜,替代  主节点A  成为新的主节点
  • master恢复
    • 如果主节点恢复了,它会再次向ZooKeeper注册自身的节点信息,ZooKeeper会感知节点的变化再次发动选举,这时候 主节点B 在选举中会再次获胜继续担任  主节点 , 主节点A 会担任备用节点

zookeeper集群架构

  1. Leader:领导者角色,主要负责投票的发起和决议,以及更新系统状态
  2. follower:跟随着角色,用于接收客户端的请求并返回结果给客户端,在选举过程中参与投票
  3. observer:观察者角色,用户接收客户端的请求,并将写请求转发给leader,同时同步leader状态,但是不参与投票。Observer目的是扩展系统,提高伸缩性
  4. client:客户端角色,用于向zookeeper发起请求

zookeeper在kafka中的作用

  • Broker注册
  • Topic注册
  • 生产者负载均衡
  • 消费者负载均衡
  • 记录消息分区与消费者的关系
  • 消息消费进度Offset(偏移量)记录
  • 消费者注册

单节点部署kafka

1:安装zookeeper

主机:kafka1:192.168.10.101

[root@kafka1 ~]# yum -y install java
[root@kafka1 ~]# tar zxvf apache-zookeeper-3.6.0-bin.tar.gz
[root@kafka1 ~]# mv apache-zookeeper-3.6.0-bin /etc/zookeeper
[root@kafka1 ~]# cd /etc/zookeeper/conf
[root@kafka1 ~]# mv zoo_sample.cfg zoo.cfg
[root@kafka1 ~]# vim zoo.cfg 
dataDir=/etc/zookeeper/zookeeper-data

[root@kafka1 ~]# cd /etc/zookeeper/
[root@kafka1 kafka]# mkdir /etc/zookeeper/zookeeper-data/
[root@kafka1 zookeeper]# ./bin/zkServer.sh start
[root@kafka1 zookeeper]# ./bin/zkServer.sh status

2:安装kafka

[root@kafka1 ~]# tar zxvf kafka_2.13-2.4.1.tgz 
[root@kafka1 ~]# mv kafka_2.13-2.4.1 /etc/kafka
[root@kafka1 ~]# cd /etc/kafka/

[root@kafka1 kafka]# vim config/server.properties 
log.dirs=/etc/kafka/kafka-logs        #60行

[root@kafka1 kafka]# mkdir /etc/kafka/kafka-logs
[root@kafka1 kafka]# bin/kafka-server-start.sh  config/server.properties &

//检查两个端口的开启状态
[root@kafka1 kafka]# netstat -anpt | grep 2181
[root@kafka1 kafka]# netstat -anpt | grep 9092

//启动时先启动zookeeper,关闭时先关闭kafka
[root@kafka1 zookeeper]# ./bin/zkServer.sh start        //关闭zookeeper  
[root@192 kafka]# bin/kafka-server-stop.sh        //关闭kafka

3:测试

//创建topic
bin/kafka-topics.sh --create --zookeeper kafka1:2181 --replication-factor 1 --partitions 1 --topic test

//列出topic
bin/kafka-topics.sh --list --zookeeper kafka1:2181

//查看topic
bin/kafka-topics.sh --describe --zookeeper kafka1:2181 --topic test

//生产消息
bin/kafka-console-producer.sh --broker-list kafka1:9092 -topic test
//消费消息
bin/kafka-console-consumer.sh --bootstrap-server kafka1:9092 --topic test

群集部署kafka

主机
kafka1:192.168.10.101
kafka2:192.168.10.102
kafka3:192.168.10.103
[root@kafka1 ~]# vim /etc/hosts
192.168.10.101 kafka1
192.168.10.102 kafka2
192.168.10.103 kafka3

1:zookeeper部署

(1)安装zookeeper(三个节点的配置相同)
[root@kafka1 ~]# yum -y install java
[root@kafka1 ~]# tar zxvf apache-zookeeper-3.6.0-bin.tar.gz
[root@kafka1 ~]# mv apache-zookeeper-3.6.0-bin /etc/zookeeper

(2)创建数据保存目录(三个节点的配置相同)
[root@kafka1 ~]# cd /etc/zookeeper/
[root@kafka1 zookeeper]# mkdir zookeeper-data

(3)修改配置文件(三个节点的配置相同)
[root@kafka1 zookeeper]# cd /etc/zookeeper/conf
[root@kafka1 ~]# mv zoo_sample.cfg zoo.cfg
[root@kafka1 ~]# vim zoo.cfg 
dataDir=/etc/zookeeper/zookeeper-data
clientPort=2181
server.1=192.168.10.114:2888:3888
server.2=192.168.10.115:2888:3888
server.3=192.168.10.116:2888:3888
//注释:zookeeper只用的端口
2181:对clinet端提供服务
3888:选举leader使用
2888:集群内机器通讯使用(Leader监听此端口)

(4)创建节点id文件(按server编号设置这个id,三个机器不同)
节点1:
[root@kafka1 conf]# echo '1' > /etc/zookeeper/zookeeper-data/myid
节点2:
[root@kafka2 conf]# echo '2' > /etc/zookeeper/zookeeper-data/myid
节点3:
[root@kafka3 conf]# echo '3' > /etc/zookeeper/zookeeper-data/myid

(5)三个节点启动zookeeper进程
[root@kafka1 conf]# cd /etc/zookeeper/
[root@kafka1 zookeeper]# ./bin/zkServer.sh start
[root@kafka1 zookeeper]# ./bin/zkServer.sh status

2:kafka的部署

(1)kafka的安装(三个节点的配置相同)
[root@kafka1 ~]# tar zxvf kafka_2.13-2.4.1.tgz
[root@kafka1 ~]# mv kafka_2.13-2.4.1 /etc/kafka

(2)修改配置文件
[root@kafka1 ~]# cd /etc/kafka/
[root@kafka2 kafka]# vim config/server.properties 
broker.id=1        ##21行  修改,注意其他两个的id分别是2和3
listeners=PLAINTEXT://192.168.10.114:9092        #31行  修改,其他节点改成各自的IP地址
log.dirs=/etc/kafka/kafka-logs        ## 60行  修改
num.partitions=1        ##65行 分片数量,不能超过节点数
zookeeper.connect=192.168.10.114:2181,192.168.10.115:2181,192.168.10.116:2181
//9092是kafka的监听端口
(3)创建日志目录(三个节点的配置相同)
[root@kafka1 kafka]# mkdir /etc/kafka/kafka-logs

(4)在所有kafka节点上执行开启命令,生成kafka群集(三个节点的配置相同)
[root@kafka1 kafka]# ./bin/kafka-server-start.sh config/server.properties & 
如果启动不了,可以将/etc/kafka/kafka-logs中的数据清除再试试

3:测试

创建topic(任意一个节点)
bin/kafka-topics.sh --create --zookeeper kafka1:2181 --replication-factor 1 --partitions 1 --topic test

列出topic(任意一个节点)
bin/kafka-topics.sh --list --zookeeper kafka1:2181
bin/kafka-topics.sh --list --zookeeper kafka2:2181
bin/kafka-topics.sh --list --zookeeper kafka3:2181

生产消息
bin/kafka-console-producer.sh --broker-list kafka1:9092 -topic test
消费消息
bin/kafka-console-consumer.sh --bootstrap-server kafka1:9092 --topic test

删除topic
bin/kafka-topics.sh --delete --zookeeper kafka1:2181 --topic test

Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐