
消息队列的说明(MessageQueue)
1)消息队列必须支持快进快出 2)消息队列本身就是临时存储数据
RabbitMQ < ActiveMQ < RocketMQ(阿里) < kafka(领英)
消息队列的应用场景
1)应用耦合 2)异步处理 3)限流削峰(起缓冲的作用) 4)消息驱动的系统(系统分为消费者,生产者)
消息队列的两种方式
1)点对点的模式(一对一) 1- 消息队列 2- 生产者 3- 消费者 2)发布/和订阅的模式(一对多) 1- 消息队列 2- 发布者 3- 接收者
kafka的架构
- 说明
1)broker:kafka的从节点 2)producer:生产者 3)consumer:消费者 4)topic: 主题(类似一个逻辑容器,负责存储数据) 5)shard:分片 6)replicas:副本
kafka的特点
1)可靠性:
分布式, 分区 , 复制 和容错等, 数据不容易丢失 集群也是非常稳定, 宕机风险较低.
2)可扩展性:
非常方便的扩展kafka集群的节点.
3)耐用性:
数据都是存储在磁盘上, 持久化存储的.
4)性能:
单台可达 10w 并发, 还可以通过扩展节点, 提升更高的性能, 保证零停机, 零数据丢失.
kafka的启动指令
#kafka的启动命令 cd /export/server/kafka_2.12-2.4.1/bin ./kafka-server-start.sh ../config/server.properties #kafka的后台启动 nohup ./kafka-server-start.sh ../config/server.properties & #kafka中如何创建主题 ./kafka-topics.sh --create --zookeeper node1:2181,node2:2181,node3:2181 --topic test01 --partitions 2 --replication-factor 2 参数说明: --partitions : 指定topic的分片数量 --replication-factor: 指定每个分片下有几个副本 (包含本身) #通过shell模拟生产者 ./kafka-console-producer.sh --broker-list node1:9092,node2:9092,node3:9092 --topic test01 #通过shell命令模拟消费者 ./kafka-console-consumer.sh --bootstrap-server node1:9092,node2:9092,node3:9092 --topic test01 #kafka的shell命令查看主题 ./kafka-topics.sh --list --zookeeper node1:2181,node2:2181,node3:2181 #查看某一个topic的详细信息 ./kafka-topics.sh --describe --zookeeper node1:2181,node2:2181,node3:2181 --topic test01 #为某个topic增加分片的数量 ./kafka-topics.sh --alter --zookeeper node1:2181,node2:2181,node3:2181 --topic test01 --partitions 4 #删除一个topic ./kafka-topics.sh --delete --zookeeper node1:2181,node2:2181,node3:2181 --topic test01kafka的进阶知识
kafka的分片副本机制
1)分片的作用: 1- 解决的单机存储上限问题 2- 提高查询效率 2)副本的作用: 1- 解决数据的高可用问题,提高数据的容错率
kafka如何保证数据不丢失
- ACK确认机制,生产者发送数据的时候分为同步发送和异步发送,无论何种发送数据的方式,都要用ACK机制
- ACK的值主要有:0, 1, -1(all)
1)0的意思是:生产者只把数据写给broker即可无需等待broker返回的ack校验码,直接判断数据写入成功
2)1的意思是: 生产者把数据写给broker之后,只需要等待主副本返回的ack即可,收到即为成功
3)-1(all)的意思是: 生产者把数据写给broker之后,需要等待到所有的副本,包括主副本和各副本返回的ack校验码,全收到即为成功
- 从三个角度解释kafka如何防止数据不丢失
1)生产者的角度:
1- ack机制, 重试策略,可以通过缓冲池,启用告警系统
2)broker的角度:
1- 副本机制
3)消费者的角度:
1-由broker记录消费者的消费情况(消费偏移量 consumer_offset)
(消费者每次消费情况都是由broker记录的,当消费者消费数据的时候,会先询问broker,该消费者所在的消费者组上次消费到了哪里,如果broker有记录,就让该消费者继续消费,分片中的某一条数据只能被消费者组中的某一个消费者消费,如果broker没有消费记录,则让消费者从头开始消费,消费偏移量记录为0,消费者可以消费任意的数据,后者在任意时刻提交消费偏移量)
kafka的存储查询机制
存储机制
1)kafka是临时存储数据的,且采用分片 + 副本机制的,具体的存储流程如下:
1- 因为Kafka是临时存储数据的,当数据被消费之后,或者经过一段时间,这些过期的数据会被清理掉,如果是单文件存储,则不方便我们进行删除 *** 作,如果是多文件存储,则我们只需要将过期的文件直接删除即可(过期的默认值为:7天)
2- Kafka采用Segment段的方式来存储数据的,它有包含*.log 和 *.index两个文件
*.index文件的意思是,记录的是消费的偏移量,以及其对应的物理偏移量(具体的数据的起始字节)
*.log文件的意思是,记录的是具体的数据(一个字节 = 一个物理偏移量)
3- 当Segment段中的 *.log文件达到一定的阈值后(默认1GB),就会滚动形成一个Segment段
kafka的查询机制
1)先根据要查找的offset(消费偏移量),找到其对应的Segment段 2)再去根据Segment段的 *.index文件中,根据消费偏移量,找到其对应的物理偏移量 3)根据上述的物理偏移量,去 *.log文件中去查找具体的数据即可
kafka的数据分发策略
Kafka中的默认分发策略采用的是 DefaultPartitioner.class 类的规则,但是关于Kafka的所有的数据分发策略,总结起来有四种:
1)轮询的方式发送 弊端:同批次的数据被散, (kafka2.4的时候优化为:粘性分发) 2)哈希分发的方式, 即,根据键的哈希值进行分发 3)指定分区分发, 即,分区编号是从0开始,一次累加,给谁发,就写谁的编号 4)自定义分发策略
Kafka负载均衡原理
1)在一个消费者组内,消费者的数量最多和topic的分片的数量相等,如果大于了分片的数量,必然会出现某些消费者出于闲置的状态
--------------------------------------------------
1) 请思考: 如果模拟点对点消费模式呢?
方案一: 只有一个消费者来消费这个topic
方案二: 将消费者个topic的消费者全部放置在一个组内
2) 请思考: 如何模拟发布订阅消费模式呢?
将多个消费者放置在不同的消费者组
kafka-eagle可视化工具
略
kafka数据的积压- 数据积压的原因
1)因为数据的写入目的容器失败,从而导致消费失败 2)因为网络延迟消息消费失败 3)消费的逻辑过于复杂,导致消费的过慢,出现积压问题
- 数据积压的解决方式
对于第 1 种, 我们常规解决方案, 处理目的容器,保证目的容器是一直可用状态 对于第 2 种, 如果之前一直没问题, 只是某一天出现, 可以调整消费的超时时间 对于第 3 种, 一般解决方案,调整消费代码, 消费更快即可, 利于消费者的负载均衡策略,提升消费者数量Kafka的数据限额
- 说明
生产者和消费者以极高的速度生产/消费大量数据或产生请求,从而占用broker上的全部资源,造成网络IO饱和。 有了配额(Quotas)就可以避免这些问题。Kafka支持配额管理,从而可以对Producer和Consumer的produce&fetch *** 作进行流量限制,防止个别业务压爆服务器。
- 设置方式
限制producer端的速率 //为所有client id设置默认值,以下为所有producer程序设置其TPS不超过1MB/s,即1048576/s,命令如下: bin/kafka-configs.sh --zookeeper node1.itcast.cn:2181 --alter --add-config 'producer_byte_rate=1048576' --entity-type clients --entity-default //运行基准测试,观察生产消息的速率 bin/kafka-producer-perf-test.sh --topic test --num-records 500000 --throughput -1 --record-size 1000 --producer-props bootstrap.servers=node1.itcast.cn:9092,node2.itcast.cn:9092,node3.itcast.cn:9092 acks=1 -------------------------------------------------- 限制consumer端的速率 //对consumer限速与producer类似,只不过参数名不一样。 //为指定的topic进行限速,以下为所有consumer程序设置topic速率不超过1MB/s,即1048576/s。命令如下: bin/kafka-configs.sh --zookeeper node1.itcast.cn:2181 --alter --add-config 'consumer_byte_rate=1048576' --entity-type clients --entity-default //运行基准测试,观察消息消费的速率 bin/kafka-consumer-perf-test.sh --broker-list node1.itcast.cn:9092,node2.itcast.cn:9092,node3.itcast.cn:9092 --topic test04 --fetch-size 1048576 --messages 500000Flume的介绍
Flume的架构图
1)Flume是采集数据的,一个采集任务对应一个Agent对象 2)Agent对象由三部分组成,分别是:Source, Channel, Sink 3)采集的那台的数据就把Flume部署到那台机器上 4)Flume之所以叫日志采集,是因为只要配置好采集日志文件,Flume就可以采集数据了 5)采集的数据是用Event,他是Flume内部传输的最基本的单元
- Flume的三个组件
1)Source: 2)Sink: 3)Channel:
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)