среда, 30 июня 2010 г.

(Не)надежность master-master репликации в mysql

Перед нами встала задача обеспечить быструю и надежную работу клиентов с одной базой данных на 2-х географически удаленных объектах. В качестве одного из вариантов рассматривалась работа с 2-мя mysql серверами, которые бы реплицировались по принципу master-master. Далее рассматривается (не)надежность такой системы при одновременном изменении одних и тех же данных.

Настроим master-master репликацию (о том как это делается можно узнать из статей об основах репликации и мульти-мастер репликации).

Проведем небольшой эксперимент. Создадим таблицу
сервер1:
mysql> CREATE TABLE `new_table` (
`field1` varchar(32),
`field2` varchar(32),
`field3` varchar(32)
);

и внесем в нее начальные данные
сервер1:
mysql> SELECT * FROM new_table;
+--------+--------+--------+
| field1 | field2 | field3 |
+--------+--------+--------+
| value0 | value0 | value0 |
+--------+--------+--------+

После того как мы убедимся что БД реплицируется в обе стороны, разорвем соединение между серверами и изменим одну и ту же запись таблицы одновременно на обоих серверах.
сервер1:
mysql> UPDATE new_table SET field1='value1', field2='value1';
mysql> SELECT * FROM new_table;
+--------+--------+--------+
| field1 | field2 | field3 |
+--------+--------+--------+
| value1 | value1 | value0 |
+--------+--------+--------+
сервер2:
mysql> UPDATE new_table SET field2='value2', field3='value2';
mysql> SELECT * FROM new_table;
+--------+--------+--------+
| field1 | field2 | field3 |
+--------+--------+--------+
| value0 | value2 | value2 |
+--------+--------+--------+

После возобновления соединения и синхронизации серверов вырисовывается следующая картина:
сервер1:
mysql> SELECT * FROM new_table;
+--------+--------+--------+
| field1 | field2 | field3 |
+--------+--------+--------+
| value1 | value2 | value2 |
+--------+--------+--------+
сервер2:
mysql> SELECT * FROM new_table;
+--------+--------+--------+
| field1 | field2 | field3 |
+--------+--------+--------+
| value1 | value1 | value2 |
+--------+--------+--------+
Наблюдаем нарушение целостности данных и различия в репликах.

Альтернативные методы решения поставленной задачи можно найти в комментариях к вышеуказанным статьям (например, настройка master-slave репликации с использованием mysql-proxy или использование Multi-Master Replication Manager).

Комментариев нет: