天天看點

mysql 主從同步 與 半同步

mysql主從同步複制定義

主從同步使得資料可以從一個資料庫伺服器複制到其他伺服器上,在複制資料時,一個伺服器充當主伺服器(master),其餘的伺服器充當從伺服器(slave)。通過配置檔案,可以指定複制所有的資料庫,某個資料庫,甚至是某個資料庫上的某個表。

使用主從同步的好處:
  1. 通過增加從伺服器來提高資料庫的性能,在主伺服器上執行寫入和更新,在從伺服器上向外提供讀功能,可以動态地調整從伺服器的數量,進而調整整個資料庫的性能。
  2. 提高資料安全-因為資料已複制到從伺服器,從伺服器可以終止複制程序,是以,可以在從伺服器上備份而不破壞主伺服器相應資料
  3. 在主伺服器上生成實時資料,而在從伺服器上分析這些資料,進而提高主伺服器的性能

    半同步複制 ---- 解決資料丢失的問題

    并行複制 ---- 解決從庫複制延遲的問題

主從複制--異步複制原理:

mysql 主從同步 與 半同步

半同步複制原理:

mysql 主從同步 與 半同步

配置主從同步

有很多種配置主從同步的方法,可以總結為如下的步驟:

1.主、從伺服器都開啟二進制子產品功能,每台伺服器都有獨立的 ID 不可重複

2.修改 從伺服器的 UUID不可相同

3.按照該配置檔案,在從伺服器上建立相關的 目錄

4.同步主伺服器的資料内容,分别同步到各個從伺服器中(所有伺服器的資料保持一緻性)

5.檢視二進制檔案所在的位置和名稱,以便主從同步資料一緻

mysql 主從同步 與 半同步

一、配置主伺服器

1、添加二進制子產品,并建立對應的目錄

[root@rehl-10 mysql]# vim /etc/my.cnf
    ......
log-bin=/data/binmysql/mysql-bin
server-id=1
    ......

[root@rehl-10 ~]# mkdir /data/binmysql
[root@rehl-10 ~]#chown  mysql:mysql -R  /data/binmysql            

2、建立資料庫的使用者,授權可以進行複制、操作的賬戶:

啟動資料庫,進入資料庫。建立使用者 “mary“ 密碼 “123123” ,授權給 192.168.10.% 段的 ip,并重新整理時期生效

[root@rehl-10 mysql]# /usr/local/mysql57/support-files/mysql.server start
[root@rehl-10 mysql]# /usr/local/mysql57/bin/mysql -uroot
Mysql>  grant all on *.* to 'mary'@'192.168.10.%'  identified by “123123”;
Mysql>  flush privileges;           

檢視是否生效:

mysql> select host,user from mysql.user;
+--------------+---------------+
| host         | user          |
+--------------+---------------+
| 192.168.10.% | mary          |
| 192.168.10.% | root          |
| localhost    | mysql.session |
| localhost    | mysql.sys     |
| localhost    | root          |
+--------------+---------------+
5 rows in set (0.25 sec)

mysql>            

3、備份資料,複制資料到從伺服器中

利用 innobackupex 備份或者 LVM 快照備份

4、檢視目前的二進制檔案

目前二進制檔案名字為 000026 位置已到 797 ;

mysql> show master status;
| File             | Position |
| mysql-bin.000026 |      797 |             

二、配置從伺服器

1、複制配置檔案到從伺服器,檢查是否開啟二進制檔案,修改配置檔案中的 ID 和 UUID(UUID不一緻可以不用改)

[root@rehl-10 ~]# scp /etc/my.cnf 192.168.10.15:/etc/
[root@rehl-15 ~]# vim /etc/my.cnf
    ......
log-bin=/data/binmysql/mysql-bin
server-id=2
    ......

[root@rehl-15 ~]# mkdir /data/binmysql
[root@rehl-15 ~]# chown  mysql:mysql  /data/binmysql

[root@rehl-15 ~]# vim /mysql/auto.cnf 
[auto]
server-uuid=0c45e903-c4c4-11e8-8fa1-000c296bd14d           

2、 登入從伺服器的 mysql 用戶端

mysql> stop slave;
mysql> reset slave;
mysql> change master to master_host='192.168.10.10',master_user='mary',master_password='123123',master_log_file='mysql-bin.000026',master_log_pos=797;  

