- PVSM.RU - https://www.pvsm.ru -

Распределённый SQL [1]представляет новый способ масштабирования реляционных баз данных с помощью полностью автоматизированной и прозрачной для приложений стратегии, подобной шардингу. Распределённые БД SQL изначально спроектированы под практически линейное масштабирование. В текущей статье вы познакомитесь с основами распределённого SQL и узнаете, как начать работу с этими базами данных.
Шардинг представляет ряд сложностей:
Некоторые из этих недостатков можно компенсировать за счёт применения polyglot persistence (использования разных баз данных для разных рабочих нагрузок), движков БД с нативными возможностями шардинга [2] или database proxy [3]. Однако, хоть эти инструменты и помогают решить проблемы с шардингом, они имеют определённые ограничения и вносят дополнительные процессы, требующие постоянного управления.
Распределённый SQL [4] – это новое поколение реляционных баз данных. Простым языком, распределённая БД SQL – это реляционная БД с прозрачным шардингом, которая для приложений выглядит как одна логическая база данных. Реализуются такие БД в виде SN-архитектуры и движка хранения, который масштабирует и чтение, и записи, сохраняя при этом совместимость ACID [5] и высокую доступность. Распределённые БД SQL обладают возможностями масштабирования, присущими БД NoSQL [6] – которые обрели популярность в 2000-х – но без ущерба для согласованности. Они сохраняют преимущества реляционных баз данных и привносят облачную совместимость с межрегиональной отказоустойчивостью.
Существует несколько иной, но смежный по смыслу термин – NewSQL (введённый Мэтью Аслеттом в 2011 году [7]), описывающий масштабируемые и производительные реляционные БД. Однако БД NewSQL не обязательно поддерживают горизонтальную масштабируемость.
Чтобы понять принцип работы распределённого SQL, мы разберём случай MariaDB Xpand [8] – распределённую базу данных SQL, совместимую с опенсорсной MariaDB [9]. Xpand работает путём разделения данных и индексов по узлам и автоматического выполнения таких задач, как перебалансировка данных и выполнение распределённых запросов. С целью минимизации задержки запросы выполняются параллельно. Данные автоматически реплицируются, что гарантирует отсутствие возможных точек сбоя. В случае падения узла Xpand перераспределяет данные среди оставшихся узлов. То же самое происходит при добавлении нового узла.
Компонент под названием rebalancer (перебалансировщик) обеспечивает отсутствие дисбаланса, который представляют проблему при использовании шардинга БД.
Разберём пример. Предположим, что у нас есть экземпляр БД с some_table и набором строк:

Эти данные можно поделить на три части (шарда):

После чего поместить каждый шард в отдельный экземпляр БД:

Так выглядит ручной шардинг базы данных. Распределённая же БД SQL будет делать это автоматически. В случае Xpand каждый шард называется срезом. Строки разбиваются при помощи хэша подмножества столбцов таблицы. Причём разбиваются не только данные, но и индексы, которые также распределяются по узлам (экземплярам базы данных). Более того, для сохранения высокой доступности срезы реплицируются на другие узлы (количество реплик на узел настраивается). Это тоже происходит автоматически:

Когда в кластер добавляется новый узел, или когда один из узлов даёт сбой, Xpand автоматически перераспределяет данные, не требуя ручного вмешательства. Вот что происходит при добавлении узла в предыдущий кластер:

Некоторые строки перемещаются в этот новый узел с целью повышения общей производительности системы. Здесь нужно помнить, что хоть на схеме это и не показано, индексы, также как и реплики, тоже перемещаются и обновляются. А вот чуть более полноценное представление (с немного другой релокацией данных) того же кластера:

Эта архитектура позволяет выполнять практически бесконечное линейное масштабирование. Здесь отсутствует необходимость ручного вмешательства на уровне приложения. Для него этот кластер выглядит как единая логическая база данных. Приложение просто подключается к этой БД через балансировщик нагрузки (MariaDB MaxScale [10]):

Когда приложение отправляет операцию записи (например, INSERT или UPDATE), вычисляется хэш, который передаётся в соответствующий срез. Несколько записей параллельно отправляются на несколько узлов.
Шардинг БД повышает быстродействие, но также вносит дополнительную нагрузку на уровне взаимодействия между узлами. Это может вести к снижению производительности в случае неудачной настройки базы данных или отсутствия оптимизации маршрутизатора запросов. Распределённый SQL может оказаться не лучшей альтернативой в приложениях, выполняющих менее 10К запросов или 5К транзакций в секунду. Кроме того, если ваша база данных состоит преимущественно из множества небольших таблиц, тогда монолитная БД может оказаться более подходящей.
Поскольку распределённая БД SQL выглядит для приложения как единая логическая БД, то начать её использовать несложно. Потребуются лишь:
Docker [14] существенно упрощает вторую часть. Например, MariaDB предлагает образ Docker mariadb/xpand-single, который позволяет запустить базу данных Xpand с одним узлом для оценки, тестирования и разработки.
Для запуска контейнера Xpand выполните:
docker run --name xpand
-d
-p 3306:3306
--ulimit memlock=-1
mariadb/xpand-single
--user "user"
--passwd "password"
Подробности описаны в документации Docker [15].
Примечание: на момент написания статьи образ mariadb/xpand-single недоступен для архитектур ARM. Для них (например, на машинах Apple с процессорами M1) используйте UTM [16], чтобы создать виртуальную машину (ВМ) и установить, скажем, Debian [17]. Далее присвойте имя хоста и через SSH [18] подключитесь к созданной ВМ для установки Docker и создания контейнера MariaDB Xpand.
Подключение к базе данных происходит также, как к корпоративному [19] или комьюнити [20]-серверу MariaDB. Если у вас установлен CLI mariadb, просто выполните:
mariadb -h 127.0.0.1 -u user -p
К базе данных вы можете подключиться с помощью GUI в случае использования БД SQL вроде DBeaver, DataGrip или SQL-расширения для вашей IDE (например, этого [21] для VS Code). Мы же будем использовать бесплатный SQL клиент под названием DbGate. Можете скачать DbGate и запустить его как десктопное приложение или же, раз вы используете Docker, развернуть его в виде веб-приложения, к которому можно будет обратиться из любого места через браузер (по аналогии с популярным phpMyAdmin [22]). Просто выполните следующую команду:
docker run -d --name dbgate -p 3000:3000 dbgate/dbgate
После запуска контейнера перейдите в браузере по адресу http://localhost:3000/ и укажите детали подключения:

Кликните Test и убедитесь в успешной установке подключения:

Кликните Save и создайте новую базу данных, кликнув правой кнопкой на подключении в левой панели и выбрав Create database. Попробуйте создать таблицы либо импортировать SQL-скрипт. Если вы просто хотите поэкспериментировать, то для этого хорошо подойдут базы дынных Nation [23] или Sakila [24].
Для подключения к Xpand из приложений можно использовать коннекторы MariaDB [25]. Существует множество возможных комбинаций языков программирования и фреймворков обеспечения персистентности. Эта тема уже выходит за рамки нашей статьи, но если вы просто хотите начать и посмотреть, как всё работает, то обратите внимание на эту страницу [26] с примерами кода для Java [27], JavaScript, Python [28] и C++ [29].
В этой статье мы узнали, как запустить БД Xpand с одним узлом для разработки и тестирования в противоположность рабочим процессам продакшен-среды. Однако истинный потенциал распределённых БД SQL заключается в их возможности масштабировать не только операции чтения (как при классическом шардинге БД), но и операции записи путём простого добавления узлов и перераспределения данных. И хотя развернуть Xpand в системе со множеством узлов вполне возможно, для использования его в продакшене проще всего задействовать SkySQL [30].
Если вы хотите побольше узнать о распределённом SQL и MariaDB Xpand, то вот список интересных ресурсов:
Автор: Дмитрий Брайт
Источник [35]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/bazy-danny-h/382570
Ссылки в тексте:
[1] Распределённый SQL : https://dzone.com/refcardz/distributed-sql-essentials
[2] движков БД с нативными возможностями шардинга: https://mariadb.com/docs/server/storage-engines/spider/
[3] database proxy: https://mariadb.com/kb/en/mariadb-maxscale-2208-schemarouter/
[4] Распределённый SQL: https://en.wikipedia.org/wiki/Distributed_SQL
[5] ACID: https://en.wikipedia.org/wiki/ACID
[6] БД NoSQL: https://dzone.com/articles/nosql-in-plain-english
[7] введённый Мэтью Аслеттом в 2011 году: https://blogs.451research.com/information_management/2011/04/06/what-we-talk-about-when-we-talk-about-newsql/
[8] MariaDB Xpand: https://mariadb.com/products/enterprise/xpand/
[9] MariaDB: https://mariadb.com/
[10] MariaDB MaxScale: https://mariadb.com/docs/xpand/products/mariadb-maxscale/
[11] DBeaver: https://dbeaver.io/
[12] DbGate: https://dbgate.org/
[13] DataGrip: https://www.jetbrains.com/datagrip/
[14] Docker: https://www.docker.com/
[15] документации Docker: https://hub.docker.com/r/mariadb/xpand-single
[16] UTM: https://mac.getutm.app/
[17] Debian: https://www.debian.org/
[18] SSH: https://en.wikipedia.org/wiki/Secure_Shell
[19] корпоративному: https://mariadb.com/products/enterprise/
[20] комьюнити: https://mariadb.com/products/community-server/
[21] этого: https://marketplace.visualstudio.com/items?itemName=cweijan.vscode-database-client2
[22] phpMyAdmin: https://www.phpmyadmin.net/
[23] Nation: https://www.mariadbtutorial.com/getting-started/mariadb-sample-database/
[24] Sakila: https://github.com/jOOQ/sakila/tree/main/mysql-sakila-db
[25] коннекторы MariaDB: https://mariadb.com/docs/server/connect/programming-languages/
[26] страницу: https://mariadb.com/developers/quickstart/
[27] Java: https://dzone.com/refcardz/core-java
[28] Python: https://dzone.com/refcardz/core-python
[29] C++: https://dzone.com/refcardz/core-cpp
[30] SkySQL: https://mariadb.com/products/skysql/
[31] MariaDB Xpand for distributed SQL (video animation): https://www.youtube.com/watch?v=TAvKGl0eCKI
[32] MariaDB Xpand documentation: https://mariadb.com/docs/xpand/
[33] Taking Distributed SQL to the Next Level with Columnar Indexing (talk): https://www.youtube.com/watch?v=y1ahXZn0nWQ&t=5s&ab_channel=MariaDB
[34] Getting Started With Distributed SQL (refcard): https://dzone.com/refcardz/getting-started-with-distributed-sql
[35] Источник: https://habr.com/ru/post/714322/?utm_source=habrahabr&utm_medium=rss&utm_campaign=714322
Нажмите здесь для печати.