轻松学会消息队列之kafka基础篇

理论

Kafka 是一款开源的、轻量级的、分布式、可分区和具有复制备份的(Replicated)、基于ZooKeeper 协调管理的分布式流平台的功能强大的消息系统。与传统的消息系统相比,Kafka能够很好地处理活跃的流数据,使得数据在各个子系统中高性能、低延迟地不停流转。

Kafka定位就是一个分布式流处理平台。作为一个流式处理平台,必须具备以下3个关键特性。

• 能够允许发布和订阅流数据。从这个角度来讲,平台更像一个消息队列或者企业级的消息系统。

• 存储流数据时提供相应的容错机制。

• 当流数据到达时能够被及时处理。

1、为什么要使用 kafka,为什么要使用消息队列

缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,kafka在中间可以起到一个缓冲的作用,把消息暂存在kafka中,下游服务就可以按照自己的节奏进行慢慢处理。

解耦和扩展性:项目开始的时候,并不能确定具体需求。消息队列可以作为一个接口层,解耦重要的业务流程。只需要遵守约定,针对数据编程即可获取扩展能力。

冗余:可以采用一对多的方式,一个生产者发布消息,可以被多个订阅topic的服务消费到,供多个毫无关联的业务使用。

健壮性:消息队列可以堆积请求,所以消费端业务即使短时间死掉,也不会影响主要业务的正常进行。

异步通信:很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。

2、kafka中的 zookeeper 起到什么作用

broker分布式部署,就需要一个注册中心来进行统一管理。Zookeeper用一个专门节点保存Broker服务列表,负载均衡

broker向Zookeeper进行注册后,生产者根据broker节点来感知broker服务列表变化,这样可以实现动态负载均衡。

consumer group中的消费者,可以根据topic节点信息来拉取特定分区的消息,实现负载均衡。

3、kafka producer如何优化打入速度

增加线程

提高 batch.size

增加更多 producer 实例

增加 partition 数

设置 acks=-1 时,如果延迟增大:可以增大 num.replica.fetchers(follower 同步数据的线程数)来调解;

跨数据中心的传输:增加 socket 缓冲区设置以及 OS tcp 缓冲区设置。

4、kafka的message格式是什么样的

一个Kafka的Message由一个固定长度的header和一个变长的消息体body组成

header部分由一个字节的magic(文件格式)和四个字节的CRC32(用于判断body消息体是否正常)构成。

当magic的值为1的时候,会在magic和crc32之间多一个字节的数据:attributes(保存一些相关属性,

比如是否压缩、压缩格式等等);如果magic的值为0,那么不存在attributes属性

body是由N个字节构成的一个消息体,包含了具体的key/value消息

5、为什么Kafka不支持读写分离?

在 Kafka 中,生产者写入消息、消费者读取消息的操作都是与 leader 副本进行交互的,从 而实现的是一种主写主读的生产消费模型。

Kafka 并不支持主写从读,因为主写从读有 2 个很明 显的缺点:

(1)数据一致性问题。数据从主节点转到从节点必然会有一个延时的时间窗口,这个时间 窗口会导致主从节点之间的数据不一致。某一时刻,在主节点和从节点中 A 数据的值都为 X, 之后将主节点中 A 的值修改为 Y,那么在这个变更通知到从节点之前,应用读取从节点中的 A 数据的值并不为最新的 Y,由此便产生了数据不一致的问题。

(2)延时问题。类似 Redis 这种组件,数据从写入主节点到同步至从节点中的过程需要经 历网络→主节点内存→网络→从节点内存这几个阶段,整个过程会耗费一定的时间。而在 Kafka 中,主从同步会比 Redis 更加耗时,它需要经历网络→主节点内存→主节点磁盘→网络→从节 点内存→从节点磁盘这几个阶段。对延时敏感的应用而言,主写从读的功能并不太适用。


案例

轻松学会消息队列之kafka基础篇_第1张图片

提示:可根据实际环境需求对选项、参数进行优化

需求:通过Kafka实现数据发布,客户端能及时收到订阅的数据。

安装zookeeper

1、 下载或上传软件包并解压

tar -xf zookeeper-3.4.9.tar.gz

移动并重命名
mv zookeeper-3.4.9 /usr/local/zookeeper

2、 编辑配置

1)进入样例目录
cd /usr/local/zookeeper/conf/

2)加-p拷贝(保留源文件权限)

cp -p zoo_sample.cfg zoo.cfg

3、 声明节点id号

echo 1 > /usr/local/zookeeper/data/myid

4、 修改默认脚本文件

1)修改日志文件存放路径和查询的方式为轮询
vim zkEnv.sh
轻松学会消息队列之kafka基础篇_第2张图片
2)vim zkServer.sh
在这里插入图片描述

3)vim zkCli.sh
在这里插入图片描述
5、优化,创建软连接到系统程序默认搜索路径

ln -s zkServer.sh /usr/local/bin/
ln -s zkCli.sh /usr/local/bin/

6、在当前路径启动服务

[root@localhost bin]# ./zkServer.sh start

7、验证:
轻松学会消息队列之kafka基础篇_第3张图片

安装kafka

1、下载或上传软件包并解压

tar xf kafka_2.11-2.2.1.tgz

移动并重命名
mv kafka_2.11-2.2.1 /usr/local/kafka

2、进入执行程序文件目录

cd /usr/local/kafka/bin/

3、以后台运行方式启动服务,并要指定其配置文件
轻松学会消息队列之kafka基础篇_第4张图片
4、查看端口,验证服务启动是否正常
轻松学会消息队列之kafka基础篇_第5张图片
5、测试

1)producer使用localhost主机和9092端口,名称为test
[root@localhost bin]# ./kafka-console-producer.sh --broker-list localhost:9092 --topic test
输入内容:看见我你就成功啦 ##消息内容自定义,如图:
轻松学会消息队列之kafka基础篇_第6张图片
2)输入完成后新打开一个终端,作为消息接受者
cd /usr/local/kafka/bin/
[root@localhost bin]# ./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
看到我们刚才发送的消息
轻松学会消息队列之kafka基础篇_第7张图片

你可能感兴趣的:(云计算-架构,kafka,分布式,消息队列,linux,centos)