mysql多源復制,多主一從復制


阿里雲ECS,公網IP 121.40.110.2 

使用docker安裝mysql8,創建三個容器:

實例A:A數據庫 A表

實例B:B數據庫 B表

實例C:C數據庫C表

兩種情形:

第一種

 A庫和B庫同步到實例C;

 

第二種

A庫A表和B庫B表同步到C庫

 

一、使用docker創建mysql8容器

1、安裝docker

yum install docker -y
systemctl start docker
systemctl enable docker

 

2、拉取mysql鏡像

docker pull mysql
docker images

3、啟動三個mysql容器mysql8-1、mysql8-2、mysql8-3

docker run --name mysql8-1  -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
docker run --name mysql8-2  -p 3311:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
docker run --name mysql8-3  -p 3312:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest

4、進入mysql8-1容器(先不要建自己的datingcenter等后面測試的庫)

docker exec -it mysql8-1 /bin/bash

連接數據庫,查看數據庫版本

5、設置數據庫遠程連接

設置遠程登錄數據庫的root賬戶

mysql8和mysql5的版本不一樣,具體操作

GRANT ALL ON *.* TO 'root'@'%';

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密碼';

FLUSH PRIVILEGES;

6、創建用戶slave用於從庫同步復制,授予復制、同步訪問

mysql8和mysql5的版本不一樣,具體操作

mysql> use mysql;

mysql> CREATE USER 'slave'@'%' IDENTIFIED BY '123456';

mysql>ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';


mysql> GRANT replication slave ON *.* TO 'slave'@'%';

 

mysql>FLUSH PRIVILEGES;

 

其他兩個容器同樣操作

容器安裝編輯器vim

 https://www.cnblogs.com/xiaoyou2018/p/10912117.html

 

二、配置數據庫多源一從

和mysql一主一從復制相比,多源復制加入了一個叫做Channel的概念, 每一個Channel都是一個獨立的Slave,都有一個IO_THREAD和SQL_THREAD。原理和普通復制一樣。我們只需要對每一個Master執行Change Master 語句,只需要在每個語句最后使用For Channel來進行區分。多源復制和正常主從其他的配置都一樣,基本上主庫開下binlog、server-id不一樣就可以了,只有下列額外限制:

  • master-info-repository必須為TABLE
  • relay-log-info-repository必須為TABLE
  • 以FOR CHANNEL 'CHANNEL_NAME'區分不同的master。

 

第一種情形:

主庫同步到從庫的情況如下配置:

  • 主庫mysql8-1:IP=121.40.110.2; PORT=3310; server-id=1; database=datingcenter; table=aa、dd
  • 主庫mysql8-2:IP=121.40.110.2; PORT=3311; server-id=2; database=usercenter ;table=cc、bb
  • 從庫mysql8-3:IP=121.40.110.2; PORT=3312; server-id=3; database=datingcenter、usercenter、matchcenter ;table=aa、dd、cc、bb

配置約束

  • 主從庫必須保證網絡暢通可訪問
  • 主庫必須開啟binlog日志
  • 主從庫的server-id必須不同

【主庫mysql8-1】操作及配置

配置my.cnf(/etc/mysql/my.cnf)

添加如下的內容

 

client]
port = 3306
default-character-set = utf8mb4

[mysql]
port = 3306
default-character-set = utf8mb4

[mysqld]
##########################
# summary
##########################
#bind-address = 0.0.0.0
#port = 3306
#datadir=/datavol/mysql/data #數據存儲目錄

##########################
# log bin
##########################
server-id = 1            #必須唯一
log_bin = mysql-bin     #開啟及設置二進制日志文件名稱
binlog_format = MIXED
sync_binlog = 1
expire_logs_days =7        #二進制日志自動刪除/過期的天數。默認值為0,表示不自動刪除。

#binlog_cache_size = 128m
#max_binlog_cache_size = 512m
#max_binlog_size = 256M
#要同步的數據庫
binlog-do-db = datingcenter 
#不需要同步的數據庫
binlog-ignore-db = mysql 
binlog_ignore_db
= information_schema
binlog_ignore_db
= performance_schema
binlog_ignore_db
= sys
########################## # character set ##########################
character
-set-server = utf8mb4
collation
-server = utf8mb4_unicode_ci

log_bin是否開啟

mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set

查看master狀態

mysql> show master status \G;
*************************** 1. row ***************************
             File: mysql-bin.000001
         Position: 155
     Binlog_Do_DB: datingcenter
 Binlog_Ignore_DB: mysql,information_schema,performation_schema,sys

 記住file、position這兩個值,后面需要用到

【主庫mysql8-2】配置及操作

配置my.cnf

添加如下的內容

client]
port = 3306
default-character-set = utf8mb4

[mysql]
port = 3306
default-character-set = utf8mb4

