分布式 PostgreSQL 集群(Citus),官方快速入门教程

article/2025/9/19 6:49:36

多租户应用程序

在本教程中,我们将使用示例广告分析数据集来演示如何使用 Citus 来支持您的多租户应用程序。

注意

本教程假设您已经安装并运行了 Citus。 如果您没有运行 Citus,则可以使用单节点 Citus 中的选项之一在本地设置 Citus

https://docs.citusdata.com/en/v10.2/installation/single_node.html#development

数据模型和示例数据

我们将演示为广告分析应用程序构建数据库,公司可以使用该应用程序来查看、更改、分析和管理他们的广告和活动(请参阅示例应用程序)。这样的应用程序具有典型的多租户系统的良好特性。 来自不同租户的数据存储在一个中央数据库中,每个租户都有自己数据的独立视图。

  • 示例应用程序
    • https://github.com/citusdata/citus-example-ad-analytics/

我们将使用三个 Postgres 表来表示这些数据。 要开始使用,您需要下载这些表的示例数据:

curl https://examples.citusdata.com/tutorial/companies.csv > companies.csv
curl https://examples.citusdata.com/tutorial/campaigns.csv > campaigns.csv
curl https://examples.citusdata.com/tutorial/ads.csv > ads.csv

如果您使用 Docker,则应使用 docker cp 命令将文件复制到 Docker 容器中。

docker cp companies.csv citus:.
docker cp campaigns.csv citus:.
docker cp ads.csv citus:.

创建表

首先,您可以先使用 psql 连接到 Citus coordinator

如果您使用原生 Postgres,如我们的单节点 Citus 指南中安装的那样,coordinator 节点将在端口 9700 上运行。

psql -p 9700

如果您使用 Docker,您可以通过使用 docker exec 命令运行 psql 进行连接:

docker exec -it citus_master psql -U postgres

然后,您可以使用标准 PostgreSQL CREATE TABLE 命令创建表。

CREATE TABLE companies (id bigint NOT NULL,name text NOT NULL,image_url text,created_at timestamp without time zone NOT NULL,updated_at timestamp without time zone NOT NULL
);CREATE TABLE campaigns (id bigint NOT NULL,company_id bigint NOT NULL,name text NOT NULL,cost_model text NOT NULL,state text NOT NULL,monthly_budget bigint,blacklisted_site_urls text[],created_at timestamp without time zone NOT NULL,updated_at timestamp without time zone NOT NULL
);CREATE TABLE ads (id bigint NOT NULL,company_id bigint NOT NULL,campaign_id bigint NOT NULL,name text NOT NULL,image_url text,target_url text,impressions_count bigint DEFAULT 0,clicks_count bigint DEFAULT 0,created_at timestamp without time zone NOT NULL,updated_at timestamp without time zone NOT NULL
);

接下来,您可以像在 PostgreSQL 中一样在每个表上创建主键索引:

ALTER TABLE companies ADD PRIMARY KEY (id);
ALTER TABLE campaigns ADD PRIMARY KEY (id, company_id);
ALTER TABLE ads ADD PRIMARY KEY (id, company_id);

分布表和加载数据

我们现在将继续告诉 Citus 将这些表分布在集群中的不同节点上。为此,您可以运行 create_distributed_table 并指定要分片的表和要分片的列。在这种情况下,我们将对 company_id 上的所有表进行分片。

SELECT create_distributed_table('companies', 'id');
SELECT create_distributed_table('campaigns', 'company_id');
SELECT create_distributed_table('ads', 'company_id');

对公司标识符上的所有表进行分片允许 Citus 将表放在一起,并允许跨集群使用主键、外键和复杂连接等功能。您可以在此处了解有关此方法的好处的更多信息。

  • https://docs.citusdata.com/en/stable/sharding/data_modeling.html#colocation
  • https://www.citusdata.com/blog/2016/10/03/designing-your-saas-database-for-high-scalability/

然后,您可以继续使用标准 PostgreSQL \COPY 命令将我们下载的数据加载到表中。 如果您将文件下载到其他位置,请确保指定正确的文件路径。

\copy companies from 'companies.csv' with csv
\copy campaigns from 'campaigns.csv' with csv
\copy ads from 'ads.csv' with csv

运行查询

