Подбаза данных и подтаблицы Mycat синхронизируются с GreatSQL в режиме реального времени.

Как это произошло?

MyCat, классическое промежуточное программное обеспечение для сегментирования баз данных и таблиц, долгое время считалось эффективным решением для управления очень большими коллекциями баз данных MySQL. Недавно мы получили запрос от клиентов на миграцию кластера MyCat на GreatSQL и синхронизацию данных из MyCat в GreatSQL в режиме реального времени в течение определенного периода времени.Полная синхронизация данных относительно проста в эксплуатации, но инкрементная синхронизация имеет следующие две сложные проблемы:

  1. Несколько серверов с разными именами библиотек должны быть синхронизированы с одной библиотекой GreatSQL, то есть связь синхронизации следующая.
server1:db1.tab->gdb:db.tab;
server2:db2.tab->gdb:db.tab;
server3:db3.tab->gdb:db.tab;
  1. Несколько выполнений синхронизации ddl будут конфликтовать. Когда индекс и поле добавляются в таблицу MyCat, все внутренние базы данных фактически выполняют этот DDL.При синхронизации с GreatSQL, если DDL выполняется несколько раз, репликация будет прервана ненормально.

Чтобы решить две вышеупомянутые проблемы, после поиска информации я обнаружил, что есть две функции, которые обычно не используются и не рекомендуются властями, которые могут просто удовлетворить потребности.

  1. Чтобы решить проблему сопоставления имен библиотек: необходимо добавить параметры в файл конфигурации.
replicate_rewrite_db="channel_1:test_rep1->test_rep"
replicate_rewrite_db="channel_2:test_rep2->test_rep"
replicate_rewrite_db="channel_3:test_rep3->test_rep"
  1. Чтобы решить проблему прерывания репликации, вызванную повторным выполнением после синхронизации DDL, добавьте
slave-skip-errors=ddl_exist_errors

Подтвердите это

Чтобы упростить задачу, мы не будем строить кластер MyCat и упрощать его до задачи синхронной репликации с несколькими источниками.

1. Инициализируйте 4 экземпляра, соотношение синхронизации следующее.

исходный порт Исходная база данных_ИМЯ целевой порт База данных сопоставления целей Название канала
3306 test_rep1 3309 test_rep канал_3306
3307 test_rep2 3309 test_rep канал_3307
3308 test_rep3 3309 test_rep канал_3308

2. В файле конфигурации экземпляра 3309 добавьте конфигурацию отношений сопоставления библиотек и параметры игнорирования конфликтов DDL.

replicate_rewrite_db="channel_3306:test_rep1->test_rep"
replicate_rewrite_db="channel_3307:test_rep2->test_rep"
replicate_rewrite_db="channel_3308:test_rep3->test_rep"
slave-skip-errors=ddl_exist_errors

4. В экземпляре 3309 настройте три канала

greatsql> change master to MASTER_HOST = '172.17.137.91',MASTER_USER = 'greatsql',MASTER_PASSWORD = 'greatsql',MASTER_PORT = 3306,MASTER_AUTO_POSITION = 1 FOR CHANNEL 'channel_3306';

greatsql> change master to MASTER_HOST = '172.17.137.91',MASTER_USER = 'greatsql',MASTER_PASSWORD = 'greatsql',MASTER_PORT = 3307,MASTER_AUTO_POSITION = 1 FOR CHANNEL 'channel_3307';

greatsql> change master to MASTER_HOST = '172.17.137.91',MASTER_USER = 'greatsql',MASTER_PASSWORD = 'greatsql',MASTER_PORT = 3308,MASTER_AUTO_POSITION = 1 FOR CHANNEL 'channel_3308';

greatsql> start slave;

3. Проверьте состояние конфигурации канала.

greatsql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 172.17.137.91
                  Master_User: greatsql
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: binlog.000002
          Read_Master_Log_Pos: 1119
               Relay_Log_File: relaylog-channel_3306.000007
                Relay_Log_Pos: 397
        Relay_Master_Log_File: binlog.000002
             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: 1119
              Relay_Log_Space: 606
              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: 3306
                  Master_UUID: 5facacd7-9ed6-11ee-b76b-00163e5af5d6
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 49b66af0-9ed6-11ee-ae4f-00163e5af5d6:3,
5a369d0b-9ed6-11ee-b3d1-00163e5af5d6:3,
5facacd7-9ed6-11ee-b76b-00163e5af5d6:1-4,
9a5f9c26-4262-11ee-85fd-00163e5af5d6:1-16571224
                Auto_Position: 1
         Replicate_Rewrite_DB: (test_rep1,test_rep)
                 Channel_Name: channel_3306
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 0
            Network_Namespace: 
