amazon-web-services - Kinesis Stream 和 Kinesis Firehose 更新 Elasticsearch 索引
问题描述
我们想使用 kinesis 流和 firehose 来更新 aws 托管的 elasticsearch 集群。我们有数百个不同的索引(对应于我们的数据库分片)需要更新。创建 firehose 时,它要求我指定要更新的特定索引名称。这是否意味着我需要为集群中的每个索引创建一个单独的 firehose?或者有没有办法配置 firehose,以便它知道根据数据内容使用什么索引。
此外,我们将有 20 个左右的独立生产者将数据发送到 kinesis 流(这些生产者中的每一个都将为 10 个不同的索引生成数据)。我是否还需要为每个生产者提供单独的运动流。
摘要:20 个生产者(EC2 实例)-> 每个生产者将 20 个不同索引的数据发送到 kinesis 流 -> kinesis 流然后使用 firehose 更新其中包含 200 个索引的单个集群。
注意:所有索引都具有相同的映射和名称 Temple 即 index_1, index_2...index_200
编辑:当我们重新索引数据时,我们沿着 index_1-v2 的行创建新索引。显然,我们不想在创建每个索引版本时为它们创建一个新的 firehose。新的索引名称可以包含在发送到 kinesis 流的 JSON 中。
解决方案
如您所料,Firehose 是解决此问题的错误解决方案,至少如前所述。它专为流(不是生产者!)和索引之间存在 1:1 对应关系的情况而设计。诸如点击流数据或日志聚合之类的东西。
对于任何解决方案,您都需要提供一种机制来识别记录所属的索引。您可以通过为每种消息类型创建一个单独的 Kinesis 流(在这种情况下您可以使用 Firehose)来做到这一点,但这意味着您的生产者必须决定将每条消息写入哪个流。这可能会在您的生产者中造成不必要的复杂性,并且还可能会不可接受地增加您的成本。
因此,假设您想要所有消息的单个流,您需要一个消费者应用程序和某种方式来对这些消息进行分组。您可以在记录本身中包含消息类型(/索引名称),或为此目的使用分区键。分区键使实现更容易一些,因为它保证相同索引的记录将存储在同一个分片上,但这意味着您的生产者可能会受到限制。
对于消费者,您可以使用在 EC2 上运行的始终在线应用程序,或者让流调用 Lambda 函数。
如果您使用分区键来识别消息类型,那么使用 Lambda 非常好,因为每次调用只查看一个分片(调用中可能仍然有多个分区键)。不利的一面是,Lambda 将每秒轮询一次流,如果您有多个流使用者,这可能会导致限制(使用独立应用程序,您可以控制它轮询流的频率)。
推荐阅读
- mysql - 为什么 node.js 或 express.js 的查询响应时间比 PHP 和 Mysql 客户端更长?
- c++ - 为什么模板函数不能作为模板模板参数传递?
- firebase - Firebase 使用 cloudfunctions.net 而不是托管重写规则
- ios - 当应用程序在后台时没有收到通知(iOS react-native)
- if-statement - 获取谷歌表格中某些列值为零的上一个行索引
- nginx - 重写 nginx url
- sql-server - 检查 MGET/MPUT 的访问是否被阻止
- python - Python 电子邮件不是作为一个整体出现的
- react-native - 从 react-native 中的 AsyncStorage 获取项目值
- .htaccess - 如何修复此 URL 的 301 重定向