Mysql 主從複製(AB複製)
Mysql的主從複製又叫做AB複製,主要作用就是將主服務器上的數據及時複製到從服務器上,來實現數據的同步,這樣做的好處有,在進行數據備份時,可以減輕主服務器的運行壓力,另外即使主服務器宕機了,也能從從服務器上取得主服務器的數據,從而保證數據不會丟失。這對於一個企業來說是至關重要的。一般在實際生產環境中,由單臺mysql作爲獨立的數據庫是完全不能滿足實際需要的,無論在安全性,高可用性以及高併發等方面,一般是通過主從複製(Master-Slave)的方式來同步數據,再通過keepalived組件或者pacemaker來解決單點故障,實現高可用性,最後通過讀寫分離(Mysql-Proxy)來提升數據庫的併發負載能力。
今天我們就來實現主從複製,並且是採用兩種版本的數據庫,第一個主從複製實驗採用的是mysql-5.1.71-1.el6 ,第二個主從複製實驗採用的是mysql-5.7.11-1.el6版本。好了,話不多說,直接上步驟。
注意:一般作主從複製時一定要使得從機的mysql版本要和主服務器mysql版本一直,甚至高於主服務器才行。如果主服務器的mysql之前裏面有數據因該進行數據備份,再將數據拷貝到從數據庫中,保證數據庫初態一致。
要求:新開兩臺虛擬機,一臺主服務器,一臺從服務器。均安裝上數據庫mysql
實驗一:低版本的主從複製,直接通過yum源進行安裝。
MASRER: VM1 IP=172.25.45.15 hostname=mysql1
#yum install -y mysql-server
#/etc/init.d/mysqld start #啓動數據庫
#mysql_secure_installation #數據庫安全初始化,設置密碼等。
#mysql -pwestos #登陸數據庫
#vim /etc/my.cnf
7server-id=1 #數據庫id號,爲1時,表示爲master,每個同步的服務器都必須設定一個唯一的編號,否則同步就不能正常運行。
8log-bin=mysql-bin #啓用二進制日誌
#/etc/init.d/mysqld restart
#mysql -pwestos :進入數據庫,進行sql語句操作
>showmaster status;
>grantreplication slave on *.* to min@'172.25.45.16' identified by 'westos'; #授權給從mysql數據庫服務器172.25.45.16;
此時需要在從數據庫服務器上驗證以下授權的用戶及密碼能否遠程登陸到主服務器上。(#mysql -h 172.25.45.15 -umin -pwestos)
創建庫和表,在備份機進行驗證。
等操作。
SLAVE: VM2 IP=172.25.45.16 hostname=mysql2
#yum install -y mysql-server
#vim /etc/my.cnf
7server-id=2 #添加數據庫id號。
#/etc/init.d/mysqld start
#mysql_secure_installation #和上面類似,
#mysql -pwestos #進入數據庫,sql語句操作,配置SLAVE機:
>show slave status; #顯示從數據庫狀態。
>change masterto master_host='172.25.10.30',master_user='liumin',master_password='westos',master_log_file='mysql-bin.000001',master_log_pos=106; #執行同步SQL語句,啓動slave同步進程
>start slave; #啓動slave;
>show slavestatus\G; #顯示從數據庫狀態,檢查主從同步。
其中Slave_IO_running:yes 與Slave_SQL_Running:yes的值都必須爲yes才表示狀態正常。其中Slave_IO_running線程主要負責到Master上覆制二進制日誌文件的,而Slave_SQL_Running線程主要是將複製的文件在slave上執行一遍。
驗證主從複製的效果:
在MASTER上登陸數據庫,創建數據庫和表,並插入相關的值,再在SLAVE機上的數據庫中進行驗證。
MASTER:
#Mysql -pwestos
>create databasewestos;
>use westos;
>create table usertb (
-> username varchar(50) not null,
-> password varchar(50) not null);
>desc usertb;
>insert into usertb value ('user1','westos');
>select * fromusertb;
>delete from usertb where username='user1';
>select * from usertb;
SLAVE機:
#mysql -p
>showdatabases;
檢測slave是否已經達到數據庫的AB主從複製。
注:使用 mysqlbinlog 命令查看MASTER的二進制文件mysql-bin.000001 以及SLAVE的中繼日誌:mysqld-relay-bin.000001內容。
補充:ABC複製:A---> B ---> C
再開一臺虛擬機C:VM3
本次操作相當於把B機當作MASTER,C機當作SLAVE,不過B機的配置文件要進行相應的修改。必須額外添加一行:log-slave-updates.
B機配置且進行授權:
#vim /etc/my.cnf
server-id=2
Log-bin=mysql-bin
log-slave-updates
#/etc/init.d/mysqld restart
#mysql-pwestos
#grant replicationslave on *.* to minmin@'172.25.45.17' identified by 'westos'; #授權給從mysql數據庫服務器172.25.45.17;
C機:VM3 IP=172.25.45.17 Hostname=mysql3
#yum install -y mysql-server
#vim /etc/my.cnf
server-id=4
#/etc/init.d/mysqld start
#mysql_secure_installation
#mysql -pwestos
>change master to master_host='172.25.45.17',master_user='minmin', master_password='westos', mastr_log_file='mysql-bin.000001',master_log_pos=106; #執行同步SQL語句,啓動slave同步進程。
#start slave
#show slave status\G; #查看slave狀態。驗證同上。
此時A創建的數據庫及表都會同步到B並且也會同時同步到C上。這就是ABC主從複製。
實驗二:使用高版本的數據庫mysql-5.1.71-1.el6,作主從複製。
得先把之前的低版本mysql卸載乾淨。
#/etc/init.d/mysqld stop
#cd /var/log/mysql ---> # rm -fr *
# cd /root ---> #rm -fr *
# rpm-qa | grep mysql 查詢mysql軟件,然後進行卸載。
#rpm -e`rpm -qa | grep mysql` --nodeps
lftp --> mysql-5.7.11-1.el6.x86_64.rpm-bundle.tar
#獲得mysql-5.1.71-1.el6軟件,可以從官網下載。
#tar -xf mysql-5.7.11-1.el6.x86_64.rpm-bundle.tar :解壓tar包。
#yum install -y mysql-community-common-5.7.11-1.el6.x86_64.rpmmysql-community-libs-5.7.11-1.el6.x86_64.rpm mysql-community-client-5.7.11-1.el6.x86_64.rpm mysql-community-server-5.7.11-1.el6.x86_64.rpm
#安裝這四個rpm包。
#scp mysql-community-common-5.7.11-1.el6.x86_64.rpmmysql-community-libs-5.7.11-1.el6.x86_64.rpmmysql-community-client-5.7.11-1.el6.x86_64.rpm mysql-community-server-5.7.11-1.el6.x86_64.rpm [email protected]:
#將MASTER上的rpm包傳送到SLAVE機上。
在B機上也要把mysql卸載乾淨。#rpm -qa | grep mysql
#rpm -e`rpm -qa | grep mysql` --nodeps
# rpm-qa | grep mysql
然後在進行安裝nysql數據庫。
MASTER: VM1 IP=172.25.45.15 HOSTNAME=mysql1
#/etc/init.d/mysqld start
#less /var/log/mysqld.log #查找原始密碼;
#mysql_secure_installation-->輸入原始密碼,進行初始化並進行改密。
此密碼要求8位以上,並且要求大小寫字母以及包含特殊字符,和數字。
接下來做數據庫的A --- B熱備份,和上午的做法完全一致。但是下午採用的mysql-5.7的版本,所以可以採用多線程並行複製,同時採用GTID可以保證數據一致性。這是mysql5.7版本以後才具備的功能。GTID;主要用於保持數據的一致性。
#vim /etc/my.cnf #主備份機都要在最後添加這兩行;
Server-id=1
log-bin=mysql-bin
gtid-mode=on
enforce-gtid-consistency=on
#/etc/init.d/mysqld restart #進行mysql服務重起,
#mysql -p #登陸mysql進行授權;
>grant replication slave on *.* tomin@'172.25.45.16' identified by 'westos';
> show master status;
SLAVE: VM2 IP=172.25.45.16 hostname=mysql2
#vim /etc/my.cnf
server-id=2
gtid-mode=on
enforce-gtid-consistency=on
#/etc/init.d/mysqld restart #進行mysql服務重起
#mysql -p
>stop slave; #首先停止slave;
>change master to master_host='172.25.10.30',master_user='minmin',master_password='HELLOmin+1234',master_auto_position=1;
#執行同步SQL語句,採用GTID方式實現多線程並行複製
>start slave;
>show slave status\G; 查看slave狀態。
在SLAVE上的mysql主配置文件中添加並行模式:數據備份延遲時間能減少到最小,因爲是多線程進行操作,性能能夠提升80%左右。
編輯備機mysql主配置文件,添加並行模塊;
#vim /etc/my.cnf
server-id=2
gtid-mode=on
enforce-gtid-consistency=on
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16
master_info_repository=TABLE
relay_log_info_repository=TABLE
#/etc/init.d/mysqld restart;
#mysql -p
>show processlist; 查看數據庫線程數;
最後進行驗證主從複製:再MASTER上進行數據庫的創建以及相應的表的創建。這在前面都有所闡述,具體參看前面的內容。
測試使用程序add.sql進行,產生一千萬條數據。然後在將數據進行備份,比較傳統的mysqldump和mysqlpump備份速度的差異。
Maseter:
#mysql -pHELLO+1234 westos < add.sql
> call test1; 正在產生一千萬條數據。
同時也可以在備份機上查看主從備份數據的延時情況,比較單進程和多線程複製數據的速度。將剛纔產生的一千萬條數據使用以下三種方法進行備份,同時比較備份最短的時間。從中可以看出mysqldump的優勢。
在主機master上:
# time mysqldump -pHELLO+1234 westos > westos.sql
#time mysqlpump -pHELLO+1234 westos > westos.sql
#time mysqldumper -pHELLO+1234 westos > westos.sql
Mysqldump,mysqlpump,mysqldumper比較這三者之間備份數據的速度.
Lock (HA切換數據一致性) 半同步(給回執纔給用戶發session) 數據庫(延遲時間0 log-bin=mysql-bin
server-id=1 pos號數據一致性)
原子操作:保證數據一直操作結束,不中斷。