如何设计用于用户操作日志的 Cassandra 方案?

How to design Cassandra Scheme for User Actions Log?

我在 MYSQL 中有一个像这样的 table 来记录用户操作:

CREATE TABLE `actions` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `module` VARCHAR(32) NOT NULL,
    `controller` VARCHAR(64) NOT NULL,
    `action` VARCHAR(64) NOT NULL,
    `date` Timestamp NOT NULL,
    `userid` BIGINT(20) NOT NULL,
    `ip` VARCHAR(32) NOT NULL,
    `duration` DOUBLE NOT NULL,
    PRIMARY KEY (`id`),
)
COLLATE='utf8mb4_general_ci'
ENGINE=MyISAM
AUTO_INCREMENT=1

我有一个 MYSQL 像这样的查询来找出每天特定操作的计数:

SELECT COUNT(*) FROM actions WHERE actions.action = "join" AND 
YEAR(date)=2017 AND MONTH(date)=06 GROUP BY YEAR(date), MONTH(date), 
DAY(date)

我需要 50 - 60 秒才能得到包含 "join" 个操作的天数列表,其中只有 500 万行以及日期和操作中的索引。

所以,我想使用 Cassandra 记录操作,那么如何设计 Cassandra 方案以及如何查询以在 1 秒内获得此类请求。

CREATE TABLE actions (
    id timeuuid,
    module varchar,
    controller varchar,
    action varchar,
    date_time timestamp,
    userid bigint,
    ip varchar,
    duration double,
    year int,
    month int,
    dt date,
    PRIMARY KEY ((action,year,month),dt,id)
);

说明: With abobe table 定义

SELECT COUNT(*) FROM actions WHERE actions.action = "join" AND yaer=2017 AND month=06 GROUP BY action,year,month,dt

将命中单个分区。 在 dt 列中只有日期...也许您可以将其更改为只有 int 作为数据类型的日期,因为 idtimeuuid.. 它会独一无二。

注意: Cassandra 3.10及以上版本支持GROUP BY