LINUX.ORG.RU
решено ФорумAdmin

[mysql] помогите разобраться с master-master-slave репликацией

 


0

2

народ, поможите чем можете , сами мы не местные
уже кучу времение безрезультатно бьюсь с одной проблемой..

Итак, предположим есть 2 mysql сервера, назовём их, к примеру, M1 и S (Master1 и Slave),

+--+
|M1|
+--+
 ||
 \/
+--+
|S |
+--+
между ними, как несложно догадаться, настроена репликация по следующему принципу: M1 является мастером, S - slave, схему репликации я попытался изобразить стрелочкой.
Всё работает, всё отлично.

В один прекрасный день, имея намерение избавиться от единого мастера, появляется желание добавить к существующему M1 серверу ещё одного мастера и сделать их обоих одновременно слейвами по отношению друг к другу, то есть чтобы M1 и M2 стали осуществлять взаимную репликацию, при этом существующий слейв S остаётся слейвом к M1.
Вот схема:

+--+    +--+
|M1+<==>+M2|
+--+    +--+
 ||
 \/
+--+
|S |
+--+
То есть я хочу: любой апдейт сделанный на М1 - реплицируется на M2 и S и ,точно также, любой апдейт, сделанный на M2 - реплицируется на на M1 и, далее, с М1 идёт на S.

Сказано - сделано: конфиги принимают соответствующий вид:
M1:
[mysqld] 
log-bin=/var/log/mysql/mysql-bin.log 
binlog-do-db=radius                                                                 
server-id=11
auto_increment_increment=2
auto_increment_offset=1


M2:
[mysqld]
log-bin=/var/log/mysql/mysql-bin.log
binlog-do-db=radius
server-id=5
auto_increment_increment=2
auto_increment_offset=2

S:
[mysqld]
server-id=2
replicate-do-db=radius                                                         
После этих преобразований, вместо желаемой нужной схемы, репликация почемуто начинает работать следующим образом:
если я делаю апдейт на M1 - всё замечательно - операция реплицируется и на M2 и на S, НО
если я делаю такой-же апдейт на M2, то изменения реплицируются _только_ на M1 а на S - как-бы не доходят...

вот пример до апдейта на M2:

M1:
---------------
mysql> select * from accounts;
+----+-------------+
| id | data        |
+----+-------------+
|  1 | Hello world |
|  3 | OLD-DATA    |
+----+-------------+
2 rows in set (0.01 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |     1006 | radius       |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.107
                  Master_User: thereplicator
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 107
               Relay_Log_File: box-relay-bin.000002
                Relay_Log_Pos: 253
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 107
              Relay_Log_Space: 407
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 5
1 row in set (0.01 sec)

------------

M2:
mysql> select * from accounts;
+----+-------------+
| id | data        |
+----+-------------+
|  1 | Hello world |
|  3 | OLD-DATA    |
+----+-------------+
2 rows in set (0.01 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      107 | radius       |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.01 sec)

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.105
                  Master_User: thereplicator
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 1006
               Relay_Log_File: box-relay-bin.000002
                Relay_Log_Pos: 702
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 1006
              Relay_Log_Space: 856
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 11
1 row in set (0.00 sec)

-------------------

S:
mysql> select * from accounts;
+----+-------------+
| id | data        |
+----+-------------+
|  1 | Hello world |
|  3 | OLD-DATA    |
+----+-------------+
2 rows in set (0.01 sec)

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.105
                  Master_User: thereplicator
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 1006
               Relay_Log_File: box-relay-bin.000002
                Relay_Log_Pos: 702
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: radius
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 1006
              Relay_Log_Space: 856
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 11
1 row in set (0.00 sec)

mysql> 

--------
делаем апдейт на M2 и получаем следующее:

----
M2:
mysql> update accounts set data = "NEW-DATA" where id = "3";
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      331 | radius       |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.01 sec)

mysql> select * from accounts;
+----+-------------+
| id | data        |
+----+-------------+
|  1 | Hello world |
|  3 | NEW-DATA    |
+----+-------------+
2 rows in set (0.01 sec)


