Как сделать разделение чтения/записи базы данных с помощью вашего браузера
10 декабря 2022 г.Разделение чтения/записи — это метод маршрутизации операций чтения и записи на несколько серверов баз данных, позволяющий выполнять балансировку нагрузки на основе запросов. Реализовать это на уровне приложения сложно, поскольку код или параметры конфигурации связываются с базовой топологией базы данных. Например, вам может потребоваться определить разные пулы соединений для каждый сервер в кластере базы данных.
MariaDB MaxScale — это расширенный прокси-сервер базы данных, который можно использовать в качестве разделителя чтения/записи, который направляет операторы SELECT
на узлы-реплики и INSERT
/UPDATE
/. Операторы DELETE
для первичных узлов. Это происходит автоматически без необходимости изменять код приложения или даже конфигурацию — с MaxScale база данных выглядит для вашего приложения как база данных с одним узлом.
В этом практическом руководстве вы узнаете, как настроить репликацию базы данных MariaDB с одним основным и двумя узлами-репликами, а также как настроить MaxScale, чтобы скрыть сложность базовой топология. Самое приятное: вы узнаете все это, не выходя из браузера!
Веб-сайт Play With Docker
Play With Docker (PWD) – это веб-сайт, позволяющий создавать виртуальные машины с Docker предустановлены и взаимодействуют с ними прямо в браузере. Войдите и начните новый сеанс.
Всего вы будете использовать 5 узлов:
- узел 1: основной сервер
- узел 2: сервер-реплика A
- узел 3: сервер-реплика B
- node4: прокси базы данных MaxScale
- узел5: тестовый компьютер (например, эквивалент веб-сервера)
Примечание. Несмотря на то, что базы данных в контейнерах Docker хорошо подходят для самых простых сценариев и для сред разработки, это может быть не лучший вариант для производственных сред. Корпорация MariaDB в настоящее время не предлагает поддержку развертывания Docker в производственных средах. Для производственных сред рекомендуется использовать MariaDB Enterprise (в облаке или локально) или MariaDB SkySQL (в настоящее время доступно на AWS и GCP).
Запуск основного сервера
Добавить новый экземпляр с помощью соответствующей кнопки:
На node1 запустите основной сервер MariaDB следующим образом:
docker run --name mariadb-primary
-d
--net=host
-e MARIADB_ROOT_PASSWORD=password
-e MARIADB_DATABASE=demo
-e MARIADB_USER=user
-e MARIADB_PASSWORD=password
-e MARIADB_REPLICATION_MODE=master
-e MARIADB_REPLICATION_USER=replication_user
-e MARIADB_REPLICATION_PASSWORD=password
bitnami/mariadb:latest
Это настраивает контейнер, на котором запущен сервер сообщества MariaDB, с пользователем базы данных для репликации (replication_user
). Реплики будут использовать этого пользователя для подключения к основному.
Запуск серверов реплик
Создайте два новых экземпляра (node2 и node3) и выполните на них следующую команду:
docker run --name mariadb-replica
-d
--net=host
-e MARIADB_MASTER_ROOT_PASSWORD=password
-e MARIADB_REPLICATION_MODE=slave
-e MARIADB_REPLICATION_USER=replication_user
-e MARIADB_REPLICATION_PASSWORD=password
-e MARIADB_MASTER_HOST=<PRIMARY_IP_ADDRESS>
bitnami/mariadb:latest
Замените <PRIMARY_IP_ADDRESS>
на IP-адрес node1. Вы можете найти IP-адрес в списке экземпляров.
Теперь у вас есть кластер, образованный одним основным узлом и двумя репликами. Все записи, которые вы выполняете на основном узле (узел 1), автоматически реплицируются на все узлы-реплики (узел 1 и узел 2).
Запуск MaxScale
MaxScale — это прокси базы данных, который понимает SQL. Это позволяет направлять операции записи на главный узел и операции чтения на реплики с балансировкой нагрузки. Ваше приложение может подключаться к MaxScale с помощью одной конечной точки, как если бы это была база данных с одним узлом.
Создайте новый экземпляр (node4) и запустите MaxScale следующим образом:< /p>
docker run --name maxscale
-d
--publish 4000:4000
mariadb/maxscale:latest
Вы можете настроить MaxScale с помощью файлов конфигурации, но в этом руководстве мы будем использовать командную строку, чтобы убедиться, что вы понимаете каждый шаг. В менее эфемерных средах следует использовать файлы конфигурации, особенно в организованных развертываниях, таких как Docker Swarm и Кубернетес.
Запустите новую оболочку в node4:
docker exec -it maxscale bash
Вам необходимо создать объекты server
в MaxScale. Это базы данных MariaDB, к которым MaxScale маршрутизирует чтение и запись. Замените <NODE_1_IP_ADDRESS>
, <NODE_2_IP_ADDRESS>
и <NODE_3_IP_ADDRESS>
на IP-адреса соответствующих узлов (node1 , узел2 и узел3) и выполните следующее:
maxctrl create server node1 <NODE_1_IP_ADDRESS>
maxctrl create server node2 <NODE_2_IP_ADDRESS>
maxctrl create server node3 <NODE_3_IP_ADDRESS>
Затем вам нужно создать MaxScale monitor
для проверки состояния кластера. Выполните следующую команду:
maxctrl create monitor mdb_monitor mariadbmon
--monitor-user root --monitor-password 'password'
--servers node1 node2 node3
Примечание. Не используйте пользователя root в рабочей среде! Это нормально в этой эфемерной лабораторной среде, но в других случаях создайте нового пользователя базы данных для MaxScale и предоставить ему соответствующие разрешения.
Теперь, когда MaxScale отслеживает серверы и делает эту информацию доступной для других модулей, вы можете создать MaxScale service
. В этом случае служба использует маршрутизатор MaxScale, чтобы операции чтения и записи направлялись на правильный тип сервера в кластере (основной или реплика). Выполните следующее, чтобы создать новую службу:
maxctrl create service query_router_service readwritesplit
user=root
password=password
--servers node1 node2 node3
Наконец, вам нужно создать MaxScale listener
. Этот тип объекта определяет порт, который MaxScale использует для получения запросов. Вы должны связать слушателя с маршрутизатором. Запустите следующее, чтобы создать новый прослушиватель:
maxctrl create listener
query_router_service query_router_listener 4000
--protocol=MariaDBClient
Обратите внимание, как прослушиватель настроен на использование порта 4000. Это тот же порт, который вы опубликовали при запуске контейнера Docker.
Убедитесь, что серверы запущены и работают:
maxctrl list servers
Вы должны увидеть примерно следующее:
Проверка настройки
Чтобы протестировать кластер, создайте новый экземпляр (node5) и запустите контейнер Ubuntu:
docker run --name ubuntu -itd ubuntu
Этот контейнер эквивалентен, например, машине, на которой размещено веб-приложение, которое подключается к базе данных. Запустите новый сеанс Bash на машине:
docker exec -it ubuntu bash
Обновите каталог пакетов:
apt update
Установите SQL-клиент MariaDB, чтобы вы могли запускать код SQL:
apt install mariadb-client -y
Подключитесь к базе данных, а точнее к прокси-серверу базы данных MaxScale:
mariadb -h 192.168.0.15 --port 4000 -u user -p
Как видите, MaxScale — это как бы единая база данных. Создайте следующую таблицу:
SQL для MariaDB
CREATE TABLE demo.message(content TEXT);
Мы хотим вставить строки, содержащие уникальный идентификатор сервера экземпляра MariaDB, который фактически выполняет операцию вставки. Вот как:
SQL для MariaDB
INSERT INTO demo.message VALUES
(CONCAT("Write from server ", @@server_id)),
(CONCAT("Write from server ", @@server_id)),
(CONCAT("Write from server ", @@server_id));
Теперь давайте посмотрим, какой сервер MariaDB выполнял операции записи и чтения:
SQL для MariaDB
SELECT *, CONCAT("Read from server ", @@server_id) FROM demo.message;
Запустите предыдущий запрос несколько раз. Вы должны получить такой результат:
В моем кластере все записи выполнялись сервером с идентификатором 367, который является основным узлом. Чтения выполнялись серверами с идентификаторами 908 и 308, которые являются узлами-репликами. Вы можете подтвердить значения идентификатора, запустив на основном узле и узле-реплике следующее:
docker exec -it mariadb-primary mariadb -u root -p
--execute="SELECT @@server_id"
docker exec -it mariadb-replica mariadb -u root -p
--execute="SELECT @@server_id"
Что дальше?
В этом руководстве мы сосредоточились на базовом разделении чтения/записи, но MaxScale может сделать гораздо больше. Например, примените безопасность к топологии серверной базы данных, выполните автоматический переход на другой ресурс, выполните на основе подключения балансировка нагрузки, импорт и экспорт данных из и в Kafka и даже конвертировать команды NoSQL/MongoDB API в SQL. MaxScale также включает в себя REST API и графический веб-интерфейс для операций. Ознакомьтесь с документацией, чтобы узнать больше о MaxScale.
Также опубликовано здесь
Оригинал