1. kafka介绍(一)
1.1. 为何使用消息系统
- 数据持久化,数据缓冲,异步通信。保证数据不丢失,通过缓冲层来帮助任务最高效率的执行,可存储大量历史数据可以异步处理。
- 扩展性,解耦处理过程。增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可。不需要改变代码、不需要调节参数。
- 灵活性,峰值处理能力。不会因为突发的超负荷的请求而完全崩溃。
- 可恢复性。系统的一部分组件失效时,不会影响到整个系统。加入队列中的消息仍然可以在系统恢复后被处理。
- 时序性。在大多使用场景下,数据处理的顺序都很重要。
1.2. 常用Message Queue对比
- 测试环境(203):
Model: Dell Vostro 3800
CPU: Intel® Core™ i3-4170 CPU @ 3.70GHz
RAM: 16 Gb
OS: CentOS 7.3.1611 x86_64
RabbitMQ | RocketMQ | kafka | |
---|---|---|---|
模式 |
发布订阅 | 发布订阅 | 发布订阅 |
持久化 |
支持(内存/硬盘) | 支持(磁盘) | 支持(磁盘) |
事务 |
支持 | 支持 | 不支持 |
集群 |
支持 | 支持 | 支持 |
负载均衡 |
支持 | 支持 | 支持 |
堆积能力 |
磁盘容量+内存 | 磁盘容量 | 磁盘容量(水平扩展,不同broker可以存储在不同磁盘上) |
消息丢失 |
不会丢失 | 理论上不会丢失 | 理论上不会丢失 |
消息重复 |
可以使用消息确认等机制控制 | - | 理论上会有重复 |
消息失败重试机制 |
消费失败支持定时重试 | 消费失败支持定时重试,每次重试间隔时间顺延 | Kafka消费失败不支持重试 |
客户端支持语言 |
Java、C、C++、Python、 PHP、Perl 等 | Java、C++(不成熟) | Java、C++等 |
Producer吞吐量 |
1.8w/s(4个broker),消费者消费对其吞吐量影响很大 | - | 13w/s(4个broker,11个分区),消费者消费对其吞吐量影响很小 |
最大吞吐量时cpu、内存占用 |
cpu占用非常高,内存占用根据配置(配置的太低对性能影响很大) | - | cpu占用不高,每个broker大概10%,内存1G左右 |
Consumer吞吐量 |
6千/s(3个消费者),峰值数据非常容易积压,一旦积压消费速度有很大影响,消费者增加速度成倍下降 | - | 2.7w/s(3个消费者,11个分区),能累积很多数据,累积不会对消费速度有影响,增加消费者对消费速度的影响没有rabbitmq那么大。 |
1.2.1. RabbitMQ架构
![avatar][rabbitmq]
- RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。
- AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
- AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。
1.2.2. RocketMQ架构
-
结合部署结构图,描述集群工作流程
- 启动Namesrv,Namesrv起来后监听端口,等待Broker、Produer、Consumer连上来,相当于一个路由控制中心。
- Broker启动,跟所有的Namesrv保持长连接,定时发送心跳包。心跳包中包含当前Broker信息(IP+端口等)以及存储所有topic信息。注册成功后,namesrv集群中就有Topic跟Broker的映射关系。
- 收发消息前,先创建topic,创建topic时需要指定该topic要存储在哪些Broker上。也可以在发送消息时自动创建Topic。
- Producer发送消息,启动时先跟Namesrv集群中的其中一台建立长连接,并从Namesrv中获取当前发送的Topic存在哪些Broker上,然后跟对应的Broker建长连接,直接向Broker发消息。
- Consumer跟Producer类似。跟其中一台Namesrv建立长连接,获取当前订阅Topic存在哪些Broker,然后直接跟Broker建立连接通道,开始消费消息。
1.2.3. Kafka架构
- Kafka是Scala和Java编写的分布式发布-订阅消息系统。
- Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,采用消息的批量处理,zero-copy机制,数据的存储和获取是本地磁盘顺序批量操作,具有O(1)的复杂度。
- Kafka对消息的重复、丢失、错误没有严格要求,需要开发者增加控制机制。
1.3. 为何使用KAFKA
- KAFKA比较成熟,并且以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间复杂度的访问性能。
- 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条以上消息的传输。顺序写磁盘(顺序写磁盘效率比随机写内存要高,保障 kafka 吞吐率。
- 支持Kafka Server间的消息分区,及分布式消费,同时保证每个Partition内的消息顺序传输,采用消息的批量处理,zero-copy机制。
- 同时支持离线数据处理和实时数据处理。
- 支持在线水平扩展,随时增加zookeeper节点,每个broker还可以分布在不同磁盘,增加处理性能。
1.4. Kafka相关概念介绍
1.4.1. zookeeper集群
Kafka系统强依赖的组件。其存储了Kafka核心原数据 (如topic信息配置、broker信息、 消费分组等等,相当于DB充当了Kafka的配置管理中心) 。 Kafka的leader选举(如coordinator选举、controller选举、partition leader选举等等),同样也会借助于zookeeper。
1.4.2. Broker
消息缓存代理,Kafka集群包含一个或多个服务器,这些服务器被称为Broker,负责消息的存储于转发,作为代理对外提供生产和消费服务。
1.4.3. Topic
消息主题(类别),逻辑上的概念,特指Kafka处理的消息源的不同分类,用户可以根据自己的业务形态将不同业务类别的消息分别存储到不同Topic。用户生产和消费时只需指定所关注的topic即可,不用关注该topic的数据存放的具体位置。
1.4.4. Partition
Topic物理上的分组,在创建Topic时可以指定分区的数量,每个partition是一个有序的队列,按生产顺序存储着每条消息,而且每条消息都会分配一个64bit的自增长的有序offset(相当于消息id)。Partition是整个Kafka可以平行扩展的关键因素。
1.4.5. Replication
副本,topic级别的配置,可以理解为topic消息的副本数。Kafka 0.8版本加入的概念,主要目的就是提高系统的可用性。防止broker意外崩溃导致部分partition不可以服务。
1.4.6. Leader
replica 中的一个角色, producer 和 consumer 只跟 leader 交互。
1.4.7. Follower
replica 中的一个角色,从 leader 中复制数据。
1.4.8. ISR
In-Sync Replicas ,Kafka用来维护跟上leader数据的broker列表,当leader崩溃后,优先从该列中选举leader。
1.4.9. Producer
Producer 生产者,采用Push方式进行消息发布生产。 Producer可以通过与zookeeper连接获取broker信息, topic信息等等元数据,然后再与broker交互进行消息发布。
1.4.10. Consumer
消费者,采用Pull方式,从Broker端拉取消息并进行处理。当采用订阅方式订阅感兴趣的Topic时,Consumer必须属于一个消费分组,而且Kafka保证同一个Topic的一条消息只能被同一个消费分组(GroupId)中的一个Consumer消费,但多个消费分组可以同时消费这一条消息。
1.5. Kafka启动和监控管理
1.5.1. Zookeeper启动
cd /root/kafka/kafka-0.11.0.0-src/bin
zkServer.sh start /root/kafka/kafka-0.11.0.0-src/config/zoo.properties
zkServer.sh start /root/kafka/kafka-0.11.0.0-src/config/zoo1.properties
1.5.2. Kafka的brokers启动
cd /root/kafka/kafka-0.11.0.0-src/bin
cat config/server.properties
kafka-server-start.sh -daemon /root/kafka/kafka-0.11.0.0-src/config/server.properties &
kafka-server-start1.sh -daemon /root/kafka/kafka-0.11.0.0-src/config/server1.properties &
kafka-server-start2.sh -daemon /root/kafka/kafka-0.11.0.0-src/config/server2.properties &
kafka-server-start3.sh -daemon /root/kafka/kafka-0.11.0.0-src/config/server3.properties &
1.5.3. 创建topic
kafka-topics.sh --create --zookeeper 192.168.158.132:2182,192.168.158.132:2183 --replication-factor 2 --partitions 11 --topic [topicname]
1.5.4. 启动监控
cd /rootkafka/kafka-manager-1.3.3.13
cat conf/application.conf
bin/kafka-manager -Dconfig.file=conf/application.conf -Dhttp.port=9001 &
1.5.5. 登录监控
网页输入http://192.168.100.203:9001
来源:https://blog.csdn.net/q375923078/article/details/98876071