Хабрахабр

Работа с сервисом Managed Databases от Digital Ocean в .NET Core

Но 14 февраля, в день всех влюбленных, компания решила сделать подарок своим клиентам и в режиме Limited Availability запустила сервис Managed Databases. В том время, как у других облачных платформ уже давно есть свои решения для баз данных, Digital Ocean в этом сегменте до сегодняшнего дня ничего не предлагал.

NET Core, я не мог обойти вниманием это событие. Поскольку Digital Ocean сейчас является довольно популярной платформой для хостинга небольшой проектов на .

NET Core в я расскажу в этой публикации.
Как работает сервис и какие есть нюансы при подключении к базе при использовании .

На очереди MySQL и Redis. На сегодняшний день доступно создание баз данных PostrgeSQL версий 10 и 11.

По утверждению Digital Ocean, сервис управляемых баз данных решает общие проблемы, с которыми сталкиваются многие компании и разработчики при создании кластера с нуля:

  • Определение оптимальной инфраструктуры
  • Масштабирование инфраструктуры по мере роста требований к бизнесу и данным
  • Проектирование и управление высокодоступной инфраструктурой и процессами аварийного переключения
  • Реализация стратегии резервного копирования и восстановления
  • Прогнозирование и поддержание эксплуатационных расходов на инфраструктуру

На сегодняшний день создание самой компактной базы обойдется вам в $15. Самая дорогая конфигурация может обойтись в более чем две тысячи долларов в месяц.

Пулы подключений

Когда клиент подключается напрямую к базе данных PostgreSQL, сервер создает процесс для обработки этого подключения. Каждое отдельное соединение требует примерно 10 МБ ОЗУ и использует эту память до тех пор, пока не будет закрыто. Кроме того, общее количество подключений является фиксированным, и когда все подключения используются, новые клиенты уже не смогут подключиться.

Пул соединений уменьшает проблемы с производительностью, направляя клиентские соединения в приложение пула, тем самым уменьшая количество процессов, которые база данных должна обрабатывать. Digital Ocean позволяет создавать пулы подключений, которые работают на базе PgBouncer. Приложение пула передает часть соединений базе, а остальные ставит в очередь, где они находятся до тех пор, пока не база не освободится для новых подключений.

Им нужно будет только подключиться к пулу и отключиться после завершения задачи. При использовании пула соединений приложениям не нужно управлять фактическим соединением.

Создание пула

Создать пул соединений, очень просто — нужно открыть кластер и перейти на вкладку Connection Pools. DigitalOcean поддерживает три вида пулинга:

Transaction

Если отправляется больше транзакций, чем доступно в пуле, дополнительные транзакции ставятся в очередь и обрабатываются после того, как соединения станут доступны. Этот режим позволяет каждому клиенту использовать пул одновременно для одной транзакции. Эти клиенты будут поддерживать свое соединение с пулом, не устанавливая при этом соединение с PostgreSQL. Режим Transaction подходит, когда у вас есть большое количество клиентов, которые используют простаивающие подключения.

Session

Если подключается больше клиентов, чем дрступно для обработки в пуле, то эти клиенты ставятся в очередь и подключаются после отключения существующего клиента. Этот режим позволяет клиенту обрабатывать запросы до тех пор, пока он не отключится от базы данных, поддерживая соединение с этим клиентом все время.

Statement

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

Их можно посмотреть нажам на ссылку Connection details: После создания пула, для подключения к базе нужно использовать параметры пула.

Подключение к пулу

В своих проектах я использую Npgsql, поэтому дальнейшие примеры будут подразумевать использование этого драйвера.

Строка подключения будет выглядеть следующим образом:

User ID=xxx;Password=xxxx;Host=xxx.db.ondigitalocean.com;Port=xxx;Database=pool_name;Pooling=false;SslMode=Require;Server Compatibility Mode=Redshift;

На что стоит обратить внимание:

  • Параметр Database будет содержать не название базы, а название пула, через который будет происходить подключение к базе.
  • Параметр Pooling будет установлен в значение false. Пулом подключения будет управлять PgBouncer, а не драйвер.
  • Параметр SslMode должен иметь значение Require, так как будет необходим сертификат для открытия подключения.
  • Параметр Server Compatibility Modeнужно инициализировать значение Redshift. Это позволит избежать ряда проблем при работе драйвера npgsql через PgBouncer.

Метод подготовки подключения будет выглядеть следующим образом:

protected async Task<IDbConnection> CreateConnection() , UserCertificateValidationCallback = CertificateValidation() }; await connection.OpenAsync(); return connection; } private RemoteCertificateValidationCallback CertificateValidation() => (sender, certificate, chain, errors) => { if (errors == SslPolicyErrors.None) return true; if ((errors & SslPolicyErrors.RemoteCertificateChainErrors) != 0) { var allErrorsIsUntrustedRoot = chain? .ChainStatus .All(o => o.Status == X509ChainStatusFlags.UntrustedRoot); return allErrorsIsUntrustedRoot ?? true; } return true; };

Тут стоит обратить внимание на два момента.

  • Первый. При создании подключения необходимо использовать сертификат. Его можно скачать в диалоге просмотра параметров подключения к пулу. Подключение сертификата настраивается через ProvideClientCertificatesCallback.
  • Второй. Процедура проверки сертификата пула, которая настраивается через RemoteCertificateValidationCallback. В моем примере используется небольшой хак, который позволяет игнорировать ошибку, которая возникает из-за того, что проверка корневого сертификата не срабатывает.

Не стоит забывать, что сервис на данный момент предоставляется в режиме LIMITED AVAILABILITY, что означает, что часть функциональности еще может расширяться и во время работы с сервисов могут возникать проблемы, которые команда DO пока еще не успела устранить.

Ссылки

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть