kafka

kafka

  1. 一个分布式的基于发布/订阅模式的消息队列,应用于实时处理领域,在实时处理的时候,当访问量过大时,实时分析工具spark、stream的分析跟不上提交的数据,于是需要kafka的消息队列存储(类似于蓄水库,当流量过大时用于存储,错过流量高峰之后再一部分一部分读取),减缓服务器的实时处理压力异步、消峰、解耦抓取实时的日志,用来分析推荐更适合你的内容

安装与部署

  1. 解压
  2. 改名
  3. 创建logs文件夹
  4. 修改配置文件 vi server.properties
#broker的全局唯一编号,不能重复
broker.id=0
#删除topic功能使能
delete.topic.enable=true
#kafka运行日志存放的路径	
log.dirs=/opt/module/kafka/logs
#配置连接Zookeeper集群地址
zookeeper.connect=hadoop102:2181,hadoop103:2181,hadoop104:2181
  1. 配置环境变量 sudo vi /etc/profile
#KAFKA_HOME
export KAFKA_HOME=/opt/module/kafka
export PATH=$PATH:$KAFKA_HOME/bin

source /etc/profile
6. 启动zookeeper,kafka依赖于zookeeper

bin/zkServer.sh start
bin/zkServer.sh status
bin/zkServer.sh stop
  1. 启动kafka
bin/kafka-server-start.sh -daemon(后台启动) config/server.properties
  1. 关闭集群
bin/kafka-server-stop.sh stop

运行流程和存储机制

kafaka是以topic为单位
producer向topic发送(可有多个topic),topic下可有多个分区,分区建立之后创建副本,副本同步leader的数据,然后consumer再从topic的leader消费,
consumer的消费过程中,有一个offset的偏移量用来记载consumer读取的位置(为了防止中途发生意外找不到之前读取的位置,在0.9之前的版本保存在zookeeper中,之后是consumer自行维护,保存在一个内置offset中),
每一个partition分区下会有一个log文件保存kafka的内容,(因为kafka的文件默认会在一周清理一次,所以为了防止产生巨型文件的产生,在追加内容的过程中,如果文件达到一定数量之后就会产生一个segment分区,依次往下产生分区,减小文件大小),
segment文件下是由log文件和index文件保存kafka内容,log文件保存每个segment起始地址,index文件保存起始地址和文件的偏移量(指向文件和文件之间的位置,即上一个文件的大小),
搜素文件存放位置时,首先通过查找segment的起始位置,确定存放在哪个segment中,之后根据文件名-起始位置求得存放在第几个位置,再根据文件偏移量找到存放文件的位置。

分区原因

(1)方便在集群中扩展,每个Partition可以通过调整以适应它所在的机器,而一个topic又可以有多个Partition组成,因此整个集群就可以适应任意大小的数据了;
(2)可以提高并发,因为可以以Partition为单位读写了。

分区原则

(1)指明 partition 的情况下,直接将指明的值直接作为 partiton 值;
(2)没有指明 partition 值但有 key 的情况下,将 key 的 hash 值与 topic 的 partition 数进行取余得到 partition 值;
(3)既没有 partition 值又没有 key 值的情况下,第一次调用时随机生成一个整数(后面每次调用在这个整数上自增),将这个值与 topic 可用的 partition 总数取余得到 partition 值,也就是常说的 round-robin 算法。

数据可靠性

producer向topic发送信息时,当topic接受到消息则返回一个ack的值说明收到,如果没有收到ack的确认则再发送一遍
当topic向producer返回ack时,有两种情况,第一种是当有半数以上的follower同步了数据之后返回ack,延迟低,去除了效率低的机器;第二种是全部follower同步数据之后返回ack, 延迟高,但是以为全部follower都同步了数据所以副本比第一种少,kafka选择第二种方式
ISR集合:是因为follower机器同步消息时一部分follower速度较慢,为了防止leader等待时间过长,所以leader只等待ISR集合中的机器同步完则返回ack,当部分机器速度较慢,超过了设置的时间参数,则从ISR集合中踢出,等follower速度跟上之后再加进来
返回的ack:为0时,不能确定leader是否同步完
为1时,follower没有同步数据,容易造成数据丢失
为-1时,follower和leader都已同步数据,容易造成数据重复

副本相同

LEO(log End offset):副本最后一个offset
HW(high watermark): 所有副本中最小的LEO
HW之前的数据对consumer可见,当leader或者follower宕机之后数据只读取到HW的位置

consumer消费方式

有pull和push两种方式,pull是从topic上拉取数据,但是当topic中没有数据就会造成资源的浪费,所以设置了一个timeout参数,当没有数据的时候设置等待时长;push是topic向consumer推数据,但是当数据量过大时就会造成consumer来不及消费造成阻塞,kafka默认使用pull
分区分配策略分为两种,一种是roundrobin,是对每一个consumer进行循环分配,每个consumer最多相差一个
第二种是range,是通过算法对consumer进行分配

高效读写

吞吐量:因为是采用磁盘的顺序读写,不需要移动磁头的位置提高了读写速度
零拷贝:是不用经过用户层进行多次的拷贝,将文件从未解码过程直接复制,提高了读写速度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值