现在我们已经将数据加载到表中,让我们继续运行一些查询。 Citus 支持标准的 INSERTUPDATEDELETE 命令,用于在分布式表中插入和修改行,这是面向用户的应用程序的典型交互方式。

例如,您可以通过运行插入一个新公司:

INSERT INTO companies VALUES (5000, 'New Company', 'https://randomurl/image.png', now(), now());

如果您想将公司所有活动的预算翻倍,您可以运行 UPDATE 命令:

UPDATE campaigns
SET monthly_budget = monthly_budget*2
WHERE company_id = 5;

这种操作的另一个例子是运行跨越多个表的事务。 假设您要删除一个广告系列及其所有相关广告,您可以通过运行以原子方式执行:

BEGIN;
DELETE FROM campaigns WHERE id = 46 AND company_id = 5;
DELETE FROM ads WHERE campaign_id = 46 AND company_id = 5;
COMMIT;

事务中的每个语句都会导致多节点 Citus 中的 coordinatorworker 之间的往返。 对于多租户工作负载,在分布式函数中运行事务效率更高。 对于较大的事务,效率提升变得更加明显,但我们可以使用上面的小事务作为示例。

首先创建一个执行删除的函数:

CREATE OR REPLACE FUNCTIONdelete_campaign(company_id int, campaign_id int)
RETURNS void LANGUAGE plpgsql AS $fn$
BEGINDELETE FROM campaignsWHERE id = $2 AND campaigns.company_id = $1;DELETE FROM adsWHERE ads.campaign_id = $2 AND ads.company_id = $1;
END;
$fn$;

接下来使用 create_distributed_function 指示 Citus 直接在 worker 上而不是在 coordinator 上运行该函数(除了在单节点 Citus 安装上,它在 coordinator 上运行所有东西)。它将在任何持有与值 company_id 相对应的 adscampaigns 表的分片的 worker 上运行该函数。

  • https://docs.citusdata.com/en/stable/develop/api_udf.html#create-distributed-function
SELECT create_distributed_function('delete_campaign(int, int)', 'company_id',colocate_with := 'campaigns'
);-- you can run the function as usual
SELECT delete_campaign(5, 46);

除了事务操作,您还可以使用标准 SQL 运行分析查询。 公司运营的一个有趣查询是查看有关其具有最大预算的活动的详细信息。

SELECT name, cost_model, state, monthly_budget
FROM campaigns
WHERE company_id = 5
ORDER BY monthly_budget DESC
LIMIT 10;

我们还可以跨多个表运行连接查询,以查看有关运行获得最多点击次数和展示次数的广告系列的信息。

SELECT campaigns.id, campaigns.name, campaigns.monthly_budget,sum(impressions_count) as total_impressions, sum(clicks_count) as total_clicks
FROM ads, campaigns
WHERE ads.company_id = campaigns.company_id
AND campaigns.company_id = 5
AND campaigns.state = 'running'
GROUP BY campaigns.id, campaigns.name, campaigns.monthly_budget
ORDER BY total_impressions, total_clicks;

至此,我们结束了使用 Citus 为简单的多租户应用程序提供支持的教程。 下一步,您可以查看多租户应用程序部分,了解如何为自己的多租户数据建模。

  • https://docs.citusdata.com/en/stable/sharding/data_modeling.html#distributing-by-tenant-id

实时应用程序分析

在本教程中,我们将演示如何使用 Citus 获取事件数据并在人类实时的数据上运行分析查询。 为此,我们将使用一个示例 Github 事件数据集。

数据模型和样本数据

我们将演示为实时分析应用程序构建数据库。 该应用程序将插入大量事件数据,并以亚秒级延迟对这些数据进行分析查询。在我们的示例中,我们将使用 Github 事件数据集。该数据集包括 Github 上的所有公共事件,例如提交(commits)分叉(forks)新问题(new issues)以及对这些问题的评论(comments)

我们将使用两个 Postgres 表来表示这些数据。要开始使用,您需要下载这些表的示例数据:

curl https://examples.citusdata.com/tutorial/users.csv > users.csv
curl https://examples.citusdata.com/tutorial/events.csv > events.csv

如果您使用 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

然后,您可以使用标准 PostgreSQL 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
);

接下来,您可以像在 PostgreSQL 中那样为事件数据创建索引。在本例中,我们还将创建一个 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 将这些表放在一起,并允许有效的连接和分布式汇总。

然后,您可以继续使用标准 PostgreSQL \COPY 命令将我们下载的数据加载到表中。 如果您将文件下载到其他位置,请确保指定正确的文件路径。

\copy github_users from 'users.csv' with csv
\copy github_events from 'events.csv' with csv

运行查询

现在我们已经将数据加载到表中,让我们继续运行一些查询。 首先,让我们检查一下分布式数据库中有多少用户。

SELECT count(*) FROM github_users;

现在,让我们分析一下我们数据中的 Github 推送事件。 我们将首先通过使用每个推送事件中不同提交的数量来计算每分钟的提交数量。

SELECT date_trunc('minute', created_at) AS minute,sum((payload->>'distinct_size')::int) AS num_commits
FROM github_events
WHERE event_type = 'PushEvent'
GROUP BY minute
ORDER BY minute;

我们还有一个用户表。我们还可以轻松地将用户加入事件,并找到创建最多存储库的前十名用户。

SELECT login, count(*)
FROM github_events ge
JOIN github_users gu
ON ge.user_id = gu.user_id
WHERE event_type = 'CreateEvent' AND payload @> '{"ref_type": "repository"}'
GROUP BY login
ORDER BY count(*) DESC LIMIT 10;

Citus 还支持用于摄取和修改数据的标准 INSERTUPDATEDELETE 命令。 例如,您可以通过运行以下命令来更新用户的显示登录:

UPDATE github_users SET display_login = 'no1youknow' WHERE user_id = 24305673;

至此,我们的教程结束了。下一步,您可以查看实时应用程序部分,了解如何为自己的数据建模并为实时分析应用程序提供动力。

  • https://docs.citusdata.com/en/stable/sharding/data_modeling.html#distributing-by-entity-id

更多

  • Citus 简介,将 Postgres 转换为分布式数据库
  • 分布式 PostgreSQL - Citus 架构及概念
  • 扩展我们的分析处理服务(Smartly.io):使用 Citus 对 PostgreSQL 数据库进行分片
  • 分布式 PostgreSQL 集群(Citus)官方示例 - 多租户应用程序实战
  • 分布式 PostgreSQL 集群(Citus)官方安装指南

http://chatgpt.dhexx.cn/article/3iQ3IyPc.shtml

相关文章

