EKL+kafka
EKL+kafka
上面架构图分为五层,详细解释如下:
第一层、数据采集层
最左边的是业务服务器集群,上面安装了filebeat做日志采集,同时把采集的日志分别发送给两个logstash服务。
第二层、数据处理层,数据缓存层
logstash服务把接受到的日志经过格式处理,转存到本地的kafka broker+zookeeper 集群中。
第三层、数据转发层
这个单独的Logstash节点会实时去kafka broker集群拉数据,转发至ES DataNode。
第四层、数据持久化存储
ES DataNode 会把收到的数据,写磁盘,建索引库。
第五层、数据检索,数据展示
ES Master + Kibana 主要 协调 ES集群,处理数据检索请求,数据展示。
消息队列
1.消息队列是什么?
在计算机科学中,消息队列(英语:Message queue)是一种进程间通信或同一进程的不同线程间的通信方式, 软件的贮列用来处理一系列的输入, 通常是来自用户。消息队列提供了异步的通信协议, 每一个贮列中的纪录包含详细说明的数据, 包含发生的时间, 输入设备的种类, 以及特定的输入参数, 也就是说:消息的发送者和接收者不需要同时与消息队列交互,消息会保存在队列中, 直到接收者取回它
消息队列主要解决应用耦合、异步处理、流量削锋等问题
当前使用较多的消息队列有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等, 而部分数据库如Redis、Mysql以及phxsql也可实现消息队列的功能
2.消息队列的主要使用场景有哪些?
消息队列在实际应用中包括如下场景:
• 应用耦合:多应用间通过消息队列对同一消息进行处理, 避免调用接口失败导致整个过程失败;
• 异步处理:多应用对消息队列中同一消息进行处理, 应用间并发处理消息, 相比串行处理, 减少处理时间;
• 限流削峰:广泛应用于秒杀或抢购活动中, 避免流量过大导致应用系统挂掉的情况;
3.使用消息队列的好处
解耦 - 在项目启动之初来预测将来项目会碰到什么需求, 是极其困难的
消息系统在处理过程中间插入了一个隐含的、基于数据的接口层, 两边的处理过程都要实现这一接口
这允许你独立的扩展或修改两边的处理过程, 只要确保它们遵守同样的接口约束
冗余 - 有些情况下, 处理数据的过程会失败除非数据被持久化, 否则将造成丢失
消息队列把数据进行持久化直到它们已经被完全处理, 通过这一方式规避了数据丢失风险
许多消息队列在把一个消息从队列中删除之前, 需要你的处理系统明确的指出该消息已经被处理完毕, 从而确保数据被安全的保存直到你使用完毕
扩展性 - 因为消息队列解耦了你的处理过程, 所以增大消息入队和处理的频率是很容易的, 只要另外增加处理过程即可
不需要改变代码、不需要调节参数,扩展就像调大电力按钮一样简单
峰值处理 - 在访问量剧增的情况下, 应用仍然需要继续发挥作用, 但是这样的突发流量并不常见,
如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费
使用消息队列能够使关键组件顶住突发的访问压力, 而不会因为突发的超负荷的请求而完全崩溃
可恢复性 - 系统的一部分组件失效时, 不会影响到整个系统
即使一个处理消息的进程挂掉, 加入队列中的消息仍然可以在系统恢复后被处理
顺序保证 - 在大多使用场景下, 数据处理的顺序都很重要
大部分消息队列本来就是排序的, 并且能保证数据会按照特定的顺序来处理
如Kafka能保证一个Partition内的消息的有序性
缓冲 - 在任何重要的系统中, 都会有需要不同的处理时间的元素
例如, 加载一张图片比应用过滤器花费更少的时间
消息队列通过一个缓冲层来帮助任务最高效率的执行———写入队列的处理会尽可能的快速
该缓冲有助于控制和优化数据流经过系统的速度
异步通信 - 很多时候, 用户不想也不需要立即处理消息
消息队列提供了异步处理机制, 允许用户把一个消息放入队列, 但并不立即处理它
想向队列中放入多少消息就放多少, 然后在需要的时候再去处理它们
4.消息队列的模式
消息队列包括两种模式:
• 点对点模式(point to point, queue)
• 发布/订阅模式(publish/subscribe, topic)
点对点模式
点对点模式下包括三个角色:
• 消息队列
• 发送者 (生产者)
• 接收者(消费者)
消息发送者生产消息发送到queue中, 然后消息接收者从queue中取出并且消费消息
消息被消费以后, queue中不再有存储, 所以消息接收者不可能消费到已经被消费的消息
点对点模式特点:
• 每个消息只有一个接收者(Consumer)(即一旦被消费, 消息就不再在消息队列中);
• 发送者和接收者间没有依赖性, 发送者发送消息之后, 不管有没有接收者在运行, 都不会影响到发送者下次发送消息;
• 接收者在成功接收消息之后需向队列应答成功, 以便消息队列删除当前接收的消息;
发布/订阅模式
发布/订阅模式下包括三个角色:
• 角色主题(Topic)
• 发布者(Publisher)
• 订阅者(Subscriber)
发布/订阅模式特点:
• 每个消息可以有多个订阅者;
• 发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者, 它必须创建一个订阅者之后, 才能消费发布者的消息
• 为了消费消息, 订阅者需要提前订阅该角色主题, 并保持在线运行
两者的区别
点对点模式
生产者发送一条消息到queue, 一个queue可以有很多消费者, 但是一个消息只能被一个消费者接受
当没有消费者可用时, 这个消息会被保存直到有 一个可用的消费者
发布订阅模式
发布者发送到topic的消息, 只有订阅了topic的订阅者才会收到消息
topic实现了发布和订阅, 当你发布一个消息, 所有订阅这个topic的服务都能得到这个消息, 所以从1到N个订阅者都能得到这个消息的拷贝
5.常用开源消息队列比较
Kafka常用于分布式架构,对性能要求高的可考虑Kafka
RocketMQ/思路来源于kafka, 改成了主从结构, 在事务性可靠性方面做了优化
广泛来说, 电商、金融等对事务性要求很高的, 可以考虑RabbitMQ和RocketMQ
kafka介绍
kafka是一个分布式消息队列。有高性能、持久化、多副本备份、横向扩展能力。生产者往队列里写消息,消费者从队列里取消息。进行业务逻辑一般在架构设计中起到解耦、削峰、异步处理的作用
kafka对外使用topic的概念, 生产者往topic里写消息, 消费者从中读消息
为了做到水平扩展, 一个topic实际是由多个partition组成的, 遇到瓶颈时, 可以通过增加partition的数量来进行横向扩容,单个parition内是保证消息有序
每新写一条消息, kafka就是在对应的文件append写, 所以性能非常高
Kafka is a distributed,partitioned,replicated commit logservice
kafka对消息保存时根据Topic进行归类, 发送消息者称为Producer,消息接受者称为Consumer,此外kafka集群有多个kafka实例组成, 每个实例(server)称为broker。
无论是kafka集群, 还是producer和consumer都依赖于zookeeper来保证系统可用性,zookeeper集群保存一些meta信息
一个Topic可以认为是一类消息, 每个topic将被分成多个partition(区),每个partition在存储层面是append log文件
任何发布到此partition的消息都会被直接追加到log文件的尾部, 每条消息在文件中的位置称为offset(偏移量)
offset为一个long型数字, 它唯一标记一条消息, kafka并没有提供其他额外的索引机制来存储offset, 因为在kafka中几乎不允许对消息进行“随机读写”
AMQP协议
Advanced Message Queuing Protocol (高级消息队列协议)The Advanced Message Queuing Protocol (AMQP):是一个标准开放的应用层的消息中间件(Message Oriented Middleware)协议。AMQP定义了通过网络发送的字节流的数据格式。因此兼容性非常好,任何实现AMQP协议的程序都可以和与AMQP协议兼容的其他程序交互,可以很容易做到跨语言,跨平台。
前面说的几种比较流行的消息队列协议,要么支持AMQP协议,要么借鉴了AMQP协议的思想进行了开发、实现、设计。
一些基本的概念
1、消费者:(Consumer):从消息队列中请求消息的客户端应用程序
2、生产者:(Producer) :向broker发布消息的应用程序
3、AMQP服务端(broker):用来接收生产者发送的消息并将这些消息路由给服务器中的队列,便于fafka将生产者发送的消息,动态的添加到磁盘并给每一条消息一个偏移量,所以对于kafka一个broker就是一个应用程序的实例
4、主题(Topic):一个主题类似新闻中的体育、娱乐、教育等分类概念,在实际工程中通常一个业务一个主题。
5、分区(Partition):一个Topic中的消息数据按照多个分区组织,分区是kafka消息队列组织的最小单位,一个分区可以看作是一个FIFO( First Input First Output的缩写,先入先出队列)的队列。kafka分区是提高kafka性能的关键所在,当你发现你的集群性能不高时,常用手段就是增加Topic的分区,分区里面的消息是按照从新到老的顺序进行组织,消费者从队列头订阅消息,生产者从队列尾添加消息。
kafka支持的客户端语言:Kafka客户端支持当前大部分主流语言,包括:C、C++、Erlang、Java、.net、perl、PHP、Python、Ruby、Go、Javascript可以使用以上任何一种语言和kafka服务器进行通信(即辨析自己的consumer从kafka集群订阅消息也可以自己写producer程序)
备份(Replication):为了保证分布式可靠性,kafka0.8开始对每个分区的数据进行备份(不同的Broker上),防止其中一个Broker宕机造成分区上的数据不可用。