MySQL主從複製與GTID主從複製

1.主從複製mysql

1.1原理sql

  主庫開啓binlog功能並受權從庫鏈接主庫,從庫經過change master獲得主庫的相關同步信息,而後鏈接主庫進行驗證,主庫IO線程根據從庫slave線程的請求,從master.info開始記錄的位置點向下開始取信息,同時把取到的位置點和最新的位置與binlog信息一同發給從庫IO線程,從庫將相關的sql語句存放在relay-log裏面,最終從庫的sql線程將relay-log裏的sql語句應用到從庫上,至此整個同步過程完成,以後將是無限重複上述過程。數據庫

image.png


1.2做用vim

  1)輔助備份安全

  2)高可用,雙主多從服務器

  3)分擔負載,讀寫分離session


2.部署主從複製架構


2.1主庫建立受權用戶replapp

mysql> grant replication slave on *.* to repl@'10.0.0.%' idnetified by '123456';socket


2.2準備工做(若是新環境,此步驟省略;若是主庫已經運行一段時間,須要備份主庫數據到從庫)

主庫備份

[root@master ~]# mysqldump -A --master-data=2 -p > /tmp/full1.sql  

從庫恢復

[root@backup ~]# scp 172.16.1.102:/tmp/full.sql /tmp

mysql> set sql_log_bin=0;

mysql> source /tmp/full.sql;


2.3主庫開啓binlog

[root@master ~]# vim /etc/my.cnf

log_bin=/data/mysql/mysql-bin

binlog_format=row


[root@master ~]# /etc/init.d/mysqld restart


2.4從庫創建與主庫的鏈接

mysql> CHANGE MASTER TO

      MASTER_HOST='172.168.1.102',

      MASTER_USER='repl',

      MASTER_PASSWORD='123456',

      MASTER_PORT=3306,

      MASTER_LOG_FILE='mysql-bin.000002',

      MASTER_LOG_POS=656;


2.5從庫開始複製

mysql> start slave;


2.6檢查

mysql> show slave status\G;

Slave_IO_Running: Yes

Slave_SQL_Running: Yes


注意:只有所有yes,才成功;不然失敗。


3.Gtid主從複製


3.1簡介

  GTID是一個基於原始mysql服務器生成的一個已經被成功執行的全局事務ID,它由服務器ID以及事務ID組合而成。這個全局事務ID不單單在原始服務器器上惟一,在全部存在主從關係 的mysql服務器上也是惟一的。正是由於這樣一個特性使得mysql的主從複製變得更加簡單,以及數據庫一致性更可靠


3.2概念

  1)全局事務標識:global transaction identifiers。

  2)GTID是一個事務一一對應,而且全局惟一ID。

  3)一個GTID在一個服務器上只執行一次,避免重複執行致使數據混亂或者主從不一致。

  4)GTID用來代替傳統複製方法,再也不使用MASTER_LOG_FILE+MASTER_LOG_POS開啓複製。而是使用MASTER_AUTO_POSTION=1的方式開始複製。

  5)MySQL-5.6.5開始支持的,MySQL-5.6.10後開始完善。

  6)在傳統的slave端,binlog是不用開啓的,可是在GTID中slave端的binlog是必須開啓的,目的是記錄執行過的GTID(強制)。


3.3優點

  1)更簡單的實現failover,不用之前那樣再須要找log_file和log_pos

  2)更簡單的搭建主從複製

  3)比傳統的複製更加安全

  4)GTID是連續的沒有空洞的,保證數據的一致性,零丟失


3.4工做原理

  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事務,並記錄該GITD到自身的binlog,在讀取執行事務前會先檢查其餘的session持有        GTID,確保不被重複執行。

  6)在解析過程當中會判斷是否有主鍵,若是沒有就用二級索引,若是沒有就用所有掃描


4.部署gtid主從複製


4.1清理環境

rm -rf /application/myql/data/*


4.2構建主從環境

----------master節點----------

vim /etc/my.cnf

[mysqld]

basedir=/application/mysql

datadir=/application/mysql/data

server-id=1      #同一個複製拓撲中的全部服務器的id號必須惟一

log-bin=mysql-bin

socket=/tmp/mysql.sock

binlog-format=ROW    #二進制日誌格式,強烈建議爲ROW

gtid-mode=on    #啓用gtid類型,不然就是普通的複製架構

enforce-gtid-consistency=true     #強制gtid的一致性

log-slave-updates=1    #slave更新是否記入日誌

skip-name-resolve

[client]

socket=/tmp/mysql.sock


----------slave1----------

vim /etc/my.cnf

[mysqld]

basedir=/application/mysql

datadir=/application/mysql/data

server-id=2

binlog-format=ROW

gtid-mode=on

enforce-gtid-consistency=true

log-bin=mysql-bin

log_slave_updates = 1

socket=/tmp/mysql.sock

skip-name-resolve

[client]

socket=/tmp/mysql.sock


----------slave2----------

vim /etc/my.cnf

[mysqld]

basedir=/application/mysql

datadir=/application/mysql/data

server-id=3

binlog-format=ROW

gtid-mode=on

enforce-gtid-consistency=true

log-bin=mysql-bin

log_slave_updates = 1

socket=/tmp/mysql.sock

skip-name-resolve

[client]

socket=/tmp/mysql.sock


4.3初始化master、slave全部節點,並啓動

/application/mysql/scripts/mysql_install_db --basedir=/application/mysql --datadir=/application/mysql/data --user=mysql

/etc/init.d/mysqld start


4.4master節點受權用戶repl

mysql> gant replication slave on *.* to repl@'10.0.0.%' identified by '123456';


4.5slave節點建立與master節點的鏈接

mysql> change master to

          >master_host='172.16.1.102',

          >master_user='repl',

          >master_password='123456',

          >master_auto_position=1;


4.6slave節點開啓複製

mysql> start slave;


4.7slave節點查看狀態

mysql> show slave status\G;

相關文章
相關標籤/搜索