mysql主從同步複制定義
主從同步使得資料可以從一個資料庫伺服器複制到其他伺服器上,在複制資料時,一個伺服器充當主伺服器(master),其餘的伺服器充當從伺服器(slave)。通過配置檔案,可以指定複制所有的資料庫,某個資料庫,甚至是某個資料庫上的某個表。
使用主從同步的好處:
- 通過增加從伺服器來提高資料庫的性能,在主伺服器上執行寫入和更新,在從伺服器上向外提供讀功能,可以動态地調整從伺服器的數量,進而調整整個資料庫的性能。
- 提高資料安全-因為資料已複制到從伺服器,從伺服器可以終止複制程序,是以,可以在從伺服器上備份而不破壞主伺服器相應資料
-
在主伺服器上生成實時資料,而在從伺服器上分析這些資料,進而提高主伺服器的性能
半同步複制 ---- 解決資料丢失的問題
并行複制 ---- 解決從庫複制延遲的問題
主從複制--異步複制原理:
半同步複制原理:
配置主從同步
有很多種配置主從同步的方法,可以總結為如下的步驟:
1.主、從伺服器都開啟二進制子產品功能,每台伺服器都有獨立的 ID 不可重複
2.修改 從伺服器的 UUID不可相同
3.按照該配置檔案,在從伺服器上建立相關的 目錄
4.同步主伺服器的資料内容,分别同步到各個從伺服器中(所有伺服器的資料保持一緻性)
5.檢視二進制檔案所在的位置和名稱,以便主從同步資料一緻
一、配置主伺服器
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;
4、測試觀察,在主伺服器中插入資料,在從伺服器上進行察看
注意:從資料庫隻能讀,并不能寫。
mysql 半同步複制
1.當Slave主機連接配接到Master時,能夠檢視其是否處于 半同步複制的機制。
2.當Master上開啟半同步複制的功能時,至少應該有一個Slave開啟其功能
同步(社群增強半同步),異步,半同步複制的比較:
- 同步複制:Master送出事務,直到事務在所有的Slave都已送出,此時才會傳回用戶端,事務執行完畢。缺點:完成一個事務可能會有很大的延遲。
- 異步複制:當Slave準備好才會向Master請求binlog。缺點:不能保證一些事件都能夠被所有的Slave所接收。
- 半同步複制:半同步複制工作的機制處于同步和異步之間,Master的事務送出阻塞,隻要一個Slave已收到該事務的事件且已記錄。它不會等待所有的Slave都告知已收到,且它隻是接收,并不用等其完全執行且送出 ... 是以,半同步複制最好在低延時的網絡中使用
開啟半同步複制
在主伺服器節點上安裝相關的插件(在配置檔案上添加相關的子產品)
[root@rehl-10 mysql]# vim /etc/my.cnf
plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1
重新開機服務,察看
在從伺服器節點上安裝相關的插件(在配置檔案上添加相關的子產品)
[root@rehl-10 mysql]# vim /etc/my.cnf
plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1
測試觀察
主伺服器線上,所有從伺服器離線,
此時向主伺服器插入資料,觀察。。。
mysql> stop slave;
Query OK, 0 rows affected (0.31 sec)
插入資料花了 整整 10s
當再次插入資料的時候;或者在從伺服器恢複半同步複制。再次觀察,沒有了延時
mysql> start slave;
Query OK, 0 rows affected (0.31 sec)
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 模式