黄东旭解析 TiDB 的核心优势
1252
2023-06-13
分布式 *** 集群(Citus),官方快速入门教程
多租户应用程序
在本教程中,我们将使用示例广告分析数据集来演示如何使用 Citus 来支持您的多租户应用程序。
注意
本教程假设您已经安装并运行了 Citus。如果您没有运行 Citus,则可以使用单节点 Citus 中的选项之一在本地设置 Citus。
数据模型和示例数据
我们将演示为广告分析应用程序构建数据库,公司可以使用该应用程序来查看、更改、分析和管理他们的广告和活动(请参阅示例应用程序)。这样的应用程序具有典型的多租户系统的良好特性。来自不同租户的数据存储在一个中央数据库中,每个租户都有自己数据的独立视图。
示例应用程序:
我们将使用三个 Postgres 表来表示这些数据。要开始使用,您需要下载这些表的示例数据:
如果您使用 Docker,则应使用 docker cp 命令将文件复制到 Docker 容器中。
创建表
首先,您可以先使用 psql 连接到 Citus coordinator。
如果您使用原生 Postgres,如我们的单节点 Citus 指南中安装的那样,coordinator 节点将在端口 9700 上运行。
psql -p 9700
如果您使用 Docker,您可以通过使用 docker exec 命令运行 psql 进行连接:
docker exec -it citus_master psql -U postgres
然后,您可以使用标准 *** CREATE TABLE 命令创建表。
接下来,您可以像在 *** 中一样在每个表上创建主键索引:
分布表和加载数据
对公司标识符上的所有表进行分片允许 Citus 将表放在一起,并允许跨集群使用主键、外键和复杂连接等功能。您可以在此处了解有关此方法的好处的更多信息。
然后,您可以继续使用标准 *** \COPY 命令将我们下载的数据加载到表中。如果您将文件下载到其他位置,请确保指定正确的文件路径。
运行查询
现在我们已经将数据加载到表中,让我们继续运行一些查询。 Citus 支持标准的 INSERT、UPDATE 和 DELETE 命令,用于在分布式表中插入和修改行,这是面向用户的应用程序的典型交互方式。
例如,您可以通过运行插入一个新公司:
如果您想将公司所有活动的预算翻倍,您可以运行 UPDATE 命令:
这种操作的另一个例子是运行跨越多个表的事务。假设您要删除一个广告系列及其所有相关广告,您可以通过运行以原子方式执行:
事务中的每个语句都会导致多节点 Citus 中的 coordinator 和 worker 之间的往返。对于多租户工作负载,在分布式函数中运行事务效率更高。对于较大的事务,效率提升变得更加明显,但我们可以使用上面的小事务作为示例。
首先创建一个执行删除的函数:
除了事务操作,您还可以使用标准 SQL 运行分析查询。公司运营的一个有趣查询是查看有关其具有最大预算的活动的详细信息。
至此,我们结束了使用 Citus 为简单的多租户应用程序提供支持的教程。下一步,您可以查看多租户应用程序部分,了解如何为自己的多租户数据建模。
实时应用程序分析在本教程中,我们将演示如何使用 Citus 获取事件数据并在人类实时的数据上运行分析查询。为此,我们将使用一个示例 Github 事件数据集。
数据模型和样本数据
我们将使用两个 Postgres 表来表示这些数据。要开始使用,您需要下载这些表的示例数据:
如果您使用 Docker,则应使用 docker cp 命令将文件复制到 Docker 容器中。
docker cp users.csv citus:.docker cp events.csv citus:.
创建表
首先,您可以先使用 psql 连接到 Citus 协调器。
如果您使用原生 Postgres,如我们的单节点 Citus 指南中安装的那样,coordinator 节点将在端口 9700上运行。
psql -p 9700
如果您使用的是 Docker,则可以通过使用 docker exec 命令运行 psql 进行连接:
docker exec -it citus psql -U postgres
然后,您可以使用标准 *** CREATE TABLE 命令创建表。
CREATE TABLE github_events( event_id bigint, event_type text, event_public boolean, repo_id bigint, payload jsonb, repo jsonb, user_id bigint, org jsonb, created_at timestamp);CREATE TABLE github_users( user_id bigint, url text, login text, avatar_url text, gravatar_id text, display_login text);
接下来,您可以像在 *** 中那样为事件数据创建索引。在本例中,我们还将创建一个 GIN 索引以更快地查询 jsonb 字段。
CREATE INDEX event_type_index ON github_events (event_type);CREATE INDEX payload_index ON github_events USING GIN (payload jsonb_path_ops);
分布表和加载数据
我们现在将继续告诉 Citus 将这些表分布到集群中的节点上。为此,您可以运行 create_distributed_table 并指定要分片的表和要分片的列。在这种情况下,我们将对 user_id 上的所有表进行分片。
SELECT create_distributed_table('github_users', 'user_id');SELECT create_distributed_table('github_events', 'user_id');
对用户标识符上的所有表进行分片允许 Citus 将这些表放在一起,并允许有效的连接和分布式汇总。
然后,您可以继续使用标准 *** \COPY 命令将我们下载的数据加载到表中。如果您将文件下载到其他位置,请确保指定正确的文件路径。
\copy github_users from 'users.csv' with csv\copy github_events from 'events.csv' with csv
运行查询
现在我们已经将数据加载到表中,让我们继续运行一些查询。首先,让我们检查一下分布式数据库中有多少用户。
SELECT count(*) FROM github_users;
现在,让我们分析一下我们数据中的 Github 推送事件。我们将首先通过使用每个推送事件中不同提交的数量来计算每分钟的提交数量。
我们还有一个用户表。我们还可以轻松地将用户加入事件,并找到创建最多存储库的前十名用户。
SELECT login, count(*)FROM github_events geJOIN github_users guON ge.user_id = gu.user_idWHERE event_type = 'CreateEvent' AND payload @> '{"ref_type": "repository"}'GROUP BY loginORDER BY count(*) DESC LIMIT 10;
Citus 还支持用于摄取和修改数据的标准 INSERT、UPDATE 和 DELETE 命令。例如,您可以通过运行以下命令来更新用户的显示登录:
UPDATE github_users SET display_login = 'no1youknow' WHERE user_id = 24305673;
至此,我们的教程结束了。下一步,您可以查看实时应用程序部分,了解如何为自己的数据建模并为实时分析应用程序提供动力。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。