mysql 主從同步 與 半同步

mysql主從同步複製定義

主從同步使得數據可以從一個數據庫服務器複製到其他服務器上,在複製數據時,一個服務器充當主服務器(master),其餘的服務器充當從服務器(slave)。通過配置文件,可以指定複製所有的數據庫,某個數據庫,甚至是某個數據庫上的某個表。

使用主從同步的好處:

  1. 通過增加從服務器來提高數據庫的性能,在主服務器上執行寫入和更新,在從服務器上向外提供讀功能,可以動態地調整從服務器的數量,從而調整整個數據庫的性能。

  2. 提高數據安全-因爲數據已複製到從服務器,從服務器可以終止複製進程,所以,可以在從服務器上備份而不破壞主服務器相應數據

  3. 在主服務器上生成實時數據,而在從服務器上分析這些數據,從而提高主服務器的性能

    半同步複製 ---- 解決數據丟失的問題
    並行複製 ---- 解決從庫複製延遲的問題

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

alt

半同步複製原理:

alt

配置主從同步

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

1.主、從服務器都開啓二進制模塊功能,每臺服務器都有獨立的 ID 不可重複

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

3.按照該配置文件,在從服務器上建立相關的 目錄

4.同步主服務器的數據內容,分別同步到各個從服務器中(所有服務器的數據保持一致性)

5.查看二進制文件所在的位置和名稱,以便主從同步數據一致

alt

一、配置主服務器

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;

alt

4、測試觀察,在主服務器中插入數據,在從服務器上進行察看

alt

注意:從數據庫只能讀,並不能寫。

mysql 半同步複製

1.當Slave主機連接到Master時,能夠查看其是否處於 半同步複製的機制。
2.當Master上開啓半同步複製的功能時,至少應該有一個Slave開啓其功能

同步(社區增強半同步),異步,半同步複製的比較:

  1. 同步複製:Master提交事務,直到事務在所有的Slave都已提交,此時纔會返回客戶端,事務執行完畢。缺點:完成一個事務可能會有很大的延遲。

  2. 異步複製:當Slave準備好纔會向Master請求binlog。缺點:不能保證一些事件都能夠被所有的Slave所接收。

  3. 半同步複製:半同步複製工作的機制處於同步和異步之間,Master的事務提交阻塞,只要一個Slave已收到該事務的事件且已記錄。它不會等待所有的Slave都告知已收到,且它只是接收,並不用等其完全執行且提交 ... 所以,半同步複製最好在低延時的網絡中使用
    alt

開啓半同步複製

主服務器節點上安裝相關的插件(在配置文件上添加相關的模塊)

[root@rehl-10 mysql]# vim /etc/my.cnf

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

重啓服務,察看

alt

從服務器節點上安裝相關的插件(在配置文件上添加相關的模塊)

[root@rehl-10 mysql]# vim /etc/my.cnf

plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1 

重啓服務,察看

alt

測試觀察

主服務器在線,所有從服務器離線
此時向主服務器插入數據,觀察。。。

mysql> stop slave;
Query OK, 0 rows affected (0.31 sec)

alt

插入數據花了 整整 10s

當再次插入數據的時候;或者在從服務器恢復半同步複製。再次觀察,沒有了延時

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

alt

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 模式

alt

同時支持 半同步複製

alt

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章