mysql> start slave;    #開始啟動從伺服器功能           

3、 檢視從伺服器資訊

mysql> show slave status  \G;           
mysql 主從同步 與 半同步

4、測試觀察,在主伺服器中插入資料,在從伺服器上進行察看

mysql 主從同步 與 半同步

注意:從資料庫隻能讀,并不能寫。

mysql 半同步複制

1.當Slave主機連接配接到Master時,能夠檢視其是否處于 半同步複制的機制。

2.當Master上開啟半同步複制的功能時,至少應該有一個Slave開啟其功能

同步(社群增強半同步),異步,半同步複制的比較:
  1. 同步複制:Master送出事務,直到事務在所有的Slave都已送出,此時才會傳回用戶端,事務執行完畢。缺點:完成一個事務可能會有很大的延遲。
  2. 異步複制:當Slave準備好才會向Master請求binlog。缺點:不能保證一些事件都能夠被所有的Slave所接收。
  3. 半同步複制:半同步複制工作的機制處于同步和異步之間,Master的事務送出阻塞,隻要一個Slave已收到該事務的事件且已記錄。它不會等待所有的Slave都告知已收到,且它隻是接收,并不用等其完全執行且送出 ... 是以,半同步複制最好在低延時的網絡中使用
    mysql 主從同步 與 半同步

開啟半同步複制

在主伺服器節點上安裝相關的插件(在配置檔案上添加相關的子產品)
[root@rehl-10 mysql]# vim /etc/my.cnf

plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1            

重新開機服務,察看

mysql 主從同步 與 半同步
在從伺服器節點上安裝相關的插件(在配置檔案上添加相關的子產品)
[root@rehl-10 mysql]# vim /etc/my.cnf

plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1            
mysql 主從同步 與 半同步
測試觀察

主伺服器線上,所有從伺服器離線,

此時向主伺服器插入資料,觀察。。。

mysql> stop slave;
Query OK, 0 rows affected (0.31 sec)           
mysql 主從同步 與 半同步

插入資料花了 整整 10s

當再次插入資料的時候;或者在從伺服器恢複半同步複制。再次觀察,沒有了延時

mysql> start slave;
Query OK, 0 rows affected (0.31 sec)           
mysql 主從同步 與 半同步

GTID 的工作原理

1、當一個事務在主庫端執行并送出時,産生GTID,一同記錄到 主 的 binlog日志中。

2、binlog傳輸到slave,并存儲到slave的 relaylog後,讀取這個GTID的這個值設定gtid_next變量,即告訴Slave,下一個要執行的GTID值。

3、從伺服器的 sql線程從relay log 中擷取GTID,然後對比 slave 自己的 binlog 是否有該 GTID。

4、如果有記錄,說明該GTID的事務已經執行,slave會忽略。

5、如果沒有記錄,slave就會執行該 GTID事務,并記錄該 GTID 到自身的 binlog,在讀取執行事務前會先檢查其他session持有該GTID,確定不被重複執行。

6、在解析過程中會判斷是否有主鍵,如果沒有就用二級索引,如果沒有就用全部掃描。

GTID 的優勢

1、更簡單的實作failover,不用以前那樣在需要找 log_file 和 log_pos。

2、更簡單的搭建主從複制。

3、比傳統的複制更加安全。

4、GTID是連續的沒有空洞的,保證資料的一緻性,零丢失。

配置 master 節點

[root@rehl-10 mysql]# vim /etc/my.cnf
log-slave-updates=on
gtid-mode=on
enforce-gtid-consistency=ON           

配置 slave 節點

[root@rehl-15 mysql]# vim /etc/my.cnf
gtid-mode=ON
enforce-gtid-consistency=ON
log-slave-updates=ON
MASTER_AUTO_POSITION=1           

設定指點伺服器

在slave從伺服器上設定将從伺服器指向主伺服器,并啟動複制線程:

mysql> CHANGE MASTER TO MASTER_HOST='192.168.10.71', MASTER_USER='mary', MASTER_PASSWORD='123123', MASTER_AUTO_POSITION=1;
mysql> start slave;
mysql> show slave status \G;           
支援 GTID 模式

繼續閱讀