AB複製又稱主從複製,實現的是數據同步。如果要做MySQL AB複製,數據庫版本儘量保持一致。如果版本不一致,從服務器版本高於主服務器,但是版本不一致不能做雙向複製。MySQL AB複製有什麼好處呢?有兩點,第一是解決宕機帶來的數據不一致,因爲MySQL AB複製可以實時備份數據;第二點是減輕數據庫服務器壓力,這點很容易想到,多臺服務器的性能一般比單臺要好。但是MySQL AB複製不適用於大數據量,如果是大數據環境,推薦使用集羣。
然後我們來看看MySQL複製的 3 個主要步驟:
1)主服務器把數據更改記錄到二進制日誌中,這個操作叫做二進制日誌事件;
2)從服務器把主服務器的二進制日誌事件拷貝到自己的中繼日誌(relay log)中;
3)從服務器執行中繼日誌中的事件,把更改應用到自己的數據上。
主服務器將更新寫入二進制日誌文件,並維護文件的一個索引以跟蹤日誌循環。這些日誌可以記錄發送到從服務器的更新。當一個從服務器連接主服務器時,它通知主服務器從服務器在日誌中讀取的最後一次成功更新的位置。 從服務器接收從那時起發生的任何更新,然後封鎖並等待主服務器通知新的更新。請注意當你進行復制時,所有對複製中的表的更新必須在主服務器上進行。否則,你必須要小心,以避免用戶對主服務器上的表進行的更新與對從服務器上的表所進行的
更新之間的衝突。
先用老版的mysql進行實驗。
在server3(主機)上
#yum install mysql-server -y //rhel6.5系統自帶的時5.1.71的老版本
#service mysqld start //mysql初始化
#vim /etc/my.cnf //編輯mysql配置文件
在最後添加
server-id=1 //添加server-id,主從必須不同,如果設置多個從服務器,每個從服務器必須有一個唯一的 server-id 值,必須與主服務器的以及其它從服務器的不相同。可以認爲 server-id 值類似於 IP 地址:這些 ID 值能唯一識別複製服務器羣集中的每個服務器實例。
log-bin=mysql-bin //開啓日誌二進制文件mysql-bin
#service mysql restart
#mysql_secure_installation
添加root密碼redhat
#cd /var/lib/mysql
#mysqlbinlog msql-bin.000001 //查看日誌信息
#mysql -predhat
grant replication slave on *.* to [email protected] identified by ‘redhat’;
show master status;
在server4(從機)上
#yum install -y mysql-server
#service mysql start
#vim /etc/my.cnf
添加server-id=2
#mysql_secure_installation
添加root密碼爲redhat
#change master to master_host=’172.25.0.2’;master_user=’AB’;master_password=’redhat’;master_log_file=’mysql-bin.000001’;mysql_log_pos=’254’;
start slave
show slave status\G;
出現2個YES則連接成功。
在server3上,創建庫:create database redhat,能實時同步到server3上
添加表:use redhat;
create table usertb(username varchar(25) not null;password varchar(25) not null);
insert into usertb value (‘user1’,’123’);
server4上也能看到。
下面實現A-->B-->C複製
增加從機server5
在server4的my.cnf中,添加log-bin=mysql-bin
log-slave-updates,
然後執行上面的操作,只是將server4作爲主機,server5作爲從機。
AB複製只能實時複製,不能將之前的複製過去,爲了將server3的之前數據複製到server5上,可以將server3的mysql-bin.000001複製到server5中,在server5上,執行
#mysqlbinlog mysql-bin.000001
查看起始pos id與結束pos id。
#mysqlbinlog mysql-bin.000001 --start-position=起始id --stop-position=結束id //恢復這兩id之間的數據
在對server3的mysql進行操作,在server5上能實時看到變化,
由於mysql是5.1的老版本,主機向從機發送數據時,從機是單線程接受的,速度很慢。新版本5.7能多線程接收,效率能提升80%。它不再通過二進制日誌文件來匹配,而是通過gtid。
首先,移除所有老版本mysql。
#service mysqld stop
#rm -fr /var/lib/mysql/*
#rpm -e mysql
#yum remove mysql
直到#rpm -qa | grep mysql 下再無信息出現。
安裝
#service mysqld start
#less /var/log/mysqld.log
查看臨時root密碼
#mysql -p臨時密碼
修改密碼
在server3中
#vim /etc/my.cnf
在最後添加
gtid-mod=on
enforce-gtid-consistency=on //開啓gtid,並強制持續開啓。
#service mysqld restart
在mysql中,grant replication slave on *.* to [email protected] identified by ‘redhat’;
在server4中,
進入mysql
change master to master host=’172.25.0.3’,master_user=’AB’,master_password=’redhat’;,master_auto_position=1;
在server3中,創建表usertb,添加值user1、123
在server4中
AB複製成功。
下面對新版本mysql的並行多線程進行實驗。
在server4上的my.cnf中,添加
slave-parallel-type=LOGICAL CLOCK //從機並行方式爲邏輯時鐘
slave-parallel-worker=16 //並行進程爲16
進入mysql,在mysql中show slave\G可看到master uuid
爲使實驗明顯,創建觸發器add.sql實現大的數據庫。代碼爲
在server3上
#mysql -p密碼 redhat < add.sql
#mysql -p密碼
use redhat;
call test1;
在server4上,因爲一個表對應一個sql進程,由於採用併發多線程,進入mysql,在mysql中show slave\G可看到gtid增加很快,second_behind_master(延時)很小。
mysqlpump多線程備份:
mysqlpump相對於之前的邏輯備份工具mysqldump來說,優勢如下:
支持基於表的並行導出功能(參數–default-parallelism,默認爲2,參數–parallel-schemas,控制並行導出的庫)
導出的時候帶有進度條(參數–watch-progress,默認開啓)
支持直接壓縮導出導入(參數–compress-output,支持ZLIB和LZ4)
mysqlpump的並行導出功能的架構爲:隊列+線程,允許有多個隊列,每個隊列下有多個線程,而一個隊列可以綁定1個或者多個數據庫。但是,對於每張表的導出只能是單個線程的, 這和mydumper工具是不一樣的 ,因爲mydumper支持一張表多個線程以chunk的方式批量導出,這在主鍵是隨機的情況下,導出速度還能有提升。
#time mysqlpump -p密碼 redhat > redhat.sql
幾秒內很快備份完成
#time mysqlpump -p密碼 --default-parallelism=2 --compress-out=lz4 redhat > redhat
默認雙線程且壓縮爲lz4的格式