Как сделать разделение чтения/записи базы данных с помощью вашего браузера

Как сделать разделение чтения/записи базы данных с помощью вашего браузера

10 декабря 2022 г.

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

MariaDB MaxScale — это расширенный прокси-сервер базы данных, который можно использовать в качестве разделителя чтения/записи, который направляет операторы SELECT на узлы-реплики и INSERT/UPDATE/. Операторы DELETE для первичных узлов. Это происходит автоматически без необходимости изменять код приложения или даже конфигурацию — с MaxScale база данных выглядит для вашего приложения как база данных с одним узлом.

В этом практическом руководстве вы узнаете, как настроить репликацию базы данных MariaDB с одним основным и двумя узлами-репликами, а также как настроить MaxScale, чтобы скрыть сложность базовой топология. Самое приятное: вы узнаете все это, не выходя из браузера!

Веб-сайт Play With Docker

Play With Docker (PWD) – это веб-сайт, позволяющий создавать виртуальные машины с Docker предустановлены и взаимодействуют с ними прямо в браузере. Войдите и начните новый сеанс.

The Play With Docker website

Всего вы будете использовать 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.


Также опубликовано здесь


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE