Redis 与 RabbitMQ 作为介于 Logstash 和 elasticsearch 之间的数据 broker/messaging 系统

Redis Vs RabbitMQ as a data broker/messaging system in between Logstash and elasticsearch

我们正在定义一种架构,通过安装在各种机器上的 Logstash shippers 收集日志信息,并在一个 elasticsearch 服务器中集中索引数据,并使用 Kibana 作为图形层。我们需要在 Logstash shippers 和 elasticsearch 之间建立一个可靠的消息传递系统来授权交付。在选择 Redis 而不是 RabbitMQ 作为 Logstash shippers 和 elasticsearch 之间的数据系统 broker/messaging 或反之亦然时,应考虑哪些因素?

要问的快速问题:

  1. 为什么需要经纪人?如果您使用 logstash 或 logstash-forwarder 从这些服务器读取文件,如果管道拥塞,它们都会变慢。
  2. 您有管理 rabbit 或 redis 的经验吗?在所有条件都相同的情况下,您知道如何使用的工具是更好的工具。

在意见领域,我运行 redis 作为经纪人,并且讨厌它。当然,这可能是我对 redis 的经验不足(不是产品本身的问题),但它是管道中最薄弱的 link 并且总是在我们最需要它的时候失败。

我也一直在想同样的事情。 Logstash 人员的早期建议推荐 Redis 而不是 RabbitMQ (http://logstash.net/docs/1.1.1/tutorials/getting-started-centralized), however that section of the notes no longer exists in the current documentation although there are generic notes on using a broker to deal with spikes here https://www.elastic.co/guide/en/logstash/current/deploying-and-scaling.html.

虽然我也很高兴地使用 RabbitMQ,但我目前正在探索 Redis 代理,因为 AMQP 协议对于我的日志用例来说可能有点矫枉过正。

在评估了 Redis 和 RabbitMQ 之后,我选择 RabbitMQ 作为我们的代理,原因如下:

  1. RabbitMQ 允许您通过使用 SSL 证书加密您发送给代理的数据来使用内置的安全层,这意味着没有人会嗅探您的数据并访问您的重要组织数据。
  2. RabbitMQ 是一个非常稳定的产品,可以每秒处理大量事件和许多连接而不会成为瓶颈。
  3. 在我们的组织中,我们已经使用了 RabbitMQ,并且对使用它有很好的内部知识,并且已经准备好与 Chef 集成。

关于扩展,RabbitMQ 有一个内置的集群实现,除了负载平衡器之外,您还可以使用它来实现冗余代理环境。

Is my RabbitMQ cluster Active Active or Active Passive?

现在谈谈使用 RabbitMQ 的弱点:

  1. 大多数 Logstash shippers 不支持 RabbitMQ,但另一方面,最好的一个,名为 Beaver,有一个可以毫无问题地将数据发送到 RabbitMQ 的实现。
  2. Beaver 在其当前版本中使用 RabbitMQ 的实现在性能上有点慢(出于我的目的)并且无法处理来自一台服务器的 3000 events/sec 的速率,并且有时服务崩溃了。
  3. 现在我正在研究一个修复程序,它将解决 RabbitMQ 的性能问题并使 Beaver shipper 更加稳定。第一个解决方案是添加更多可以 运行 同时进行的流程,并为托运人提供更多权力。第二种解决方案是将 Beaver 更改为异步向 RabbitMQ 发送数据,理论上应该更快。我希望我能在本周末完成这两个解决方案的实施。

您可以在此处关注问题: https://github.com/josegonzalez/python-beaver/issues/323

并在此处检查拉取请求: https://github.com/josegonzalez/python-beaver/pull/324

如果您有更多问题,请随时发表评论。

尽管具有 一些基本 消息代理功能,Redis 仍被创建为键值数据存储。

RabbitMQ 被创建为消息代理。它自然有很多消息代理功能。

我一直在研究这个话题。如果性能很重要而持久性不重要,那么 RabbitMQ 是一个完美的选择。 Redis 是一项出于不同目的而开发的技术。

以下是在 Redis 上使用 RabbitMQ 的优点列表:

  • RabbitMQ 使用高级消息队列协议 (AMQP),可以将其配置为使用 SSL,附加安全层。
  • RabbitMQ 大约占 Redis 接受消息时间的 75%。
  • RabbitMQ支持消息的优先级,worker可以优先消费高优先级的消息。
  • 如果任何 worker 在使用消息后崩溃,则不会丢失消息,而 Redis 则不会出现这种情况。
  • RabbitMQ 有一个很好的路由系统,可以将消息定向到不同的队列。

使用 RabbitMQ 的一些缺点:

  • RabbitMQ 可能有点难以维护,难以调试崩溃。
  • node-name 或 node-ip 波动会导致数据丢失,但如果管理得当,持久消息可以解决问题。

如果您特别想将日志从 Logstash 发送到 Elasticsearch,您可能想使用 Filebeat instead of either Redis or RabbitMQ. Personally, I use fluent-bit 收集日志以发送到 Elasticsearch。

但是,此页面上的其他答案有很多 out-of-date 有关 Redis 功能的信息。 Redis 已支持:

但也有一些限制:

  • 在消息持久性和崩溃恢复方面,Redis 仍然不如 RabbitMQ 专注。
  • Redis pub/sub 可扩展性不如 RabbitMQ。 Redis pub/sub 消息 were not sharded by Redis cluster nodes (until relatively recently)。 Redis Streams 是更新的、更具可扩展性的 API.