我们想将数据直接从 EC2 Web 服务器流式传输到 RedShift。我需要使用 Kinesis 吗?最佳做法是什么?在存储这些数据之前,我不打算做任何特别的分析。我想要一个具有成本效益的解决方案(在加载之前使用 DynamoDB 作为临时存储可能会很昂贵)。
3 回答
如果成本是您最关心的问题,那么与记录大小相结合的每秒记录的确切数量可能很重要。
如果您谈论的消息量非常少,则在 t2.micro 实例上运行以聚合数据的自定义应用程序尽可能便宜,但它不会扩展。更大的缺点是您负责监控、维护和管理该 EC2 实例。
现代方法是使用 Kinesis + Lambda + S3 + Redshift 的组合来让数据流不需要 EC2 实例来管理!
此博客文章中描述了该方法:零管理 Amazon Redshift 数据库加载器
如果您确实需要执行任何类型的自定义身份验证或数据转换,那么该博客文章没有提到现在使用API Gateway,您可以通过使用 Lambda 将数据代理到 Kinesis 中来执行此操作,而无需 EC2 实例。
这看起来像:
API Gateway -> Lambda -> Kinesis -> Lambda -> S3 -> Redshift
去年我在公司内部使用 Kinesis 和Kinesis 连接器实现了一个这样的系统。Kinesis 连接器只是 AWS 发布的一个独立应用程序,我们作为 Kinesis 消费者在一堆 ElasticBeanStalk 服务器中运行,然后连接器将每隔一段时间或每条消息聚合到 S3,然后它会触发 Redshift 的 COPY 命令到定期将数据加载到 Redshift。由于它在 EBS 上运行,因此您可以调整自动扩展条件以确保集群随着来自 Kinesis 流的数据量而增长和收缩。
顺便说一句,AWS 昨天刚刚宣布了Kinesis Firehose。我没有玩过它,但它绝对看起来像是 Kinesis 连接器的托管版本。
Redshift 最适合使用COPY
命令进行批量加载。典型的模式是将数据加载到 DynamoDB、S3 或 Kinesis,然后在使用COPY
Redshift 之前聚合事件。
另请参阅这个有用的 SO Q&A。