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实现数据发布,客户端能及时收到订阅的数据。
安装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
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
安装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、以后台运行方式启动服务,并要指定其配置文件
4、查看端口,验证服务启动是否正常
5、测试
1)producer使用localhost主机和9092端口,名称为test
[root@localhost bin]# ./kafka-console-producer.sh --broker-list localhost:9092 --topic test
输入内容:看见我你就成功啦 ##消息内容自定义,如图:
2)输入完成后新打开一个终端,作为消息接受者
cd /usr/local/kafka/bin/
[root@localhost bin]# ./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
看到我们刚才发送的消息