Как стать автором
Обновить

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

Время на прочтение4 мин
Количество просмотров5.7K


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

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

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



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

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

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

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

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


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

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

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

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


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



Transaction

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

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()
        {
            var connection = new NpgsqlConnection(_connectionString)
            {
                ProvideClientCertificatesCallback = certificates =>
                {
                    certificates.Add(new X509Certificate2(_cert));
                },
                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 пока еще не успела устранить.

Ссылки


Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Планируете ли вы использовать сервис Managed Databases от Digital Ocean?
31.71% Да13
17.07% Да, но нужная база пока еще не представлена (MySQL, Redis)7
39.02% Нет16
12.2% Планирую использовать аналогичный сервис от другого вендора5
Проголосовал 41 пользователь. Воздержались 14 пользователей.
Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
Всего голосов 12: ↑12 и ↓0+12
Комментарии3

Публикации

Истории

Работа

.NET разработчик
49 вакансий

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань