【问题标题】:Cassandra export/forward data only onceCassandra 仅导出/转发数据一次
【发布时间】:2017-03-31 07:29:18
【问题描述】:

我需要每隔一定时间将数据从我的系统转发到外部系统。为此,我已经将所有行存储在一个表中。已转发的数据不应再次导出。

这个想法是在客户端记住上次导出时间,并在下次导出以下记录。成功导出后,旧行将被删除。

CREATE TABLE export(
    id int,
    import_date_time timestamp, 
    data text,
    PRIMARY KEY (id, import_date_time)
) WITH CLUSTERING ORDER BY (import_date_time DESC) 

insert into export(id, import_date_time, data) values (1, toUnixTimestamp(now()), 'content')

select * from export where id = 1 and import_date_time > '2017-03-30 16:22:37'

delete from export where id = 1 and import_date_time <= '2017-03-30 16:22:37'
  1. 有没有人已经实现了类似的或者你有不同的 解决方案?
  2. 如果可能,我不需要请求的 id,因为我想 导出所有数据

【问题讨论】:

  • 两次导出的大概间隔是多少?
  • 大约 10 分钟,实际上我们认为 cassandra 并不是存放这些数据的最佳位置。

标签: cassandra forward data-export


【解决方案1】:

如果您使用固定的分区键值(id = 1),那么所有的插入、选择和删除都将反复发生在同一个节点上(如果 RF=1)。并且还为每个删除 cassandra 创建一个 tombstone 条目,当您执行选择查询时,cassandra 需要合并每个条目。所以你的选择查询性能会下降。

所以不要使用固定值,而是使用如下动态值:

CREATE TABLE export(
    hour int,
    day int,
    month int,
    year int,
    import_date_time timestamp, 
    data text,
    PRIMARY KEY ((hour, day, month, year), import_date_time)
) WITH CLUSTERING ORDER BY (import_date_time DESC); 

这里可以插入从import_date_time中提取的时、日、月、年的值

选择数据时需要注意两种情况:

  1. 之前的导出时间和当前的导出时间都在同一时间。
  2. 两个时间不在同一小时内。

对于案例一,您只需要一个查询,对于案例二,您必须执行两个查询。

示例查询:

SELECT * FROM export WHERE hour = 16 AND day = 30 AND month = 3 AND year = 2017 AND import_date_time > '2017-03-30 16:22:37';

【讨论】:

  • 我知道只有 id 用于分区的分区问题。这应该不是什么大问题。我的主要重点是减少请求的数量,因为我每次都查询所有数据(由于分区,这似乎不适合 cassandra)
  • 如果您指定小时、日、月和年,您只剩下少量数据。
  • 但是我必须在我的请求中设置这些值(小时,天...),并且导入时间戳是未知的。请求的数量将会增加,正如我所说......我每次都需要几乎所有数据。为什么我要请求数千个请求并一点一点合并响应。对我来说这感觉不太好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
  • 2018-07-05
  • 2021-03-02
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多