Серверные системы управления базами данных и встраиваемые базы данных: сравнение архитектуры и характеристик ввода-вывода

Серверная база данных
Серверная база данных — это база данных, которая работает как отдельный серверный процесс и обрабатывает запросы приложений через сеть. Большинство RDBMS, знакомых нам, таких как MySQL, PostgreSQL и Oracle DB, относятся к этой модели. Серверная база данных обладает следующими преимуществами.
- Централизованное управление: данные управляются в едином месте, что упрощает обеспечение согласованности, безопасности, резервное копирование и восстановление.
- Независимость ресурсов: выделяются собственные ресурсы CPU, памяти и хранилища, что гарантирует стабильную производительность независимо от состояния приложения.
- Высокая параллельность и масштабируемость: система оптимизирована для одновременного доступа большого числа пользователей, а горизонтальное масштабирование через кластеризацию или репликацию относительно нетрудоемко.
Благодаря этим особенностям серверная база данных на протяжении последних десятилетий утвердилась как стандарт программной инфраструктуры. Однако вследствие развития технологий и изменения среды недостатки серверной базы данных начали проявляться в некоторых условиях, и в качестве альтернативы вновь привлекают внимание встраиваемые базы данных.
Новое направление: встраиваемая база данных
Встраиваемая база данных — это движок базы данных, который включается в приложение в виде библиотеки и работает внутри того же процесса без отдельного серверного процесса. Наиболее известными примерами встраиваемых баз данных являются SQLite, LevelDB и RocksDB. Причины, по которым встраиваемые базы данных стали сильной альтернативой в современной технологической среде, следующие.
Появление SSD
В прежних системах с HDD произвольный доступ к данным значительно уступал по производительности последовательному чтению и записи. Поэтому ключевыми методами оптимизации производительности были минимизация дисковых операций ввода-вывода и максимальное использование кэширования в памяти. Серверные базы данных соответствующим образом использовали крупные кэши и объединяли операции записи, преодолевая физические ограничения HDD.
Однако появление SSD полностью изменило эту предпосылку. SSD значительно быстрее HDD по производительности произвольного ввода-вывода, в тысячи раз и более, а задержки у них существенно меньше. В результате прежнее представление о том, что «дисковый ввод-вывод является главным узким местом», утратило актуальность, и, напротив, задержки при удаленном доступе к серверу баз данных по сети начали выступать в качестве нового узкого места.
MSA и независимость данных
Ранее типичной была структура, в которой одно большое монолитное приложение зависело от одной централизованной базы данных. Такой подход был простым, но по мере роста масштаба сервиса возникали трудности с изменением схемы данных, а поскольку все сервисы использовали одну и ту же базу данных, связанность становилась чрезмерно сильной.
В современной архитектуре микросервисов для решения этих проблем важен принцип «Database per Service». Каждый сервис владеет собственным выделенным хранилищем данных и инкапсулирует его, что обеспечивает независимость сервисов друг от друга, упрощает изоляцию отказов и масштабирование. В этом контексте встраиваемая база данных становится идеальным выбором хранилища данных на уровне сервиса. Она легковесна и быстра, а поскольку может развертываться вместе с кодом сервиса, хорошо сочетается со средой MSA.
В частности, в среде Kubernetes широко применяется подход с использованием паттерна sidecar, при котором встраиваемая база данных размещается рядом с контейнером приложения для оптимизации локальной обработки данных. Это позволяет уменьшить сетевые узкие места и свести к минимуму задержку доступа к данным.
Упрощение операционной среды
Серверная база данных требует сложных операционных процедур, включая установку, обновление, резервное копирование, восстановление после сбоев, репликацию и мониторинг производительности, а для этого необходимы выделенные DBA и квалифицированный операционный персонал. Особенно в крупномасштабных средах эта нагрузка по управлению очень велика.
Встраиваемая база данных существенно смягчает эти проблемы. Когда база данных интегрирована внутрь приложения, модульное тестирование, сборка, управление версиями и развертывание выполняются вместе, поэтому отдельное серверное администрирование не требуется. Кроме того, при горизонтальном масштабировании приложения встраиваемая база данных масштабируется вместе с ним, а автоматизированное управление через культуру DevOps и конвейеры CI/CD становится возможным. Особенно в стартапах, небольших сервисах и средах разработки прототипов встраиваемые базы данных существенно снижают сложность эксплуатации и заметно ускоряют разработку и развертывание.
Развитие высокопроизводительных системных языков и экосистемы
Ранее базы данных и приложения, как правило, разрабатывались на разных языках. Например, движки баз данных, требующие высокой производительности, в основном писались на C и C++, а приложения разрабатывались на Java, Python, PHP и других языках. Такой подход был эффективен для оптимизации производительности, но имел ограничения: проблемы с безопасностью памяти, сложная обработка параллелизма, задержки, а также трудности с интеграцией библиотек и развертыванием.
Однако с появлением современных языков системного программирования, таких как Go и Rust, эти ограничения значительно уменьшились. В частности, Go подходит не только для высокопроизводительных приложений, но и для написания низкоуровневых программ, таких как движки баз данных, что позволяет работать с базой данных и приложением в рамках одной языковой экосистемы.
Действительно, в Golang активно используются высокопроизводительные встраиваемые базы данных, такие как BadgerDB и PebbleDB. Это означает, что встраиваемая база данных перестает быть лишь облегченной альтернативой серверной базе данных и становится важным выбором, обладающим собственной конкурентоспособностью.
Заключение
В условиях, требующих централизованного управления большими объемами данных, сложных транзакций и высокой параллельности, серверная база данных по-прежнему остается самым мощным решением. Однако для отдельных сервисов в среде MSA, устройств IoT на периферии, быстрого прототипирования и проектов, где важна операционная эффективность, встраиваемая база данных может стать более эффективным и рациональным выбором. В конечном счете важно выбрать оптимальный инструмент, наилучшим образом соответствующий конкретной ситуации и требованиям, и развитие встраиваемых баз данных предоставляет нам более широкий и разнообразный выбор.