【发布时间】:2017-01-18 07:53:15
【问题描述】:
我从事广告技术工作,我们当前的基础架构使用 MySQL 来存储点击和转化日志。到目前为止,MySQL 对我们运行针对点击数据的即席查询很有用。 我们正在考虑切换到 Cassandra,因为我们在高峰时段会收到巨大的流量高峰。不仅如此,我们还在以非常快的速度增长,我们时不时地每秒获得大约 500-1000 次点击(持续时间较长,有时持续 20-30 分钟)。 我一直是可用的选项,到目前为止,我的研究让我相信在写入性能方面没有什么能比 Cassandra 更好。 我目前正在创建一个数据模型来存储点击。 任何点击的主要组成部分如下:
- 广告系列 ID
- 发布号
- 时间戳
- 广告素材 ID
- 事件代码(是有效点击还是无效点击。这是一个 int 值。例如,event_code=0 是有效点击)
现在,我需要支持以下查询:
1. SELECT * FROM clicks WHERE campaign_id=?
2. SELECT * FROM clicks WHERE campaign_id=? AND date_time>=? AND date_time <=?
3. SELECT * FROM clicks WHERE campaign_id=? AND pub_id=? AND AND date_time>=? AND date_time <=? AND event_code=?
等 这对 MySQL 来说很简单,之后我只需从 CSV 文件中的这些查询中获取所有数据。 但是,如果我要根据第一个查询对表进行建模,这意味着我需要在 Cassandra 中创建一个表,如下所示:
CREATE TABLE clicks_by_campaign(
camp_id int,
pub_id int,
date_time timestamp,
creative_id int,
event_code int,
//other fields like ip, user agent ,device etc,
PRIMARY KEY(camp_id,pub_id,date_time,event_code,creative_id))
但有些广告系列可能有数百万行。例如,我们有具有特定 id 的广告系列,比如 id=3,点击次数超过 700 万。 这不会造成宽行问题吗?据我了解,所有这些活动数据都将作为一个分区存储在一台物理机器上。我的想法是正确的还是我错过了什么?请注意,还必须支持其他查询。例如,我可能必须共享特定发布者的点击日志(与广告活动 ID 无关)。在这种情况下,查询将如下所示:
SELECT * FROM clicks_by_publisher WHERE pub_id=?
这显然意味着我必须创建另一个名为“clicks_by_publisher”等的表。
我还想指出,我将使用 Apache Flink 在 1 分钟的时间窗口内分析、汇总和分组点击信息。这些结果将进一步存储到 MySQL 中,以尽可能多地支持 ad-hoc 查询。
谁能指出我正确的方向。 还有其他我可以使用的策略吗?我错过了什么吗?
【问题讨论】:
标签: cassandra distributed-computing nosql