我一直在使用文件系统来存储 log4j 和 log4perl 记录,并希望开始使用数据库来存储信息,特别是查找按 pid 组织的记录。我们的大多数数据库都使用 MySQL RDS,因此我最初的反应是继续使用 MySQL(或尝试使用 Aurora RDS),但 RDS 需要 InnoDB 进行快照,而为了速度,我更喜欢 MyISAM。

我更喜欢保留 30 天的记录,每天 1.35 亿条记录。这可能会增加 10 倍。这里最重要的是插入速度,尽管我希望能够在 5 分钟内按日期或 pid 检索。

RDS服务是关系数据库,因此我需要的检索方法很匹配,但它并不是为不受限制地插入大量数据而设计的。

SimpleDB 或 DynamoDB 是否比 MySQL 或 Aurora 更适合记录记录?

有帮助吗?

解决方案

由于您正在考虑存储和查询 135,000,000 * 30 * 10 条记录,这些记录可能无法从传统 RDBMS 功能中受益,因此我认为 Hadoop 将是最佳选择。

我的经验仅限于 Microsoft Azure - 如果您没有使用 Amazon,您可以查看一下。无论哪种方式,Hadoop 都是开源的,因此无论您的平台提供商是谁,大多数操作和活动都应该是相同的。我会选择一个选项,允许您测试不同集群大小的性能,这样您只需为真正需要的东西付费(特别是目前未知的 10 倍增长)。

尽管以下链接重点关注 Azure,但它为您提供了 很好的教程 介绍如何使用 Hive 查询 log4j 记录。Amazon EMR 似乎有 很棒的文档.

针对您的情况要点:在您的文件上创建表结构:

    CREATE EXTERNAL TABLE log4jLogs
    (t1 string, t2 string, t3 string, t4 string, t5 string, t6 string, t7 string)
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ';'
    STORED AS TEXTFILE LOCATION 'yourdrive:///logs/';

定义表后,您可以像 SQL 一样进行查询:

    SELECT t4 AS sev, COUNT(*) AS ErrorCount
    FROM log4jLogs
    WHERE t4 = '[ERROR]'
    AND INPUT__FILE__NAME LIKE '%.log' GROUP BY t4;

随着 EXTERNAL 定义中,您可以有多个文件,并且该表将包含所有文件,因此只需将它们放在适当的目录中即可。如果您要保留 30 天,您可能希望将更漂亮且单独的日子放入不同的文件夹结构/对 Hive 表进行分区。

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top