Поделиться через


Микрослужбы

В этом руководстве вы используете Azure Cosmos DB для PostgreSQL в качестве серверной части хранилища для нескольких микрослужб, демонстрируя пример установки и базовую операцию такого кластера. Вы узнаете, как выполнять следующие задачи:

  • Создание кластера
  • Создание ролей для микрослужб
  • Использование служебной программы psql для создания ролей и распределенных схем
  • Создание таблиц для примеров служб
  • Настройка служб
  • Запуск служб
  • Изучение базы данных

Область применения: Azure Cosmos DB для PostgreSQL (на базе расширения базы данных Citus до PostgreSQL)

Необходимые компоненты

Если у вас нет подписки Azure, создайте бесплатную учетную запись, прежде чем приступить к работе.

Создание кластера

Войдите в портал Azure и выполните следующие действия, чтобы создать кластер Azure Cosmos DB для PostgreSQL:

Перейдите к разделу Создание кластера Azure Cosmos DB for PostgreSQL на портале Azure.

В форме кластера Create a Azure Cosmos DB for PostgreSQL:

  1. Укажите сведения на вкладке Основные сведения.

    Снимок экрана: вкладка

    Назначение большинства параметров очевидно из их названия, но примите во внимание следующее:

    • Имя кластера определяет DNS-имя, используемое для подключения приложений, в форме <node-qualifier>-<clustername>.<uniqueID>.postgres.cosmos.azure.com.
    • Вы можете выбрать основную версию PostgreSQL, например 15. Azure Cosmos DB для PostgreSQL всегда поддерживает последнюю версию Citus для выбранной основной версии Postgres.
    • Для имени администратора должно быть установлено значение citus.
    • Вы можете оставить имя базы данных по умолчанию citus или определить только имя базы данных. После подготовки кластера невозможно переименовать базу данных.
  2. Выберите Далее: Сеть в нижней части экрана.

  3. На экране "Сеть" выберите "Разрешить общедоступный доступ" из служб и ресурсов Azure в этом кластере.

    Снимок экрана: вкладка

  4. Выберите элемент Просмотр и создание, а по завершении проверки нажмите кнопку Создать, чтобы создать кластер.

  5. Подготовка занимает несколько минут. Вы перейдете на страницу отслеживания развертывания. Когда состояние изменится с Выполняется развертывание на Развертывание выполнено, выберите элемент Перейти к ресурсу.

Создание ролей для микрослужб

Распределенные схемы перемещаются в кластере Azure Cosmos DB для PostgreSQL. Система может перебалансировать их в целом по доступным узлам, что позволяет эффективно совместно использовать ресурсы без выделения вручную.

При проектировании микрослужбы имеют свой уровень хранения, мы не делаем никаких предположений о типе таблиц и данных, которые они создают и хранят. Мы предоставляем схему для каждой службы и предполагаем, что они используют отдельную роль для подключения к базе данных. При подключении пользователя имя роли помещается в начало search_path, поэтому если роль совпадает с именем схемы, для установки правильного search_path не требуется никаких изменений приложения.

В нашем примере мы используем три службы:

  • Пользователь
  • Время
  • проверка связи

Выполните действия, описывающие создание ролей пользователей и создание следующих ролей для каждой службы:

  • userservice
  • timeservice
  • pingservice

Использование служебной программы psql для создания распределенных схем

После подключения к Azure Cosmos DB для PostgreSQL с помощью psql можно выполнить некоторые основные задачи.

Существует два способа распространения схемы в Azure Cosmos DB для 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 для 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.py и time/app.py файлы, предоставляющие конфигурацию подключения для кластера Azure Cosmos DB для PostgreSQL:

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

После внесения изменений сохраните все измененные файлы и перейдите к следующему шагу запуска служб.

Запуск служб

Перейдите в каждый каталог приложений и запустите их в собственном env python.

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:

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 для 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 для PostgreSQL мы заменим его на localhost. Предположим, что localhost:9701 рабочий один и localhost:9702 является рабочим двумя. Имена узлов в управляемой службе длиннее и содержат случайные элементы.

Вы можете увидеть, что служба времени приземлилась на узле localhost:9701 , а пользователь и ping service share space on the second worker 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 для PostgreSQL и управлять ими.

  • Сведения о типах узлов кластера