*************************** 2. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 172.17.137.91
                  Master_User: greatsql
                  Master_Port: 3307
                Connect_Retry: 60
              Master_Log_File: binlog.000002
          Read_Master_Log_Pos: 1119
               Relay_Log_File: relaylog-channel_3307.000004
                Relay_Log_Pos: 1034
        Relay_Master_Log_File: binlog.000002
             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: 1119
              Relay_Log_Space: 1243
              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: 3307
                  Master_UUID: 5a369d0b-9ed6-11ee-b3d1-00163e5af5d6
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 5a369d0b-9ed6-11ee-b3d1-00163e5af5d6:1-2:4
            Executed_Gtid_Set: 49b66af0-9ed6-11ee-ae4f-00163e5af5d6:3,
5a369d0b-9ed6-11ee-b3d1-00163e5af5d6:3,
5facacd7-9ed6-11ee-b76b-00163e5af5d6:1-4,
9a5f9c26-4262-11ee-85fd-00163e5af5d6:1-16571224
                Auto_Position: 1
         Replicate_Rewrite_DB: (test_rep2,test_rep)
                 Channel_Name: channel_3307
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 0
            Network_Namespace: 
*************************** 3. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 172.17.137.91
                  Master_User: greatsql
                  Master_Port: 3308
                Connect_Retry: 60
              Master_Log_File: binlog.000002
          Read_Master_Log_Pos: 1119
               Relay_Log_File: relaylog-channel_3308.000004
                Relay_Log_Pos: 1034
        Relay_Master_Log_File: binlog.000002
             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: 1119
              Relay_Log_Space: 1243
              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: 3308
                  Master_UUID: 49b66af0-9ed6-11ee-ae4f-00163e5af5d6
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 49b66af0-9ed6-11ee-ae4f-00163e5af5d6:1-2:4
            Executed_Gtid_Set: 49b66af0-9ed6-11ee-ae4f-00163e5af5d6:3,
5a369d0b-9ed6-11ee-b3d1-00163e5af5d6:3,
5facacd7-9ed6-11ee-b76b-00163e5af5d6:1-4,
9a5f9c26-4262-11ee-85fd-00163e5af5d6:1-16571224
                Auto_Position: 1
         Replicate_Rewrite_DB: (test_rep3,test_rep)
                 Channel_Name: channel_3308
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 0
            Network_Namespace: 
3 rows in set, 1 warning (0.00 sec)

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

$ MYSQL_PWD=greatsql mysql -ugreatsql -h127.0.0.1 -P3309 -e 'show replica status \G'| grep -wE 'Replica_IO_Running|Replica_SQL_Running|Replicate_Rewrite_DB|Channel_Name'
           Replica_IO_Running: Yes
          Replica_SQL_Running: Yes
         Replicate_Rewrite_DB: (test_rep1,test_rep)
                 Channel_Name: channel_3306
           Replica_IO_Running: Yes
          Replica_SQL_Running: Yes
         Replicate_Rewrite_DB: (test_rep2,test_rep)
                 Channel_Name: channel_3307
           Replica_IO_Running: Yes
          Replica_SQL_Running: Yes
         Replicate_Rewrite_DB: (test_rep3,test_rep)
                 Channel_Name: channel_3308

В экземпляре 3309 запросите Replica_skip_errors, чтобы подтвердить код ошибки, пропущенный исключением репликации. Установка значения ddl_exist_errors автоматически преобразует его в следующий код ошибки.

greatsql> select @@replica_skip_errors;
+---------------------------------------------------+
| @@replica_skip_errors                             |
+---------------------------------------------------+
| 1007,1008,1050,1051,1054,1060,1061,1068,1091,1146 |
+---------------------------------------------------+
1 row in set (0.00 sec)

5. Проверка синхронизации данных

  1. В библиотеке 3309 создайте базу данных test_rep.

Эту библиотеку необходимо создать вручную. Тестирование показало, что связь сопоставления действует только для таблиц в библиотеке, и библиотека не будет автоматически преобразована и создана.

  1. В библиотеке 3306 создайте базу данных test_rep1 и создайте таблицу tab1.
$ mysql -ugreatsql -h127.0.0.1 -p -P3306 -s

greatsql> create database test_rep1;
greatsql> use test_rep1;
greatsql> create table tab1(id int primary key auto_increment, cname varchar(10), age int);
  1. В библиотеке 3307 создайте базу данных test_rep2 и создайте таблицу tab1.
$ mysql -ugreatsql -h127.0.0.1 -p -P3307 -s

