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