新聞中心
多租戶應(yīng)用程序
在本教程中,我們將使用示例廣告分析數(shù)據(jù)集來演示如何使用 Citus 來支持您的多租戶應(yīng)用程序。

創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括那坡網(wǎng)站建設(shè)、那坡網(wǎng)站制作、那坡網(wǎng)頁制作以及那坡網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,那坡網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到那坡省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
注意
本教程假設(shè)您已經(jīng)安裝并運(yùn)行了 Citus。如果您沒有運(yùn)行 Citus,則可以使用單節(jié)點(diǎn) Citus 中的選項(xiàng)之一在本地設(shè)置 Citus。
https://docs.citusdata.com/en/v10.2/installation/single_node.html#development。
數(shù)據(jù)模型和示例數(shù)據(jù)
我們將演示為廣告分析應(yīng)用程序構(gòu)建數(shù)據(jù)庫,公司可以使用該應(yīng)用程序來查看、更改、分析和管理他們的廣告和活動(dòng)(請(qǐng)參閱示例應(yīng)用程序)。這樣的應(yīng)用程序具有典型的多租戶系統(tǒng)的良好特性。來自不同租戶的數(shù)據(jù)存儲(chǔ)在一個(gè)中央數(shù)據(jù)庫中,每個(gè)租戶都有自己數(shù)據(jù)的獨(dú)立視圖。
示例應(yīng)用程序:
https://github.com/citusdata/citus-example-ad-analytics/。
我們將使用三個(gè) Postgres 表來表示這些數(shù)據(jù)。要開始使用,您需要下載這些表的示例數(shù)據(jù):
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,則應(yīng)使用 docker cp 命令將文件復(fù)制到 Docker 容器中。
docker cp companies.csv citus:.
docker cp campaigns.csv citus:.
docker cp ads.csv citus:.
創(chuàng)建表
首先,您可以先使用 psql 連接到 Citus coordinator。
如果您使用原生 Postgres,如我們的單節(jié)點(diǎn) Citus 指南中安裝的那樣,coordinator 節(jié)點(diǎn)將在端口 9700 上運(yùn)行。
psql -p 9700
如果您使用 Docker,您可以通過使用 docker exec 命令運(yùn)行 psql 進(jìn)行連接:
docker exec -it citus_master psql -U postgres
然后,您可以使用標(biāo)準(zhǔn) PostgreSQL CREATE TABLE 命令創(chuàng)建表。
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 中一樣在每個(gè)表上創(chuàng)建主鍵索引:
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);
分布表和加載數(shù)據(jù)
我們現(xiàn)在將繼續(xù)告訴 Citus 將這些表分布在集群中的不同節(jié)點(diǎn)上。為此,您可以運(yùn)行 create_distributed_table 并指定要分片的表和要分片的列。在這種情況下,我們將對(duì) company_id 上的所有表進(jìn)行分片。
SELECT create_distributed_table('companies', 'id');
SELECT create_distributed_table('campaigns', 'company_id');
SELECT create_distributed_table('ads', 'company_id');對(duì)公司標(biāo)識(shí)符上的所有表進(jìn)行分片允許 Citus 將表放在一起,并允許跨集群使用主鍵、外鍵和復(fù)雜連接等功能。您可以在此處了解有關(guān)此方法的好處的更多信息。
- 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/。
然后,您可以繼續(xù)使用標(biāo)準(zhǔn) PostgreSQL \COPY 命令將我們下載的數(shù)據(jù)加載到表中。如果您將文件下載到其他位置,請(qǐng)確保指定正確的文件路徑。
\copy companies from 'companies.csv' with csv
\copy campaigns from 'campaigns.csv' with csv
\copy ads from 'ads.csv' with csv
運(yùn)行查詢
現(xiàn)在我們已經(jīng)將數(shù)據(jù)加載到表中,讓我們繼續(xù)運(yùn)行一些查詢。 Citus 支持標(biāo)準(zhǔn)的 INSERT、UPDATE 和 DELETE 命令,用于在分布式表中插入和修改行,這是面向用戶的應(yīng)用程序的典型交互方式。
例如,您可以通過運(yùn)行插入一個(gè)新公司:
INSERT INTO companies VALUES (5000, 'New Company', 'https://randomurl/image.png', now(), now());
如果您想將公司所有活動(dòng)的預(yù)算翻倍,您可以運(yùn)行 UPDATE 命令:
UPDATE campaigns
SET monthly_budget = monthly_budget*2
WHERE company_id = 5;
這種操作的另一個(gè)例子是運(yùn)行跨越多個(gè)表的事務(wù)。假設(shè)您要?jiǎng)h除一個(gè)廣告系列及其所有相關(guān)廣告,您可以通過運(yùn)行以原子方式執(zhí)行:
BEGIN;
DELETE FROM campaigns WHERE id = 46 AND company_id = 5;
DELETE FROM ads WHERE campaign_id = 46 AND company_id = 5;
COMMIT;
事務(wù)中的每個(gè)語句都會(huì)導(dǎo)致多節(jié)點(diǎn) Citus 中的 coordinator 和 worker 之間的往返。對(duì)于多租戶工作負(fù)載,在分布式函數(shù)中運(yùn)行事務(wù)效率更高。對(duì)于較大的事務(wù),效率提升變得更加明顯,但我們可以使用上面的小事務(wù)作為示例。
首先創(chuàng)建一個(gè)執(zhí)行刪除的函數(shù):
CREATE OR REPLACE FUNCTION
delete_campaign(company_id int, campaign_id int)
RETURNS void LANGUAGE plpgsql AS $fn$
BEGIN
DELETE FROM campaigns
WHERE id = $2 AND campaigns.company_id = $1;
DELETE FROM ads
WHERE ads.campaign_id = $2 AND ads.company_id = $1;
END;
$fn$;
接下來使用 create_distributed_function 指示 Citus 直接在 worker 上而不是在 coordinator 上運(yùn)行該函數(shù)(除了在單節(jié)點(diǎn) Citus 安裝上,它在 coordinator 上運(yùn)行所有東西)。它將在任何持有與值 company_id 相對(duì)應(yīng)的 ads 和 campaigns 表的分片的 worker 上運(yùn)行該函數(shù)。
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);
除了事務(wù)操作,您還可以使用標(biāo)準(zhǔn) SQL 運(yùn)行分析查詢。公司運(yùn)營的一個(gè)有趣查詢是查看有關(guān)其具有最大預(yù)算的活動(dòng)的詳細(xì)信息。
SELECT name, cost_model, state, monthly_budget
FROM campaigns
WHERE company_id = 5
ORDER BY monthly_budget DESC
LIMIT 10;
我們還可以跨多個(gè)表運(yùn)行連接查詢,以查看有關(guān)運(yùn)行獲得最多點(diǎn)擊次數(shù)和展示次數(shù)的廣告系列的信息。
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;
至此,我們結(jié)束了使用 Citus 為簡單的多租戶應(yīng)用程序提供支持的教程。下一步,您可以查看多租戶應(yīng)用程序部分,了解如何為自己的多租戶數(shù)據(jù)建模。
https://docs.citusdata.com/en/stable/sharding/data_modeling.html#distributing-by-tenant-id。
實(shí)時(shí)應(yīng)用程序分析在本教程中,我們將演示如何使用 Citus 獲取事件數(shù)據(jù)并在人類實(shí)時(shí)的數(shù)據(jù)上運(yùn)行分析查詢。為此,我們將使用一個(gè)示例 Github 事件數(shù)據(jù)集。
數(shù)據(jù)模型和樣本數(shù)據(jù)
我們將演示為實(shí)時(shí)分析應(yīng)用程序構(gòu)建數(shù)據(jù)庫。該應(yīng)用程序?qū)⒉迦氪罅渴录?shù)據(jù),并以亞秒級(jí)延遲對(duì)這些數(shù)據(jù)進(jìn)行分析查詢。在我們的示例中,我們將使用 Github 事件數(shù)據(jù)集。該數(shù)據(jù)集包括 Github 上的所有公共事件,例如提交(commits)、分叉(forks)、新問題(new issues)以及對(duì)這些問題的評(píng)論(comments)。
我們將使用兩個(gè) Postgres 表來表示這些數(shù)據(jù)。要開始使用,您需要下載這些表的示例數(shù)據(jù):
curl https://examples.citusdata.com/tutorial/users.csv > users.csv
curl https://examples.citusdata.com/tutorial/events.csv > events.csv
如果您使用 Docker,則應(yīng)使用 docker cp 命令將文件復(fù)制到 Docker 容器中。
docker cp users.csv citus:.
docker cp events.csv citus:.
創(chuàng)建表
首先,您可以先使用 psql 連接到 Citus 協(xié)調(diào)器。
如果您使用原生 Postgres,如我們的單節(jié)點(diǎn) Citus 指南中安裝的那樣,coordinator 節(jié)點(diǎn)將在端口 9700上運(yùn)行。
psql -p 9700
如果您使用的是 Docker,則可以通過使用 docker exec 命令運(yùn)行 psql 進(jìn)行連接:
docker exec -it citus psql -U postgres
然后,您可以使用標(biāo)準(zhǔn) PostgreSQL CREATE TABLE 命令創(chuàng)建表。
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 中那樣為事件數(shù)據(jù)創(chuàng)建索引。在本例中,我們還將創(chuàng)建一個(gè) 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);
分布表和加載數(shù)據(jù)
我們現(xiàn)在將繼續(xù)告訴 Citus 將這些表分布到集群中的節(jié)點(diǎn)上。為此,您可以運(yùn)行 create_distributed_table 并指定要分片的表和要分片的列。在這種情況下,我們將對(duì) user_id 上的所有表進(jìn)行分片。
SELECT create_distributed_table('github_users', 'user_id');
SELECT create_distributed_table('github_events', 'user_id');對(duì)用戶標(biāo)識(shí)符上的所有表進(jìn)行分片允許 Citus 將這些表放在一起,并允許有效的連接和分布式匯總。
然后,您可以繼續(xù)使用標(biāo)準(zhǔn) PostgreSQL \COPY 命令將我們下載的數(shù)據(jù)加載到表中。如果您將文件下載到其他位置,請(qǐng)確保指定正確的文件路徑。
\copy github_users from 'users.csv' with csv
\copy github_events from 'events.csv' with csv
運(yùn)行查詢
現(xiàn)在我們已經(jīng)將數(shù)據(jù)加載到表中,讓我們繼續(xù)運(yùn)行一些查詢。首先,讓我們檢查一下分布式數(shù)據(jù)庫中有多少用戶。
SELECT count(*) FROM github_users;
現(xiàn)在,讓我們分析一下我們數(shù)據(jù)中的 Github 推送事件。我們將首先通過使用每個(gè)推送事件中不同提交的數(shù)量來計(jì)算每分鐘的提交數(shù)量。
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;我們還有一個(gè)用戶表。我們還可以輕松地將用戶加入事件,并找到創(chuàng)建最多存儲(chǔ)庫的前十名用戶。
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 還支持用于攝取和修改數(shù)據(jù)的標(biāo)準(zhǔn) INSERT、UPDATE 和 DELETE 命令。例如,您可以通過運(yùn)行以下命令來更新用戶的顯示登錄:
UPDATE github_users SET display_login = 'no1youknow' WHERE user_id = 24305673;
至此,我們的教程結(jié)束了。下一步,您可以查看實(shí)時(shí)應(yīng)用程序部分,了解如何為自己的數(shù)據(jù)建模并為實(shí)時(shí)分析應(yīng)用程序提供動(dòng)力。
https://docs.citusdata.com/en/stable/sharding/data_modeling.html#distributing-by-entity-id。
新聞名稱:分布式 PostgreSQL 集群(Citus),官方快速入門教程
路徑分享:http://m.fisionsoft.com.cn/article/dphhgoo.html


咨詢
建站咨詢
