Статьи

MaxScale для остальных из нас, часть 4

Если вы следили за этой серией блогов (Введение в части 1, Настройка кластера в части 2 и Установка и настройка MaxScale в части 3 ), теперь вы должны запустить и запустить MaxScale в кластере с использованием репликации MariaDB. Но, как я сказал, когда я остановился в третьей части, это еще не все.

Для начала давайте посмотрим, как работает система репликации. Давайте добавим еще несколько данных через MaxScale, это должно закончиться с ведущим, и система репликации сделает это доступным на ведомых устройствах. Итак, на клиентской машине (192.168.0.167), вошедшей в систему в корневом каталоге, выполните

# mysql -h 192.168.0.165 -u maxuser -pmaxpwd test -e "INSERT INTO t1 VALUES(2)"
# mysql -h 192.168.0.165 -u maxuser -pmaxpwd test -e "INSERT INTO t1 VALUES(3)"
# mysql -h 192.168.0.165 -u maxuser -pmaxpwd test -e "INSERT INTO t1 VALUES(4)"

Теперь у нас должно быть 4 строки в таблице t1, давайте проверим:

# mysql -h 192.168.0.165 -u maxuser -pmaxpwd test -e "SELECT c1 FROM t1"
+------+
| c1  |
+------+
|  1 |
|  2 |
|  3 |
|  4 |
+------+

Вау! Это было круто . Или? Может быть, не я думаю. Например, откуда эти данные? Давайте использовать что-то, что мы можем использовать, чтобы сказать нам, какой сервер мы выбираем. Помните, что переменная server_id различна на всех серверах (она должна быть), она равна 1 (на ведущем устройстве). 11 и 12 (для двух ведомых соответственно), поэтому, если мы выберем это, мы должны увидеть, с какого сервера поступают данные, верно? Давайте проверим это:

# mysql -h 192.168.0.165 -u maxuser -pmaxpwd test -e "SELECT @@server_id, c1 FROM t1"
+-------------+------+
| @@server_id | c1  |
+-------------+------+
|  11 |  1 |
|  11 |  2 |
|  11 |  3 |
|  11 |  4 |
+-------------+------+

Так что это были данные, поступающие от первого раба. Мы знаем, что у нас здесь должна быть балансировка нагрузки, поэтому, если мы попробуем то же самое снова, данные должны поступить от другого ведомого устройства. Но не верьте мне на слово, давайте попробуем:

# mysql -h 192.168.0.165 -u maxuser -pmaxpwd test -e "SELECT @@server_id, c1 FROM t1"
+-------------+------+
| @@server_id | c1  |
+-------------+------+
|  12 |  1 |
|  12 |  2 |
|  12 |  3 |
|  12 |  4 |
+-------------+------+

Эй, балансировка нагрузки работает! Круто, чувак! Наши ВСТАВКИ выше были явно оправданы на хозяине и скопированы на двух рабов, верно? Можем ли мы проверить это! Да, давайте попробуем еще раз, но давайте сначала удалим все строки в нашей тестовой таблице:

 # mysql -h 192.168.0.165 -u maxuser -pmaxpwd test -e "DELETE FROM t1"

А теперь давайте снова вставим строку, но вместо этого используем переменную server_id:

# mysql -h 192.168.0.165 -u maxuser -pmaxpwd test -e "INSERT INTO t1 VALUES(@@server_id)"

Давайте проверим, что произошло сейчас:

# mysql -h 192.168.0.165 -u maxuser -pmaxpwd test -e "SELECT @@server_id, c1 FROM t1"
+-------------+------+
| @@server_id | c1  |
+-------------+------+
|  12 |  12 |
+-------------+------+

Какие! Мы сошли с ума (или, по крайней мере, больше, чем обычно), или? Что здесь случилось? Давайте попробуем это снова:

# mysql -h 192.168.0.165 -u maxuser -pmaxpwd test -e "SELECT @@server_id, c1 FROM t1"
+-------------+------+
| @@server_id | c1  |
+-------------+------+
|  11 |  11 |
+-------------+------+

Ой! Что не так! Ну, что здесь происходит, так это то, что мы используем репликацию на основе операторов, которая является значением по умолчанию, поэтому на главном сервере значение c1 имеет значение 1, но выполнение INSERT INTO t1 VALUES (@@ server_id) на первом подчиненном устройстве подхватит локальное значение для @@ server_id (которое равно 11) и вставьте его в таблицу. Чтобы это исправить, мы должны использовать Row Based Replication (RBR) . Мы можем установить это как глобальную переменную, но чтобы сделать это постоянным, что мы и хотим сделать, на самом деле, мы должны установить это в соответствующем конфигурационном файле на master:

 # vi /etc/my.cnf.d/server.cnf 

а затем настройте раздел mysqld так, чтобы он выглядел так:

[mysqld]
server_id=1
log-bin
binlog_format=MIXED

И затем мы перезапускаем главный сервер (это также выполняется на главном сервере, заметьте):

 # /etc/init.d/mysql restart

Теперь давайте попробуем еще раз, от клиента:

# mysql -h 192.168.0.165 -u maxuser -pmaxpwd test -e "DELETE FROM t1"
# mysql -h 192.168.0.165 -u maxuser -pmaxpwd test -e "INSERT INTO t1 VALUES(@@server_id)"
# mysql -h 192.168.0.165 -u maxuser -pmaxpwd test -e "SELECT @@server_id, c1 FROM t1"
+-------------+------+
| @@server_id | c1  |
+-------------+------+
|  11 |  1 |
+-------------+------+
# mysql -h 192.168.0.165 -u maxuser -pmaxpwd test -e "SELECT @@server_id, c1 FROM t1"
+-------------+------+
| @@server_id | c1  |
+-------------+------+
|  12 |  1 |
+-------------+------+ 

Это имеет больше смысла, верно. Некоторое время там было страшно. И обратите внимание, что это не характерно для MaxScale или чего-либо еще, это просто, как работает репликация MariaDB.

Теперь у нас есть кластер серверов MariaDB, в котором мы используем MaxScale в качестве балансировщика нагрузки с разделением чтения-записи . В следующем блоге этой серии я планирую взглянуть на производительность.

Приветствия
/ Карлссон