[mysqld]
##########################
# summary
##########################
#bind-address = 0.0.0.0
#port = 3306
#datadir=/datavol/mysql/data #數據存儲目錄

##########################
# log bin
##########################
server-id = 2            #必須唯一
log_bin = mysql-bin     #開啟及設置二進制日志文件名稱
binlog_format = MIXED
sync_binlog = 1
expire_logs_days =7        #二進制日志自動刪除/過期的天數。默認值為0,表示不自動刪除。

#binlog_cache_size = 128m
#max_binlog_cache_size = 512m
#max_binlog_size = 256M
#要同步的數據庫
binlog-do-db = usercenter 
#不需要同步的數據庫
binlog-ignore-db = mysql 
binlog_ignore_db = information_schema 
binlog_ignore_db = performance_schema 
binlog_ignore_db = sys 
########################## # character set ########################## 
character-set-server = utf8mb4 
collation-server = utf8mb4_unicode_ci

log_bin是否開啟

mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set

查看master狀態

mysql> show master status \G;
*************************** 1. row ***************************
             File: mysql-bin.000002
         Position: 155
     Binlog_Do_DB: usercenter
 Binlog_Ignore_DB: mysql,information_schema,performation_schema,sys
 

【從庫mysql8-3】配置及操作

配置my.cnf

[client]
port = 3306
default-character-set = utf8mb4

[mysql]
port = 3306
default-character-set = utf8mb4

[mysqld]
##########################
# summary
##########################
#bind-address = 0.0.0.0
#port = 3306
#datadir=/datavol/mysql/data 	#數據存儲目錄

##########################
# log bin
##########################
server-id = 3
master_info_repository      = table
relay_log_info_repository   = table		

##########################
# character set
##########################
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

  

設置【主庫】信息

登錄【從庫mysql8-3】,進入mysql命令行。

mysql> stop slave;
Query OK, 0 rows affected

mysql> CHANGE MASTER TO 
MASTER_HOST='121.40.110.2',
MASTER_PORT=3310,
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=155 
for channel '1';
Query OK, 0 rows affected

mysql> CHANGE MASTER TO 
MASTER_HOST='121.40.110.2',
MASTER_PORT=3311,
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=155 
for channel '2';
Query OK, 0 rows affected

mysql> start slave;
Query OK, 0 rows affected

 stop slave;     //停止同步
start slave;     //開始同步
//必須和【主庫】的信息匹配。
CHANGE MASTER TO
MASTER_HOST='121.40.110.2             //主庫IP

MASTER_PORT=3310,                       //主庫端口
MASTER_USER='slave',                     //訪問主庫且有同步復制權限的用戶
MASTER_PASSWORD='123456',      //登錄密碼
//【關鍵處】從主庫的該log_bin文件開始讀取同步信息,主庫show master status返回結果
MASTER_LOG_FILE='mysql-bin.000001',
//【關鍵處】從文件中指定位置開始讀取,主庫show master status返回結果
MASTER_LOG_POS=155
for channel '1';            //定義通道名稱 

查看同步狀態

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 47.111.132.49
                  Master_User: slave
                  Master_Port: 3310
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000006
          Read_Master_Log_Pos: 169442
               Relay_Log_File: efe0882a2350-relay-bin-1.000017
                Relay_Log_Pos: 169656
        Relay_Master_Log_File: mysql-bin.000006
             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: 169442
              Relay_Log_Space: 170040
              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: 1
                  Master_UUID: 399257c7-a933-11e9-8d35-0242ac110002
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave 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: 
                Auto_Position: 0
         Replicate_Rewrite_DB: (datingCenter_0,matchCenter_0),(userCenter_0,matchCenter_0)
                 Channel_Name: 1
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 0
            Network_Namespace: 
*************************** 2. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 47.111.132.49
                  Master_User: slave
                  Master_Port: 3311
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000006
          Read_Master_Log_Pos: 155
               Relay_Log_File: efe0882a2350-relay-bin-2.000019
                Relay_Log_Pos: 369
        Relay_Master_Log_File: mysql-bin.000006
             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: 155
              Relay_Log_Space: 753
              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: 2
                  Master_UUID: 39a3fc71-a933-11e9-ac19-0242ac110003
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave 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: 
                Auto_Position: 0
         Replicate_Rewrite_DB: (datingCenter_0,matchCenter_0),(userCenter_0,matchCenter_0)
                 Channel_Name: 2
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 0
            Network_Namespace: 
2 rows in set (0.01 sec)

ERROR: 
No query specified

可以看見設置兩個個的主從同步通道的所有狀態信息。
只有【Slave_IO_Running】和【Slave_SQL_Running】都是Yes,同步才是正常的。
如果是No或者Connecting都不行,可查看mysql-error.log,

可以重啟容器試試或者等待一會  

若需要單獨啟動或停止某個同步通道,可使用如下命令:
start slave for channel '300';     //啟動名稱為300的同步通道
stop slave for channel '300';     //停止名稱為300的同步通道

