当前位置: 首页 > 科技观察

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

时间:2023-03-17 18:00:21 科技观察

多租户应用程序在本教程中,我们将使用示例ADAnalytics数据集来演示如何使用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表来表示此数据。要开始,您需要下载这些表的示例数据:curlhttps://examples.citusdata.com/tutorial/companies.csv>companies.csvcurlhttps://examples.citusdata.com/tutorial/campaigns.csv>campaigns.csvcurlhttps://examples.citusdata.com/tutorial/ads.csv>ads.csv如果您使用Docker,则应使用dockercp命令将文件复制到Docker容器中。dockercpcompanys.csvcitus:.dockercpcampaigns.csvcitus:.dockercpads.csvcitus:.创建表首先,您可以先使用psql连接到Citus协调器。如果您使用本机Postgres,如我们的单节点Citus指南中安装的那样,协调器节点将在端口9700上运行。psql-p9700如果您使用Docker,您可以通过使用dockerexec命令运行psql来连接:dockerexec-itcitus_masterpsql-Upostgres然后您可以使用标准的PostgreSQLCREATETABLE命令来创建表。创建表公司(idbigintNOTNULL,nametextNOTNULL,image_urltext,created_attimestampwithouttimezoneNOTNULL,updated_attimestampwithouttimezoneNOTNULL);CREATETABLEcampaigns(idbigintNOTNULL,company_idbigintNOTNULL,nametextNOTNULL,cost_modeltextNOTNULL,statetextNOTNULL,monthly_budgetbigint,blacklisted_site_urlstext[],created_attimestampwithouttimezoneNOTNULL,updated_attimestampwithouttimezoneNOTNULL);创建表广告(idbigintNOTNULL,company_idbigintNOTNULL,campaign_idbigintNOTNULL,nametextNOTNULL,image_urltext,target_urltext,impressions_countbigintDEFAULT0,clicks_countbigintDEFAULT0,created_attimestampwithouttimezoneNOTNULL,updated_attimestampwithouttimezoneNOTNULL);接下来,您可以像在PostgreSQL中一样在每个表上创建主键查询:ALTERTABLEcompaniesADDPRIMARYKEY(id);ALTERTABLEcampaignsADD主键(id,company_id);ALTERTABLEadsADDPRIMARYKEY(id,company_id);分布表和加载数据我们现在将继续告诉Citus将这些表分布到集群中的不同节点为此,您可以运行create_distributed_table并指定要分片的表和要分片的列。在这种情况下,我们将对company_id上的所有表进行分片。选择create_distributed_table('companies','id');SELECTcreate_distributed_table('campaigns','company_id');SELECTcreate_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命令将我们下载的数据加载到表中。如果您将文件下载到其他位置,请确保指定正确的文件路径。\使用csv从“companies.csv”复制公司\使用csv从“campaigns.csv”复制广告活动\使用csv从“ads.csv”复制广告运行查询现在我们已经将数据加载到表中,让我们继续运行一些查询。Citus支持用于在分布式表中插入和修改行的标准INSERT、UPDATE和DELETE命令,这是与面向用户的应用程序交互的典型方式。例如,您可以通过运行以下命令插入新公司:INSERTINTOcompaniesVALUES(5000,'NewCompany','https://randomurl/image.png',now(),now());要将活动的预算加倍,您可以运行UPDATE命令:UPDATEcampaignsSETmonthly_budget=monthly_budget*2WHEREcompany_id=5;此操作的另一个示例是运行跨多个表的事务。假设您想删除一个活动及其所有关联的广告,您可以通过运行以原子方式执行此操作:BEGIN;DELETEFROMcampaignsWHEREid=46ANDcompany_id=5;DELETEFROMadsWHEREcampaign_id=46ANDcompany_id=5;COMMIT;事务中的每个语句都会导致多节点Citus中的协调器和工作人员之间的往返。对于多租户工作负载,在分布式函数中运行事务效率更高。对于较大的交易,效率的提升会更加明显,但我们可以以上面的小交易为例。首先创建一个执行删除的函数:CREATEORREPLACEFUNCTIONdelete_campaign(company_idint,campaign_idint)RETURNSvoidLANGUAGEplpgsqlAS$fn$BEGINDELETEFROMcampaignsWHEREid=$2ANDcampaigns.company_id=$1;从广告中删除WHEREadsid_campaign=$2ANDads.company_id=$1;END;$fn$;接下来使用create_distributed_function指示Citus直接在worker而不是协调器上运行该函数(除了在单节点Citus安装上,它在协调器上运行所有内容)。它将在持有与值company_id对应的广告和活动表分片的任何工作人员上运行该功能。https://docs.citusdata.com/en/stable/develop/api_udf.html#create-distributed-function。SELECTcreate_distributed_function('delete_campaign(int,int)','company_id',colocate_with:='campaigns');--您可以像往常一样运行函数SELECTdelete_campaign(5,46);除了事务操作之外,您还可以使用标准SQL运行分析查询。公司运营的一个有趣查询是查看其拥有最大预算的活动的详细信息。选择名称、成本模型、州、月度预算来自活动WHEREcompany_id=5ORDERBYmonthly_budgetDESCLIMIT10;我们还可以跨多个表运行连接查询,以查看有关获得最多点击次数和展示次数的正在运行的活动的信息。选择campaigns.id,campaigns.name,campaigns.monthly_budget,sum(impressions_count)作为total_impressions,sum(clicks_count)作为total_clicksFROMads,campaignsWHEREads.company_id=campaigns.company_idANDcampaigns.company_id=5ANDcampaignGUP'campaigns.id,campaigns.name,campaigns.monthly_budgetORDERBYtotal_impressions,total_clicks;我们关于使用Citus为简单的多租户应用程序提供支持的教程到此结束。下一步,您可以查看多租户应用程序部分,了解如何为您自己的多租户数据建模。https://docs.citusdata.com/en/stable/sharding/data_modeling.html#distributing-by-tenant-id。实时应用程序分析在本教程中,我们将演示如何使用Citus获取事件数据并对人工实时数据运行分析查询。为此,我们将使用示例Github事件数据集。数据模型和示例数据我们将演示为实时分析应用程序构建数据库。该应用程序将插入大量事件数据,并以亚秒级延迟对这些数据执行分析查询。在我们的示例中,我们将使用Github事件数据集。该数据集包括Github上的所有公共事件,例如提交、分叉、新问题以及对这些问题的评论。我们将使用两个Postgres表来表示此数据。要开始,您需要下载这些表的示例数据:curlhttps://examples.citusdata.com/tutorial/users.csv>users.csvcurlhttps://examples.citusdata.com/tutorial/events.csv>events如果您使用Docker,应使用dockercp命令将.csv文件复制到Docker容器中。dockercpusers.csvcitus:.dockercpevents.csvcitus:.创建表首先,您可以先使用psql连接到Citus协调器。如果您使用的是本机Postgres,如我们的单节点Citus指南中安装的那样,协调器节点将在端口9700上运行。psql-p9700如果您使用的是Docker,则可以通过使用dockerexec命令运行psql进行连接:dockerexec-它cituspsql-Upostgres然后您可以使用标准的PostgreSQLCREATETABLE命令来创建表。创建表github_events(event_idbigint,event_typetext,event_publicboolean,repo_idbigint,payloadjsonb,repojsonb,user_idbigint,orgjsonb,created_attimestamp);创建表github_users(user_idbigint,url文本,gridaravurl文本,avat,display_login文本);接下来,您可以像在PostgreSQL中一样为事件数据编制索引。在这个例子中,我们还将创建一个GIN索引来更快地查询jsonb字段。在github_events(event_type)上创建索引event_type_index;使用GIN在github_events上创建索引payload_index(payloadjsonb_path_ops);分发表和加载数据我们现在将继续并告诉Citus将这些表分发到集群中的节点。为此,您运行create_distributed_table并指定要分片的表和要分片的列。在这种情况下,我们将对user_id上的所有表进行分片。选择create_distributed_table('github_users','user_id');选择create_distributed_table('github_events','user_id');对用户标识符上的所有表进行分片允许Citus将这些表保持在一起,并允许有效的连接和分布式聚合。然后,您可以继续使用标准PostgreSQL\COPY命令将我们下载的数据加载到表中。如果您将文件下载到其他位置,请确保指定正确的文件路径。\copygithub_usersfrom'users.csv'withcsv\copygithub_eventsfrom'events.csv'withcsvrunqueries现在我们已经将数据加载到表中,让我们继续运行一些查询。首先,让我们检查分布式数据库中有多少用户。从github_users选择计数(*);现在,让我们分析数据中的Github推送事件。我们将首先使用每个推送事件中的不同提交数来计算每分钟的提交数。选择date_trunc('minute',created_at)ASminute,sum((payload->>'distinct_size')::int)ASnum_commitsFROMgithub_eventsWHEREevent_type='PushEvent'GROUPBYminuteORDERBYminute;我们还有一个用户表。我们还可以轻松地将用户加入事件并找到创建最多存储库的前十名用户。选择登录,计数(*)来自github_eventsgeJOINgithub_usersguONge.user_id=gu.user_idWHEREevent_type='CreateEvent'ANDpayload@>'{"ref_type":"repository"}'GROUPBYloginORDERBYcount(*)DESCLIMIT10;Citus还支持用于摄取和修改数据的标准INSERT、UPDATE和DELETE命令。例如,您可以通过运行以下命令来更新用户的显示登录:UPDATEgithub_usersSETdisplay_login='no1youknow'WHEREuser_id=24305673;我们的教程到此结束。下一步,您可以查看实时应用程序部分,了解如何为您自己的数据建模并为实时分析应用程序提供支持。https://docs.citusdata.com/en/stable/sharding/data_modeling.html#distributing-by-entity-id。