mysql的主從複製是指從一個mysql主服務器(MASTER)將數據複製到另一臺或多臺mysql從服務器(SLAVE)的過程,將主數據庫的DDL和DML操作通過二進制日誌傳到複製服務器上,然後在從服務器上對這些日誌重新執行,從而使從服務器的數據保持同步。
首先,主服務器會記錄二進制日誌,每個事務更新完畢數據之前,主服務器將這些操作的信息記錄在二進制日誌裏面,在事件寫入二進制日誌完成後,主服務器 通知存儲引擎提交事務。
SLAVE上面的I/O進程連接上MASTER,併發出日誌請求,MASTER接收到來自SLAVE的I/O進程的請求後,通過負責複製的I/O進程根據請求信息讀取指定日誌位置之後的日誌信息,返回給SLAVE的I/O進程。SLAVE的I/O進程接收到信息後,將接收到的日誌內容依次添加到SLAVE端的relay-log文件的最末端,並將讀取到的MASTER端的binlog文件名和位置記錄到master-Info文件中
SLAVE的SQL進程檢測到relay-log中新增了內容後,會馬上解析relay-log的內容成爲在master端真實執行時候的那些可執行內容,並在自身執行。
GTID的工作原理
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、在解析過程中會判斷是否有主鍵,如果沒有就用二級索引,如果沒有就用全部掃描。
準備工作:
/etc/init.d/iptables stop
172.25.85.2 server2.example.com master
172.25.85.3 server3.example.com slave
[server2和server3]上:
1.tar xf mysql-5.7.11-1.el6.x86_64.rpm-bundle.tar
yum install mysql-community-client-5.7.11-1.el6.x86_64.rpm
mysql-community-common-5.7.11-1.el6.x86_64.rpm
mysql-community-server-5.7.11-1.el6.x86_64.rpm
mysql-community-libs-5.7.11-1.el6.x86_64.rpm -y
/etc/init.d/mysqld start
less /var/log/mysqld.log ##在mysql的日誌中有數據庫的初始密碼
mysql_secure_installation
Securing the MySQL server deployment.
Enter password for user root:
##輸入在日誌中查找到的初始密碼,並設置新的密碼 Zhang+001
[ server2]:
vim /etc/my.cnf
server-id=1 ##必須爲 1 到 232–1 之間的一個正整數值 log-bin=mysql-bin ##啓動二進制日誌系統
/etc/init.d/mysqld restart
mysql -p ##密碼爲Zhang+001
grant replication slave on *.* to [email protected] identified by 'Zhang+001';
##數據庫的密碼
show master status;
server-id=2
/etc/init.d/mysqld restart
mysql -p
change master to master_host='172.25.85.2',master_user='jing',master_password='Zhang+001',master_log_file='mysql-bin.000001',master_log_pos=447 ;
start slave;
show slave status\G;
檢測: 一邊做一邊同步
server2:
mysql -pZhang+001
create database westos;
create table usertb( username varchar(50) not null, passwd varchar(25) not null);
insert into usertb value('user1','11111');
2. server2:
vim /etc/my.cnf
增加:
gtid-mode=on ##開啓gtid功能 enforce-gtid-consistency=on ##強制gtid一致性,開啓後對於特定create table不被支持
/etc/init.d/mysqld restart
mysql -p
use westos;
drop table usertb;
server3:
mysql -p
stop slave;
change master to master_host='172.25.85.2',master_user='jing',master_password='Zhang+001',master_auto_position=1;
vim /etc/my.cnf
增加:
gtid-mode=on enforce-gtid-consistency=on
/etc/init.d/mysqld restart
mysql -p
start slave;
show slave status\G;
server2:
mysql -pZhang+001
use westos
create table usertb(username varchar(25) not null, password varchar(25) not null);
insert into usertb value('user1','11111');
server3:
mysql -pZhang+001
select * from usertb;
3. server3:
vim /etc/my.cnf
開啓enhanced multi-threaded slave根據如下設置:
增加: slave-parallel-type=LOGICAL_CLOCK slave-parallel-workers=16 master_info_repository=TABLE relay_log_info_repository=TABLE relay_log_recovery=ON
開啓MTS功能後,務必將參數master_info_repostitory設置爲TABLE,這樣性能可以有50%~80%的提升。這是因爲並行複製開啓後對於元master.info這個文件的更新將會大幅提升,資源的競爭也會變大。
若將slave_parallel_workers設置爲0,則MySQL 5.7退化爲原單線程複製,但將slave_parallel_workers設置爲1,則SQL線程功能轉化爲coordinator線程,但是隻有1 個worker線程進行回放,也是單線程複製。
/etc/init.d/mysqld restart
show slave status;
show processlist;
server2:
mysql -pZhang+001
use westos;
drop table usertb;
mysql -pZhang+001 westos< add.sql
mysql -pZhang+001
use westos;
select * from usertb;
call test2;
server3:
mysql -p
show slave status\G; ##不斷的查詢進度
server2:
time mysqldump -pZhang+001 westos> westos.sql
time mysqlpump --default-parallelism=2 --compress-output=lz4 westos > test
time mysqlpump -pZhang+001 --default-parallelism=2 --compress-output=lz4 westos > test2
time mysqlpump -pZhang+001 --default-parallelism=2 westos > test3