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