分布式 PostgreSQL - Citus 架构及概念

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 节点 Citus 是一种 PostgreSQL 扩展,它允许数据库服务器(称为节点)在“无共享(shared…

postgresql数据库使用Citus实现集群

citus是PostgreSQL数据库中的一种轻量级的分库分表解决方案。citus不是一个单独的程序,它是PostgreSQL数据库中的一个插件,可以使用create extension安装此插件。 每个citus集群有多个PostgreSQL数据库实例组成,数据库实例分为两类&#xff…

Citus集群拓扑架构介绍

作者:杨杰 简介 Citus是Postgres的开源扩展,将Postgres转换成一个分布式数据库,在集群的多个节点上分发数据和查询,具有像分片、分布式SQL引擎、复制表和分布式表等特性。 因为Citus是Postgres的扩展(而不是一个独立的代码分支)…

Citus 11 for Postgres 完全开源,可从任何节点查询(Citus 官方博客)

Citus 11.0 来了! Citus 是一个 PostgreSQL 扩展,它为 PostgreSQL 添加了分布式数据库的超能力。 使用 Citus,您可以创建跨 PostgreSQL 节点集群透明分布或复制的表。 Citus 11.0 是一个新的主版本,这意味着它带有一些非常令人兴奋…

如何实现Odoo兼容Citus实现更多数据储存

一. Citus是什么 Citus是一个PostgreSQL扩展,它允许数据库服务器(即节点)在一个Shared Nothing的架构中彼此协调。这些节点形成了一个集群,使得PostgreSQL能够比一台计算机使用更多的CPU内核来存储更多的数据&#xf…

使用 HammerDB 对 Citus 和 Postgres 进行 Benchmark,每分钟200万新订单处理测试(官方博客)...

在为 Postgres 运行性能基准测试时,主要建议是:“自动化!” 如果您正在测量数据库性能,您可能不得不一遍又一遍地运行相同的基准测试。 要么是因为你想要一个稍微不同的配置,要么是因为你意识到你使用了一些错误的设置…

PostgreSQL 14分布式Citus单机多实例部署

什么是Citus Citus是一个PostgreSQL扩展,可将Postgres转换为分布式数据库,因此您可以在任何规模上实现高性能。 使用Citus,您可以使用新的超能力扩展PostgreSQL数据库: 1、分布式表在PostgreSQL节点集群中进行分片,…

微软开源Citus企业版全部功能:提供分布式Postgres数据库功能

6 月份时,CitusData 推出了 Citus 11.0,并宣布将所有企业版的特性进行开源。Citus 是 PostgreSQL 的一个扩展,将 Postgres 转变为分布式数据库,用户可以在任何规模下实现高性能。 在公布该消息数月后,当地时间 9 月 1…

O2OA中如何使用PostgreSQL + Citus 实现分布式数据库实现方案?

虽然 O2OA 数据表高效的表结构以及索引的设计已经极大程度地保障了数据存取操作的性能,但是随着使用时间从增长,数据表存放的数据量也会急剧增长。此时,仍然需要有合适的方案来解决数据量产生的系统性能瓶颈。本文介绍通过 PostgreSQL Citus…

数据中台Citus集群压测报告

作者简介: 迪颉科技是专注于企业数字化转型数据价值及数据治理,并在大数据、数据中台(零售、制造行业)、dataops/数仓以及数据驱动的应用等,提供专业解决方案的团队。在以往外企的从业经验中,将原来的Terad…

Citus高可用方案演进介绍

点击上方"数据和云" 关注我们,享更多干货! 1. Citus的复制功能 Citus支持两种数据复制方案: Citus的Shard Replication:通过将DML语句复制到多个Worker节点执行,实现对shard分片数据的复制,仅适用…

Python 基于sicpy求解定积分 ,不定积分以及多重积分

1.SciPy是什么 SciPy是python的一个著名的开源科学库,SciPy一般都是操纵NumPy数组来进行科学计算,统计分析,可以说是基于NumPy之上。SciPy提供了许多科学计算的库函数,如线性代数,微分方程,信号处理&#x…

多重积分积分区域奇偶对称性化简积分

说白了就是根据积分区域的对称性,去看被积函数满足的性质。

java二重积分_《University Calculus》-chaper13-多重积分-二重积分的计算

之前关于二重积分的笔记,介绍了二重积分概念的引入,但是对于它的计算方法(化为累次积分),介绍的较为模糊,它在《概率论基础教程》中一系列的推导中发挥着很重要的作用。 回想先前关于二重积分的几何含义,求解一个曲顶圆…

考研数学多重积分计算秒杀(对称性化简以及雅可比球坐标)

先利用镜面对称性化简交叉项,只需要计算平方项,在利用轮换对称性只算一个二次积分,然后在用雅可比和球坐标积分来算,其中球坐标积分会涉及到三角函数幂次积分,使用华莱士公式来速算。 先平移成标准球面,x^2…

哈密顿算子和拉普拉斯算子 格林公式高斯公式和斯托克斯公式 多重积分的分部积分公式

目录 哈密顿算子(Hamiltionian) ∇ \nabla ∇标量性质矢量性质 拉普拉斯算子(Laplace) Δ \Delta Δ标量性质矢量性质 格林公式高斯公式和斯托克斯公式多重积分的分部积分公式 哈密顿算子(Hamiltionian) …

java二重积分_《University Calculus》-chaper13-多重积分-二重积分的引入

这一章节我们开始对多重积分的研究。 在此之前,我们首先来回忆起积分的过程,在平面中,面临求解不规则图形的面积(常叫曲边梯形)的时候,我们可以采取建立直角坐标系,然后通过得到不规则图形边界的函数表达式f(x)&#x…

基于MATLAB的隐函数偏导与多重积分(附代码)

一. 隐函数的偏导数 给定隐函数: 隐函数的偏导可得: MATLAB格式: F-diff(f,xj)/diff(f,xi) 例题1 已知: 求: 解: MATLAB代码: clc;clear; syms x y; f(x^2-2*x)*exp(-x^2-y^2-x*y); prett…

关于在多重积分以及曲线曲面积分中对称性的应用

引言 在最近的期末复习中经常做到一类需要用对称性来简化计算的题目,而我翻书后却发现书上并没有对这种简化方法有多少介绍,老师倒是在课上讲过,但由于期中以后太摆了也没听,因此经过查找资料后对这种方法也是进行了学习和总结。 …