----

M1:
mysql> select * from accounts;
+----+-------------+
| id | data        |
+----+-------------+
|  1 | Hello world |
|  3 | NEW-DATA    |
+----+-------------+
2 rows in set (0.01 sec)

mysql> show master status
    -> ;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |     1006 | radius       |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.107
                  Master_User: thereplicator
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 331
               Relay_Log_File: box-relay-bin.000002
                Relay_Log_Pos: 477
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 331
              Relay_Log_Space: 631
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 5
1 row in set (0.00 sec)

mysql> 


---
S:
mysql> select * from accounts;
+----+-------------+
| id | data        |
+----+-------------+
|  1 | Hello world |
|  3 | OLD-DATA    |
+----+-------------+
2 rows in set (0.01 sec)

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.105
                  Master_User: thereplicator
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 1006
               Relay_Log_File: box-relay-bin.000002
                Relay_Log_Pos: 702
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: radius
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 1006
              Relay_Log_Space: 856
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 11
1 row in set (0.00 sec)


-------


При этом, операция , сделанная на M1 работает как надо.
В чём может быть дело?
АПД: пробовал на разных дистрах - результат одинаков :(



Последнее исправление: epsilon1024 (всего исправлений: 1)

Про мастер-мастер репликацию в мускуле лучше забыть, как про страшный сон. Иначе можно поиметь много-много геморроя.

blind_oracle ★★★★★
()
Ответ на: комментарий от blind_oracle

увы, СУБД выбираю не я :-(
она уже есть, моё дело заставить работать вышописанную конфигурация, да ещё и с минимальным даунтаймом (в лайве большие объёмы данных)

epsilon1024
() автор топика
Ответ на: комментарий от epsilon1024

Скажите чтобы работать заставлял тот, кто придумал так делать. Я бы еще сказал начальству что за целостность данных нести ответственность не буду с таким решением.

ventilator ★★★
()
Ответ на: комментарий от ventilator

Скажите чтобы работать заставлял тот, кто придумал так делать.

Вентилятор,
того чела уже давно уволили за пьянку на работе, и теперь я вместо него :-)

Я бы еще сказал начальству что за целостность данных нести ответственность не буду с таким решением.

увы, я и отвечаю, вот и страхуюсь-перестраховываюсь :(
а мигрировать на оракл или ещё куда - и сложно (там ещё сложная репликация с различным C# софтом) и дорого, ибо оракал не бесплатен для коммерческого использования.
да, не легка участь свежего выпускника :-)

epsilon1024
() автор топика
Ответ на: комментарий от epsilon1024

Просто мульти-мастер репликация это не продакшен решение. И дело тут не в MySQL даже, а скорее в самом SQL :) Транзакционная модель в этом случае ломается, возникают всякие конфликты, в общем - не айс. Лучше сделать два сервера с тем же DRBD для репликации данных на уровне дисков в синхронном режиме. Ну и плюс heartbeat для мониторинга. Если мастер-сервер падает, второй через 10-30 секунд поднимется и займёт его место. Так, поверь, гораздо надёжнее. Либо юзать MySQL Cluster NBD, но там свои заморочки.

blind_oracle ★★★★★
()
Ответ на: комментарий от blind_oracle

MySQL Cluster NBD не советую юзать вообще. Почитайте про него форум mysql, там каждый второй пост либо про глюки/падения либо про тормоза. Я тут случайно по долгу службы поработал с ним - врагу не пожелаю такого.

Да и DRBD какая то стремная прослойка, как для баз данных. Лучше уж постгрес со стриминг репликацией.

ventilator ★★★
()
Ответ на: комментарий от ventilator

Про мускуль ндб читал, да, но сам не работал, так что все может быть...

А с дрбд все отлично, под достаточно большой нагрузкой у меня работало в т.ч. с мускуем (с иннодб оф кос), после падения мастера все корректно поднималось на слейве. Иннодб конечно какое-то время восстанавливался, но обычно не более 30 секунд.

blind_oracle ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.