网络干扰开放观察站(OONI)是一个非营利性自由软件项目,它支持分散化的全球互联网审查记录工作。OONI 提供免费的软件工具,供用户测试其互联网连接质量、检测审查和测量网络干扰。这些测试可以揭示被阻止或限制的网站、应用程序或服务,并有助于识别技术审查方法。
OONI 使用 ClickHouse 作为其数据存储和分析引擎,来处理大量数据。ClickHouse 使 OONI 能够对其网络测量测试中收集的大量数据执行复杂查询。它还支持生成可视化,有助于识别数据中的趋势和模式。
OONI 的使命和全球影响
OONI 成立于十多年前,旨在提高全球互联网审查的透明度。他们的一个工具,OONI 探针,允许用户运行网络实验,以确定其网络上哪些网站、即时通讯应用程序和规避工具受到限制。
OONI 收集其全球志愿者网络生成的数据,对其进行分析,将其发布为开放数据,并生成研究报告,将发现置于特定国家/地区、区域以及正在发生的社会或政治事件的背景下。该组织还与全球 43 个合作伙伴组织合作,传播研究结果、开展宣传活动,并支持政策制定和法律行动。
从 PostgreSQL 到 ClickHouse:提升性能并简化架构
OONI 测量聚合工具包 (MAT) 显示中国、伊朗、缅甸和俄罗斯屏蔽 twitter.com (查看仪表板)。
OONI Explorer 是一个开放数据平台,允许用户探索收集到的数据并了解实施审查的技术手段。他们需要一个能够简化其架构,同时处理复杂数据可视化并能够在其 10 亿+ 行数据集上进行搜索和聚合的解决方案。
在使用 ClickHouse 之前,OONI 使用平面文件、MongoDB 和 PostgreSQL 来存储测量实验的元数据。但是,由于其庞大的数据集,他们遇到了性能问题。随着数据集增长到数亿行,性能问题开始出现,需要从OLTP 数据库迁移到 OLAP 数据库。
数据管道:将 ClickHouse 集成到 OONI 的工作流程中
ClickHouse 简化了 OONI 的架构,使研究人员能够更轻松地访问数据。OONI 的首席开发人员 Arturo Filastò 表示:“能够使用一个主表简化我们的架构,使我们能够更快地迭代并直接在数据集上运行任何查询。” Filastò 还指出,ClickHouse 的效率显着提高了他们的调查。“将所有数据存储在 ClickHouse 中意味着我们无需等待数小时才能完成查询,从而快速回答问题,极大地提高了我们的内部数据分析任务。”
OONI 数据管道的架构涉及在用户设备上运行的探针,这些探针定期执行测量并将结果上传到 OONI 的测量收集 API。
原始数据(压缩的JSON 文件)存储在 S3 上,而元数据则存储在一个大型表中。该表包含分析和聚合所需的所有相关元数据,例如国家/地区、网络、时间戳、目标以及分析结果。此大型表的模式如下所示
CREATE TABLE fastpath
(
`measurement_uid` String,
`report_id` String,
`input` String,
`probe_cc` String,
`probe_asn` Int32,
`test_name` String,
`test_start_time` DateTime,
`measurement_start_time` DateTime,
`filename` String,
`scores` String,
`platform` String,
`anomaly` String,
`confirmed` String,
`msm_failure` String,
`domain` String,
`software_name` String,
`software_version` String,
`control_failure` String,
`blocking_general` Float32,
`blocking_type` String,
`test_version` String,
`test_runtime` Float32,
`architecture` String,
`engine_name` String,
`engine_version` String
)
ENGINE = ReplacingMergeTree
ORDER BY (measurement_start_time, report_id, input)
SETTINGS index_granularity = 8192;
它的大小为 14 亿条记录,包含 32 列,用于许多聚合查询,这些查询为 OONI 的测量聚合工具包 (MAT) 和其内部数据分析工具提供支持。根据用户可配置的参数构建数据集上的聚合查询,并且在高级别上具有以下结构
SELECT
countIf(anomaly = 't' AND confirmed = 'f' AND msm_failure = 'f') AS anomaly_count,
countIf(confirmed = 't' AND msm_failure = 'f') AS confirmed_count,
countIf(msm_failure = 't') AS failure_count,
countIf(anomaly = 'f' AND confirmed = 'f' AND msm_failure = 'f') AS ok_count,
COUNT(*) AS measurement_count,
[user configured grouping parameter_a],
[user configured grouping parameter_b]
WHERE
[user configured filter]
GROUP BY [user configured grouping parameter_a], [user configured grouping parameter_b]
以下是一个读者可以尝试的更实际的示例。OONI 的 UI 上的以下可视化效果生成了下面编写的查询 - https://explorer.ooni.org/chart/mat?test_name=web_connectivity&axis_x=measurement_start_day&since=2023-04-12&until=2023-05-12&time_grain=day
SELECT
countIf (anomaly = 't' AND confirmed = 'f'
AND msm_failure = 'f') AS anomaly_count,
countIf (confirmed = 't' AND msm_failure = 'f') AS confirmed_count,
countIf (msm_failure = 't') AS failure_count,
countIf (anomaly = 'f' AND confirmed = 'f'
AND msm_failure = 'f') AS ok_count,
COUNT(*) AS measurement_count,
toDate (measurement_start_time) AS measurement_start_day
FROM fastpath
WHERE
measurement_start_time >= '2023-04-12 00:00:00'
AND measurement_start_time < '2023-05-12 00:00:00'
AND test_name IN ['web_connectivity']
GROUP BY measurement_start_day
ORDER BY measurement_start_day
此查询在 600 毫秒内扫描了大约 5900 万行。
通过切换到 ClickHouse,他们发现某些在 PostgreSQL 上运行需要长达 20 分钟的繁重查询,在 ClickHouse 中只需数百毫秒即可完成。他们还发现数据库的磁盘占用量减少了一半。
在使用 PostgreSQL 存储实验元数据时,他们在构建MAT 时遇到了性能问题,并且无法直接查询 SQL 表进行聚合。为了克服这个问题,他们使用了包含预先计算的计数的计数器表,但这种方法仍然复杂且效率低下。ClickHouse 使他们能够直接在数据集上执行聚合,而无需维护中间计数器表示,从而简化了数据管道。
借助 ClickHouse,OONI 改进了其架构,从而实现更快的數據訪問和分析。这使得能够实时发布测量结果,帮助人权捍卫者快速应对全球的审查事件。
了解更多信息:https://ooni.org/