驗證數據同步

新建庫和表等,會發現同步到了mysql8-3上

 

 

第二種情形:
多個主庫上的表同步到從庫的的一個庫里面

  • 主庫mysql8-1:IP=121.40.110.2; PORT=3310; server-id=1; database=datingcenter; table=aa、dd
  • 主庫mysql8-2:IP=121.40.110.2; PORT=3311; server-id=2; database=usercenter ;table=cc、bb
  • 從庫mysql8-3:IP=121.40.110.2; PORT=3312; server-id=3; database=matchcenter ;table=aa、dd、cc、bb

 

配置文件

【主庫mysql8-1】操作及配置

配置my.cnf(/etc/mysql/my.cnf)

取消掉

binlog-do-db = datingcenter

【主庫mysql8-2】操作及配置

配置my.cnf(/etc/mysql/my.cnf)

取消掉

binlog-do-db = usercenter

【從庫mysql8-3】操作及配置

配置my.cnf(/etc/mysql/my.cnf)

[client]
port = 3306
default-character-set = utf8mb4

[mysql]
port = 3306
default-character-set = utf8mb4

[mysqld]
##########################
# summary
##########################
#bind-address = 0.0.0.0
#port = 3306
#datadir=/datavol/mysql/data     #數據存儲目錄

##########################
# log bin
##########################
server-id = 3
master_info_repository      = table
relay_log_info_repository   = table    
replicate-rewrite-db=datingCenter->matchCenter_0 replicate-rewrite-db=userCenter->matchCenter_0    

##########################
# character set
##########################
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

 

 

設置【從庫】信息

登錄【從庫mysql8-3】,進入mysql命令行。

mysql> stop slave;
Query OK, 0 rows affected

mysql> CHANGE MASTER TO 
MASTER_HOST='121.40.110.2',
MASTER_PORT=3310,
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=155 
for channel '1';
Query OK, 0 rows affected

mysql> CHANGE MASTER TO 
MASTER_HOST='121.40.110.2',
MASTER_PORT=3311,
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=155 
for channel '2';
Query OK, 0 rows affected

mysql> start slave;
Query OK, 0 rows affected

 stop slave;     //停止同步
start slave;     //開始同步
//必須和【主庫】的信息匹配。
CHANGE MASTER TO
MASTER_HOST='121.40.110.2             //主庫IP

MASTER_PORT=3310,                       //主庫端口
MASTER_USER='slave',                     //訪問主庫且有同步復制權限的用戶
MASTER_PASSWORD='123456',      //登錄密碼
//【關鍵處】從主庫的該log_bin文件開始讀取同步信息,主庫show master status返回結果
MASTER_LOG_FILE='mysql-bin.000001',
//【關鍵處】從文件中指定位置開始讀取,主庫show master status返回結果
MASTER_LOG_POS=155
for channel '1';            //定義通道名稱 

查看同步狀態

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 47.111.132.49
                  Master_User: slave
                  Master_Port: 3310
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000006
          Read_Master_Log_Pos: 169442
               Relay_Log_File: efe0882a2350-relay-bin-1.000017
                Relay_Log_Pos: 169656
        Relay_Master_Log_File: mysql-bin.000006
             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: 169442
              Relay_Log_Space: 170040
              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: 1
                  Master_UUID: 399257c7-a933-11e9-8d35-0242ac110002
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave 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: 
                Auto_Position: 0
         Replicate_Rewrite_DB: (datingCenter_0,matchCenter_0),(userCenter_0,matchCenter_0)
                 Channel_Name: 1
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 0
            Network_Namespace: 
*************************** 2. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 47.111.132.49
                  Master_User: slave
                  Master_Port: 3311
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000006
          Read_Master_Log_Pos: 155
               Relay_Log_File: efe0882a2350-relay-bin-2.000019
                Relay_Log_Pos: 369
        Relay_Master_Log_File: mysql-bin.000006
             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: 155
              Relay_Log_Space: 753
              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: 2
                  Master_UUID: 39a3fc71-a933-11e9-ac19-0242ac110003
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave 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: 
                Auto_Position: 0
         Replicate_Rewrite_DB: (datingCenter_0,matchCenter_0),(userCenter_0,matchCenter_0)
                 Channel_Name: 2
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 0
            Network_Namespace: 
2 rows in set (0.01 sec)

ERROR: 
No query specified
在datingcenter建立表aa dd    usercenter建立表 bb cc
查看同步結果

 


參考:

https://juejin.im/entry/5bf7731351882518805ac985
https://www.cnblogs.com/zhjh256/p/9260554.html
https://blog.csdn.net/u014520745/article/details/76056170
https://blog.csdn.net/h996666/article/details/80921913
https://blog.csdn.net/sgrrmswtvt/article/details/82344183

























免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM