您现在访问的是微软AZURE全球版技术文档网站,若需要访问由世纪互联运营的MICROSOFT AZURE中国区技术文档网站,请访问 https://docs.azure.cn.

快速入门:在 Azure 门户中创建超大规模 (Citus) 服务器组

用于 PostgreSQL 的 Azure 数据库是一种托管服务,可用于在云中运行、管理和缩放具有高可用性的 PostgreSQL 数据库。 本快速入门介绍如何使用 Azure 门户创建 Azure Database for PostgreSQL - 超大规模 (Citus) 服务器组。 你将探究分布式数据:在节点之间将表分片、引入示例数据,以及运行在多个节点上执行的查询。

创建 Hyperscale (Citus) 服务器组

如果没有 Azure 订阅,请在开始之前创建一个免费帐户。

登录到 Azure 门户

登录到 Azure 门户

可以按照以下步骤创建用于 PostgreSQL 的 Azure 数据库:

  1. 在 Azure 门户的左上角单击“创建资源”。

  2. 从“新建”页中选择“数据库”,并从“数据库”页中选择“用于 PostgreSQL 的 Azure 数据库”。

  3. 对于部署选项,请单击“Hyperscale (Citus) 服务器组”下的“创建”按钮。

  4. 使用以下信息填写“新服务器详细信息”窗体:

    • 资源组:单击此字段的文本框下的“新建”链接。 输入一个名称,例如 myresourcegroup
    • 服务器组名称:输入新服务器组的唯一名称,该名称也将用于服务器子域。
    • 管理员用户名:当前必须是值 citus,并且不能更改。
    • 密码:长度必须至少为八个字符,且必须包含以下类别中三种类别的字符 - 英文大写字母、英文小写字母、数字 (0-9) 和非字母数字字符(!、$、#、%,等等。)
    • 位置:使用距离你的用户最近的位置,使用户可以最快速度访问数据。

    重要

    登录到服务器及其数据库时需要使用在此处指定的服务器管理员密码。 请牢记或记录此信息,以后会使用到它。

  5. 单击“配置服务器组”。 保留该部分的设置不变,单击“保存”。

  6. 单击屏幕底部的“下一步”>“网络”。

  7. 在“网络”选项卡中,单击“公共终结点”单选按钮。 已选择公共终结点

  8. 单击链接“+ 添加当前客户端 IP 地址”。 已添加客户端 IP

    备注

    Azure PostgreSQL 服务器通过端口 5432 进行通信。 如果尝试从企业网络内部进行连接,则该网络的防火墙可能不允许经端口 5432 的出站流量。 如果是这样,则除非 IT 部门打开端口 5432,否则无法连接到超大规模 (Citus) 群集。

  9. 单击“查看 + 创建”,然后单击“创建”,预配服务器。 预配需要数分钟。

  10. 页面会重定向,以监视部署。 当实时状态从“部署正在进行”变为“部署已完成”时,单击页面左侧的“输出”菜单项。

  11. 输出页将包含协调器主机名,主机名旁边有一个按钮,用于将值复制到剪贴板。 记录此信息以供将来使用。

使用 psql 连接到数据库

创建 Azure Database for PostgreSQL 服务器时,会创建名为 citus 的默认数据库。 若要连接到你的数据库服务器,需要具有连接字符串和管理员密码。

  1. 获取连接字符串值。 在服务器组页面中,单击“连接字符串”菜单项。 (该项位于“设置”下方。)查找标为“psql”的字符串。 它的形式如下:

    psql "host=hostname.postgres.database.azure.com port=5432 dbname=citus user=citus password={your_password} sslmode=require"
    

    复制此字符串。 你需要将“{your_password}”替换为你之前选择的管理员密码。 系统不存储你的纯文本密码,因此无法在连接字符串中为你显示密码。

  2. 在本地计算机上打开一个终端窗口。

  3. 在提示符下,使用 psql 实用工具连接到你的 Azure Database for PostgreSQL 服务器。 将连接字符串放在引号中传递,请确保其中包含密码:

    psql "host=..."
    

    例如,以下命令连接到服务器组 mydemoserver 的协调器节点:

    psql "host=mydemoserver-c.postgres.database.azure.com port=5432 dbname=citus user=citus password={your_password} sslmode=require"
    

创建和分布表

使用 psql 连接到 Hyperscale 协调器节点后,可以完成一些基本任务。

超大规模 (Citus) 服务器中有三种类型的表:

  • 分布式表或分片表(分散在不同的位置以帮助进行缩放,从而提高性能并便于并行化)
  • 引用表(保留多个副本)
  • 本地表(通常用于内部管理表)

本快速入门重点介绍分布式表,以帮助读者熟悉此类表。

我们要使用的数据模型非常简单:来自 GitHub 的用户和事件数据。 事件包括分叉创建、组织相关的 git 提交,等等。

通过 psql 建立连接后,让我们来创建表。 在 psql 控制台中运行:

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
);

github_eventspayload 字段包含 JSONB 数据类型。 JSONB 是 Postgres 中采用二进制格式的 JSON 数据类型。 使用此数据类型,可以方便在单个列中存储灵活的架构。

Postgres 可以基于此类型创建 GIN 索引,以便为表中的每个键和值编制索引。 通过索引可以使用各种条件快速轻松地查询有效负载。 在加载数据之前,让我们继续创建几个索引。 在 psql 中:

CREATE INDEX event_type_index ON github_events (event_type);
CREATE INDEX payload_index ON github_events USING GIN (payload jsonb_path_ops);

接下来,我们将这些 Postgres 表放到协调器节点上,并告知超大规模 (Citus) 在工作器之间将这些表分片。 为此,我们将针对每个表运行一个查询,指定将该表分片所依据的键。 在当前示例中,我们要将 user_id 上的事件和用户表分片:

SELECT create_distributed_table('github_events', 'user_id');
SELECT create_distributed_table('github_users', 'user_id');

重要

若要利用超大规模性能功能,需要分发表。 如果不分发表,则工作器节点无法帮助运行涉及这些表的查询。

现已准备好加载数据。 仍然在 psql 中,执行 shell 命令来下载文件:

\! curl -O https://examples.citusdata.com/users.csv
\! curl -O https://examples.citusdata.com/events.csv

接下来,将数据从文件加载到分布式表中:

SET CLIENT_ENCODING TO 'utf8';

\copy github_events from 'events.csv' WITH CSV
\copy github_users from 'users.csv' WITH CSV

运行查询

接下来的操作比较有趣,但实际上只是运行几个查询。 让我们从一个简单的 count (*) 着手,以查看加载的数据量:

SELECT count(*) from github_events;

查询非常顺利。 稍后我们会花点时间来了解聚合,但我们先看看其他几个查询。 JSONB payload 列中包含许多数据,但具体的数据根据事件类型而异。 PushEvent 事件包含一个大小,它反映了推送操作的非重复提交次数。 我们可以使用该大小找到每小时的提交总次数:

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

到目前为止,查询只是涉及到 github_events,但我们可将这些信息与 github_users 合并。 由于我们基于同一个标识符 (user_id) 分片了用户和事件,因此,这两个表中具有匹配用户 ID 的行将共置到同一个数据库节点,并可以轻松联接。

如果按 user_id 进行联接,则超大规模 (Citus) 可将联接执行下推到分片中,以便在工作器节点上并行执行。 例如,让我们查找创建了最多存储库的用户:

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

清理资源

在前面的步骤中,你已在服务器组中创建了 Azure 资源。 如果你认为以后不需要这些资源,请删除该服务器组。 在服务器组的“概述”页中,按“删除”按钮 。 弹出页面上出现提示时,请确认服务器组的名称,然后单击最后一个“删除”按钮 。

后续步骤

在本快速入门中,你已了解如何预配 Hyperscale (Citus) 服务器组。 你已使用 psql 连接到该组,创建了架构并分布了数据。