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


Микрослужбы

Это важно

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

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

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

Предварительные условия

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

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

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

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

На форме Создать кластер Azure Cosmos DB для 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
}

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

Запуск служб

Перейдите в каждый каталог приложения и запустите их в их собственных виртуальных окружениях 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:

Запустите команду ping на 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 делят пространство на втором рабочем узле 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.

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