greatsql> create database test_rep2;
greatsql> use test_rep2;
greatsql> create table tab1(id int primary key auto_increment, cname varchar(10), age int);
  1. В библиотеке 3308 создайте базу данных test_rep3 и создайте таблицу tab1.
$ mysql -ugreatsql -h127.0.0.1 -p -P3308 -s

greatsql> create database test_rep3;
greatsql> use test_rep3;
greatsql> create table tab1(id int primary key auto_increment, cname varchar(10), age int);
  1. Подтвердите синхронизацию базы данных и таблиц в 3309.
$ mysql -ugreatsql -h127.0.0.1 -p -P3309 -s

greatsql> show databases;
Database
information_schema
mysql
performance_schema
sys
test_db
test_rep
test_rep1
test_rep2
test_rep3

greatsql> show tables from test_rep;
Tables_in_test_rep
tab1
greatsql> show tables from test_rep1;
greatsql> show tables from test_rep2;
greatsql> show tables from test_rep3;

Как видно из приведенной выше информации, в 3309 все библиотеки, созданные в 3306, 3307 и 3308, синхронизируются в соответствии со своими исходными именами, но таблица синхронизируется только в библиотеке test_rep, сопоставленной 3309.

  1. Вставьте запись в 3306, 3307 и 3308 соответственно.
3306 : insert into test_rep1.tab1 values(1,'a',10);
3307 : insert into test_rep2.tab1 values(2,'b',20);
3308 : insert into test_rep3.tab1 values(3,'c',30);

Затем запросите статус вставки данных на каждом узле.

$ mysql -ugreatsql -h127.0.0.1 -p -P3306 -s test_rep1 -e 'select * from tab1'
id       cname    age
1        a        10

$ mysql -ugreatsql -h127.0.0.1 -p -P3307 -s test_rep2 -e 'select * from tab1'
id       cname    age
2        b        20

$ mysql -ugreatsql -h127.0.0.1 -p -P3308 -s test_rep3 -e 'select * from tab1'
id       cname    age
3        c        30

$ mysql -ugreatsql -h127.0.0.1 -p -P3309 -s test_rep -e 'select * from tab1'
id       cname    age
1        a        10
2        b        20
3        c        30

$ mysql -ugreatsql -h127.0.0.1 -p -P3309 -s test_rep1 -e 'select * from tab1'
ERROR 1146 (42S02) at line 1: Table 'test_rep1.tab1' doesn't exist

$ mysql -ugreatsql -h127.0.0.1 -p -P3309 -s test_rep2 -e 'select * from tab1'
ERROR 1146 (42S02) at line 1: Table 'test_rep2.tab1' doesn't exist

$ mysql -ugreatsql -h127.0.0.1 -p -P3309 -s test_rep3 -e 'select * from tab1'
ERROR 1146 (42S02) at line 1: Table 'test_rep3.tab1' doesn't exist

Как видно из приведенного выше запроса, в узлах 3306, 3307 и 3308 имеется только одна запись, и записи синхронизированы с таблицей test_rep.tab1 3309, а в таблицах test_rep1, test_rep2 и test_rep3 нет таблиц. из 3309.

  1. Создайте индекс для вкладки таблицы по номерам 3306, 3307 и 3308 соответственно.
greatsql> alter table tab1 add index idx_cname(cname);
  1. Наблюдая за статусом индекса таблицы в 3309, можно увидеть, что индекс idx_cname синхронизирован.
$ mysql -ugreatsql -h127.0.0.1 -p -P3309 -s

greatsql> use test_rep
greatsql> show create table tab1 \G
*************************** 1. row ***************************
       Table: tab1
Create Table: CREATE TABLE `tab1` (
  `id` int NOT NULL AUTO_INCREMENT,
  `cname` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `age` int DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_cname` (`cname`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
1 row in set (0.00 sec)
  1. Выполните операции обновления и удаления на этапах 3306, 3307 и 3308 соответственно.
greatsql> update test_rep1.tab1 set age=110 where id=1;
greatsql> update test_rep2.tab1 set age=120 where id=2;
greatsql> update test_rep3.tab1 set age=130 where id=3;

greatsql> delete from test_rep1.tab1 where id=1;
greatsql> delete from test_rep2.tab1 where id=1;
greatsql> delete from test_rep3.tab1 where id=1;

Проверьте состояние синхронизации данных 3309 и убедитесь, что данные очищены.

$ mysql -ugreatsql -h127.0.0.1 -p -P3309 -s
Welcome to the MySQL monitor.  Commands end with ; or \g.
greatsql> select * from test_rep.tab1;
  1. Наблюдая за синхронизацией трех каналов, вы можете подтвердить, что три синхронизации репликации работают нормально.
$ mysql -ugreatsql -h127.0.0.1 -p -P3309 -e 'show replica status \G'| grep -E 'Replica_IO_Running|Replica_SQL_Running|Channel_Name'
greatsql: [Warning] Using a password on the command line interface can be insecure.
           Replica_IO_Running: Yes
          Replica_SQL_Running: Yes
    Replica_SQL_Running_State: Replica has read all relay log; waiting for more updates
                 Channel_Name: channel_3306
           Replica_IO_Running: Yes
          Replica_SQL_Running: Yes
    Replica_SQL_Running_State: Replica has read all relay log; waiting for more updates
                 Channel_Name: channel_3307
           Replica_IO_Running: Yes
          Replica_SQL_Running: Yes
    Replica_SQL_Running_State: Replica has read all relay log; waiting for more updates
                 Channel_Name: channel_3308

На данный момент синхронизация dml и ddl проверена.

Недостатки плана

  1. В этом решении имя таблицы, используемое предприятием для доступа к MyCat, точно такое же, как имя таблицы на сервере, за исключением того, что имя библиотеки отличается. Тогда имя прокси-таблицы MyCat и фактическое имя таблицы сервера могут отличаться. В этом случае обработка сопоставления не может быть выполнена временно.
  2. MyCat на самом деле представляет собой несколько отдельных библиотек. Если в этих библиотеках ранее не реализована пошаговая обработка первичного ключа с автоматическим приращением или какая-либо другая стратегия предотвращения дублирования первичного ключа, во время процесса синхронизации возникнут конфликты первичных ключей, которые приведут к прерыванию синхронизации данных. .Это нужно сделать заранее.Подготовьте план лечения.

В конце прикреплены справочные материалы

Наслаждайтесь GreatSQL :)


О GreatSQL

База данных GreatSQL — это бесплатная база данных с открытым исходным кодом, которая может соответствовать сценариям приложений финансового уровня на обычном оборудовании. Она обладает такими функциями, как высокая доступность , высокая производительность , высокая совместимость и высокая безопасность . Она может быть идеальной заменой MySQL или Percona Server для MySQL.

Ссылки по теме

Сообщество GreatSQL

Гите

Гитхаб

Билибили

Группа технического обмена

WeChat: добавление GreatSQL社区助手друзей, идентификатор WeChat wanlidbcотправляет информацию для проверки.加群

Группа QQ: 533341697

Наслаждайтесь GreatSQL :)

О GreatSQL

GreatSQL — это внутренняя независимая база данных с открытым исходным кодом, подходящая для приложений финансового уровня. Она имеет множество основных функций, таких как высокая производительность, высокая надежность, простота использования и высокая безопасность. Ее можно использовать в качестве дополнительной замены MySQL или Percona Server. и используется в онлайн-производственной среде, совершенно бесплатно и совместимо с MySQL или Percona Server.

Ссылки по теме: Сообщество GreatSQL Gitee GitHub Bilibili

Сообщество GreatSQL:

изображение

Предложения и отзывы сообщества о наградах: https://greatsql.cn/thread-54-1-1.html .

Подробности о заявках, получивших награды в блоге сообщества: https://greatsql.cn/thread-100-1-1.html .

(Если у вас есть какие-либо вопросы по статье или у вас есть уникальные идеи, вы можете зайти на официальный сайт сообщества, чтобы задать их или поделиться ими~)

Группа технического обмена:

Группа WeChat и QQ:

Группа QQ: 533341697

Группа WeChat: добавьте помощника сообщества GreatSQL (идентификатор WeChat:) wanlidbcв друзья и подождите, пока помощник сообщества добавит вас в группу.

Дважды произошел сбой Bilibili, авария первого уровня Tencent «3.29»… Подведение итогов десяти крупнейших аварий с простоями в 2023 году. Vue 3.4 «Slam Dunk» выпустил MySQL 5.7, Moqu, Li Tiaotiao… Подведение итогов «остановки» в 2023 году Подробнее (с открытым исходным кодом) проекты и веб-сайты оглядываются на IDE 30-летней давности: только TUI, яркий цвет фона... Выпущен Vim 9.1, посвященный Брэму Муленаару, отцу Redis, "Rapid Review" LLM Programming: Omniscient и Всемогущий&& Глупый «Пост-открытый исходный код». Наступила эра: срок действия лицензии истек, и она не может обслуживать широкую публику. China Unicom Broadband внезапно ограничила скорость загрузки, и большое количество пользователей пожаловались. Руководители Windows пообещали улучшения: сделайте начало Меню снова великолепное. Скончался Никлаус Вирт, отец Паскаля.
{{o.name}}
{{м.имя}}

Guess you like

Origin my.oschina.net/GreatSQL/blog/10575834