1. 程式人生 > 其它 >MySQL-5.6主從複製

MySQL-5.6主從複製

一、 需求

1.準備6臺數據庫
2.一臺主庫,一臺從庫,一臺延時複製,一臺半同步複製,一臺過濾複製,一臺基於GTID的主從複製

3.環境準備

主機 外網ip 內網ip 主從
db01 10.0.0.51 172.16.1.51 mysql主庫
db02 10.0.0.52 172.16.1.52 mysql從庫
db03 10.0.0.53 172.16.1.53 mysql延時複製
db04 10.0.0.54 172.16.1.54 mysql半同步複製
db05 10.0.0.55 172.16.1.55 mysql過濾複製
db06 10.0.0.56 172.16.1.56 GTID主從複製

二、非同步複製

1.mysql主庫配置

#編輯主庫配置檔案
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
server_id=1
log_bin=mysql-bin

#檢視binlog
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+------------------+----------+--------------+------------------+-------------------------------+
| mysql-bin.000008 |      120 |              |                  | 0e2277b0-1e92-11eb-b4de-000c29577624:1-2 |
+------------------+----------+--------------+------------------+-------------------------------+
1 row in set (0.00 sec)

#授權使用者
mysql> grant replication slave on *.* to zzc@'172.16.1.%' identified by '123';
Query OK, 0 rows affected (1.00 sec)

2.從庫配置


#從庫配置
[root@db02 ~]# vim /etc/my.cnf
[mysqld]
server_id=2

[root@db02 ~]# mysql
mysql> change master to
    -> master_host='172.16.1.51',
    -> master_user='zzc',
    -> master_password='123',
    -> master_port=3306,
    -> master_log_file='mysql-bin.000008',
    -> master_log_pos=120;
Query OK, 0 rows affected, 2 warnings (0.09 sec)

mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.16.1.51
                  Master_User: zzc
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000008
          Read_Master_Log_Pos: 120
               Relay_Log_File: db02-relay-bin.000002
                Relay_Log_Pos: 283
        Relay_Master_Log_File: mysql-bin.000008
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

三、延時複製

[root@db03 ~]# vim /etc/my.cnf
[mysqld]
server_id=3

[root@db03 ~]# systemctl restart mysqld

[root@db03 ~]# mysql
mysql> change master to
    -> master_host='172.16.1.51',
    -> master_user='zzc',
    -> master_password='123',
    -> master_port=3306,
    -> master_log_file='mysql-bin.000008',
    -> master_log_pos=120,
    -> master_delay=3600;      #延時輔助只需多加這條內容

mysql> start slave;

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.16.1.51
                  Master_User: zzc
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000008
          Read_Master_Log_Pos: 120
               Relay_Log_File: db03-relay-bin.000002
                Relay_Log_Pos: 283
        Relay_Master_Log_File: mysql-bin.000008
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
------------------------------- 省略 ---------------------------------
					SQL_Delay: 3600
          SQL_Remaining_Delay: NULL

四、半同步複製


#半同步複製基於非同步複製而來

#修改從庫配置檔案
[root@db04 ~]# vim /etc/my.cnf
[mysqld]
server_id=4
rpl_semi_sync_slave_enabled =1

#先確認主從的MySQL伺服器是否支援動態增加外掛
mysql> show global variables like 'have_dynamic_loading';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| have_dynamic_loading | YES   |
+----------------------+-------+
1 row in set (0.00 sec)

#分別在主從庫上安裝對用外掛
-- 主庫安裝外掛
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME'semisync_master.so';
Query OK, 0 rows affected (0.01 sec)

-- 主庫開啟半同步複製
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
Query OK, 0 rows affected (0.00 sec)
mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000;
Query OK, 0 rows affected (0.00 sec)

-- 從庫安裝外掛
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
Query OK, 0 rows affected (0.20 sec)

#編輯主庫配置檔案
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
server_id=1
log_bin=mysql-bin
rpl_semi_sync_master_enabled=1         
rpl_semi_sync_master_timeout=1000

#從庫開啟半同步複製
mysql> set global rpl_semi_sync_slave_enabled=1;
Query OK, 0 rows affected (0.07 sec)
#重啟io執行緒使其生效
mysql> stop slave io_thread;
mysql> start slave io_thread;

#檢視binlog
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+------------------+----------+--------------+------------------+-------------------------------+
| mysql-bin.000009 |      120 |              |                  | 0e2277b0-1e92-11eb-b4de-000c29577624:1-2 |
+------------------+----------+--------------+------------------+-------------------------------+
1 row in set (0.00 sec)


[root@db04 ~]# mysql
mysql> change master to
    -> master_host='172.16.1.51',
    -> master_user='zzc',
    -> master_password='123',
    -> master_port=3306,
    -> master_log_file='mysql-bin.000009',
    -> master_log_pos=120;

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)


-- 主庫檢視
mysql> show status like 'Rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON    |
+-----------------------------+-------+
1 row in set (0.00 sec)

-- 從庫檢視
mysql> show status like 'Rpl_semi_sync_slave_status';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON    |
+----------------------------+-------+
1 row in set (0.00 sec)
#這兩個變數常用來監控主從是否執行在半同步複製模式下。

五、GTID的主從複製



#主庫
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
server_id=1
log_bin=mysql-bin

rpl_semi_sync_master_enabled=1         
rpl_semi_sync_master_timeout=1000

log-slave-updates
gtid_mode=on
enforce_gtid_consistency=on

#從庫1
[root@db56 ~]# vim /etc/my.cnf
[mysqld]
server_id=6
log_bin=mysql-bin
log-slave-updates
gtid_mode=on
enforce_gtid_consistency=on


mysql> change master to
    -> master_host='172.16.1.51',
    -> master_user='zzc',
    -> master_password='123',
    -> master_port=3306,
    -> master_log_file='mysql-bin.000009',
    -> master_log_pos=120;
    -> master_auto_position=1;

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.16.1.51
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000009
          Read_Master_Log_Pos: 151
               Relay_Log_File: db02-relay-bin.000002
                Relay_Log_Pos: 361
        Relay_Master_Log_File: mysql-bin.000009
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes