微服务

本教程使用 Azure Cosmos DB for PostgreSQL 作为多个微服务的存储后端,演示了此类群集的示例设置和基本操作。 了解如何:

  • 创建群集
  • 为微服务创建角色
  • 使用 psql 实用工具创建角色和分布式架构
  • 为示例服务创建表
  • 配置 服务
  • 运行服务
  • 浏览数据库

适用对象: Azure Cosmos DB for PostgreSQL(由 PostgreSQL 的 Citus 数据库扩展提供支持)

先决条件

如果没有 Azure 订阅,请在开始前创建一个试用版订阅帐户。

创建群集

登录到 Azure 门户,并按照以下步骤创建 Azure Cosmos DB for PostgreSQL 群集:

转到 Azure 门户中的创建 Azure Cosmos DB for PostgreSQL 群集

在“创建适用于 PostgreSQL 的 Azure Cosmos DB 群集”窗体上:

  1. 在“基本信息”选项卡上填写相关信息。

    显示“创建”屏幕的“基本信息”选项卡的屏幕截图。

    大多数选项都是一目了然的,但请记住:

    • 群集名称决定应用程序用来进行连接的 DNS 名称(采用 <node-qualifier>-<clustername>.<uniqueID>.postgres.database.chinacloudapi.cn 格式)。
    • 可以选择主要 PostgreSQL 版本,例如 15。 Azure Cosmos DB for PostgreSQL 始终支持所选主要 Postgres 版本的最新 Citus 版本。
    • 管理员用户名必须是值 citus
    • 可以将数据库名称保留为默认值“citus”,也可以定义唯一的数据库名称。 预配群集后无法重命名数据库。
  2. 在屏幕底部选择“下一步: 网络”。

  3. 在“网络”屏幕中,选择“允许从 Azure 内的 Azure 服务和资源公开访问此群集”。

    显示“创建”屏幕的“网络”选项卡的屏幕截图。

  4. 选择“查看 + 创建”,在验证通过时,选择“创建”以创建群集。

  5. 预配需要数分钟。 页面会重定向,以监视部署。 当状态从“部署进行中”更改为“部署已完成”时,请选择“转到资源”。

为微服务创建角色

分布式架构可在 Azure Cosmos DB for PostgreSQL 群集中重新定位。 系统可以在可用节点中将其重新平衡为整个单元,从而可以有效地共享资源,而无需手动分配。

根据设计,微服务拥有存储层,我们不对它们创建和存储的表和数据的类型做出任何假设。 我们为每个服务提供一个架构,并假定它们使用不同的 ROLE 连接到数据库。 当用户连接时,其角色名称将放在 search_path 的开头,因此,如果角色与架构名称匹配,则不需要任何应用程序更改来设置正确的 search_path。

在本示例中,我们使用三个服务:

  • user
  • time
  • ping

按照描述如何创建用户角色的步骤操作,并为每个服务创建以下角色:

  • userservice
  • timeservice
  • pingservice

使用 psql 实用工具创建分布式架构

使用 psql 连接到适用于 PostgreSQL 的 Azure Cosmos DB 后,可以完成一些基本任务。

可通过两种方式在 Azure Cosmos DB for PostgreSQL 中分发架构:

通过调用 citus_schema_distribute(schema_name) 函数手动操作:

CREATE SCHEMA AUTHORIZATION userservice;
CREATE SCHEMA AUTHORIZATION timeservice;
CREATE SCHEMA AUTHORIZATION pingservice;

SELECT citus_schema_distribute('userservice');
SELECT citus_schema_distribute('timeservice');
SELECT citus_schema_distribute('pingservice');

此方法还允许将现有常规架构转换为分布式架构。

注意

只能分发不包含分布式表和引用表的架构。

替代方法是启用 citus.enable_schema_based_sharding 配置变量:

SET citus.enable_schema_based_sharding TO ON;

CREATE SCHEMA AUTHORIZATION userservice;
CREATE SCHEMA AUTHORIZATION timeservice;
CREATE SCHEMA AUTHORIZATION pingservice;

可以针对当前会话更改变量,也可以在协调器节点参数中永久更改。 将参数设置为 ON 时,默认情况下会分发所有创建的架构。

可以通过运行以下命令列出当前的分布式架构:

select * from citus_schemas;
 schema_name | colocation_id | schema_size | schema_owner
-------------+---------------+-------------+--------------
 userservice |             5 | 0 bytes     | userservice
 timeservice |             6 | 0 bytes     | timeservice
 pingservice |             7 | 0 bytes     | pingservice
(3 rows)

为示例服务创建表

现在,需要连接到每个微服务的 Azure Cosmos DB for PostgreSQL。 可以使用 \c 命令交换现有 psql 实例中的用户。

\c citus userservice
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    email VARCHAR(255) NOT NULL
);
\c citus timeservice
CREATE TABLE query_details (
    id SERIAL PRIMARY KEY,
    ip_address INET NOT NULL,
    query_time TIMESTAMP NOT NULL
);
\c citus pingservice
CREATE TABLE ping_results (
    id SERIAL PRIMARY KEY,
    host VARCHAR(255) NOT NULL,
    result TEXT NOT NULL
);

配置 服务

在本教程中,我们使用一组简单的服务。 可以通过克隆此公共存储库来获取它们:

git clone https://github.com/citusdata/citus-example-microservices.git
$ tree
.
├── LICENSE
├── README.md
├── ping
│   ├── app.py
│   ├── ping.sql
│   └── requirements.txt
├── time
│   ├── app.py
│   ├── requirements.txt
│   └── time.sql
└── user
    ├── app.py
    ├── requirements.txt
    └── user.sql

但是,在运行服务之前,请编辑 user/app.pyping/app.pytime/app.py 文件,它们为 Azure Cosmos DB for PostgreSQL 群集提供 连接配置:

# Database configuration
db_config = {
    'host': 'c-EXAMPLE.EXAMPLE.postgres.cosmos.azure.cn',
    'database': 'citus',
    'password': 'SECRET',
    'user': 'pingservice',
    'port': 5432
}

进行更改后,保存所有修改的文件,然后继续执行运行服务的下一步。

运行服务

更改为每个应用目录,并在各自的 python env 中运行它们。

cd user
pipenv install
pipenv shell
python app.py

对时间和 ping 服务重复命令,之后可以使用 API。

创建一些用户:

curl -X POST -H "Content-Type: application/json" -d '[
  {"name": "John Doe", "email": "john@example.com"},
  {"name": "Jane Smith", "email": "jane@example.com"},
  {"name": "Mike Johnson", "email": "mike@example.com"},
  {"name": "Emily Davis", "email": "emily@example.com"},
  {"name": "David Wilson", "email": "david@example.com"},
  {"name": "Sarah Thompson", "email": "sarah@example.com"},
  {"name": "Alex Miller", "email": "alex@example.com"},
  {"name": "Olivia Anderson", "email": "olivia@example.com"},
  {"name": "Daniel Martin", "email": "daniel@example.com"},
  {"name": "Sophia White", "email": "sophia@example.com"}
]' http://localhost:5000/users

列出已创建的用户:

curl http://localhost:5000/users

获取当前时间:

Get current time:

针对 example.com 运行 ping:

curl -X POST -H "Content-Type: application/json" -d '{"host": "example.com"}' http://localhost:5002/ping

浏览数据库

调用某些 API 函数后,数据已存储,你可以检查 citus_schemas 是否反映预期内容:

select * from citus_schemas;
 schema_name | colocation_id | schema_size | schema_owner
-------------+---------------+-------------+--------------
 userservice |             1 | 112 kB      | userservice
 timeservice |             2 | 32 kB       | timeservice
 pingservice |             3 | 32 kB       | pingservice
(3 rows)

创建架构时,没有告知 Azure Cosmos DB for PostgreSQL 要在哪台计算机上创建架构。 此过程是自动完成的。 可以使用以下查询查看每个架构所在的位置:

  select nodename,nodeport, table_name, pg_size_pretty(sum(shard_size))
    from citus_shards
group by nodename,nodeport, table_name;
nodename  | nodeport |         table_name         | pg_size_pretty
-----------+----------+---------------------------+----------------
 localhost |     9701 | timeservice.query_details | 32 kB
 localhost |     9702 | userservice.users         | 112 kB
 localhost |     9702 | pingservice.ping_results  | 32 kB

为使本页示例输出简明扼要,我们不使用 nodename,如 Azure Cosmos DB for PostgreSQL 中所示,而是将它替换为 localhost。 假设 localhost:9701 为辅助角色 1,localhost:9702 为辅助角色 2。 托管服务上的节点名称更长,并且包含随机元素。

可以看到,时间服务位于节点 localhost:9701 上,而用户和 ping 服务共享第二个辅助角色 localhost:9702 的空间。 示例应用比较简单,此处的数据大小是可忽略的,但假设你对节点之间的存储空间利用率不均衡感到不满。 将两个较小的时间和 ping 服务放在一台机器上,而将大型用户服务单独放在一台机器上,这样会更合理。

可以轻松地按磁盘大小重新平衡群集:

select citus_rebalance_start();
NOTICE:  Scheduled 1 moves as job 1
DETAIL:  Rebalance scheduled as background job
HINT:  To monitor progress, run: SELECT * FROM citus_rebalance_status();
 citus_rebalance_start
-----------------------
                     1
(1 row)

完成后,可以检查新布局的外观:

  select nodename,nodeport, table_name, pg_size_pretty(sum(shard_size))
    from citus_shards
group by nodename,nodeport, table_name;
 nodename  | nodeport |         table_name        | pg_size_pretty
-----------+----------+---------------------------+----------------
 localhost |     9701 | timeservice.query_details | 32 kB
 localhost |     9701 | pingservice.ping_results  | 32 kB
 localhost |     9702 | userservice.users         | 112 kB
(3 rows)

根据预期,架构已移动,并且我们有一个更均衡的群集。 此操作对于应用程序是透明的。 你甚至不需要重启它们,它们会继续为查询提供服务。

后续步骤

本教程介绍了如何创建分布式架构,并使用它们作为存储运行微服务。 你还了解了如何探索和管理基于架构的分片 Azure Cosmos DB for PostgreSQL。