Mysql主從複製原理及搭建

Mysql主從複製原理

主從複製是指一臺服務器充當主數據庫服務器,另外一臺或多臺服務器充當從數據庫服務器,主服務器中的數據自動複製到從服務器之中。對於多級複製,數據庫服務器便可充當主機,也可充當從機。MySQL主從複製的基礎是主服務器對數據庫修改記錄二進制日誌,從服務器經過主服務器的二進制日誌自動執行更新。mysql

Mysq主從複製的類型

  • 基於語句的複製:

    主服務器上面執行的語句在從服務器上面再執行一遍,在MySQL-3.23版本之後支持。linux

    存在的問題:時間上可能不徹底同步形成誤差,執行語句的用戶也多是不一樣一個用戶。sql

  • 基於行的複製:

    把主服務器上面改變後的內容直接複製過去,而不關心到底改變該內容是由哪條語句引起的,在MySQL-5.0版本之後引入。數據庫

    存在的問題:若是修改的行數過多,形成的開銷比較大。bash

MySQL默認使用基於語句的複製,當基於語句的複製會引起問題的時候就會使用基於行的複製,MySQL會自動進行選擇。服務器

在MySQL主從複製架構中,讀操做能夠在全部的服務器上面進行,而寫操做只能在主服務器上面進行。主從複製架構雖然給讀操做提供了擴展,可若是寫操做也比較多的話(多臺從服務器還要從主服務器上面同步數據),單主模型的複製中主服務器勢必會成爲性能瓶頸。網絡

Mysql主從複製的工做原理

file

如上圖所示,主服務器上面的任何修改都會保存在二進制日誌Binary log裏面,從服務器上面啓動一個I/O thread(實際上就是一個主服務器的客戶端進程),鏈接到主服務器上面請求讀取二進制日誌,而後把讀取到的二進制日誌寫到本地的一個Realy log裏面。從服務器上面開啓一個SQL thread定時檢查Realy log,若是發現有更改當即把更改的內容在本機上面執行一遍。架構

若是一主多從的話,這時主庫既要負責寫又要負責爲幾個從庫提供二進制日誌。此時能夠稍作調整,將二進制日誌只給某一從,這一從再開啓二進制日誌並將本身的二進制日誌再發給其它從。或者是乾脆這個從不記錄只負責將二進制日誌轉發給其它從,這樣架構起來性能可能要好得多,並且數據之間的延時應該也稍微要好一些。性能

Mysql主從複製的過程

  1. Slave上面的IO進程鏈接上Master,並請求從指定日誌文件的指定位置(或者從最開始的日誌)以後的日誌內容。
  2. Master接收到來自Slave的IO進程的請求後,負責複製的IO進程會根據請求信息讀取日誌指定位置以後的日誌信息,返回給Slave的IO進程。返回信息中除了日誌所包含的信息以外,還包括本次返回的信息已經到Master端的bin-log文件的名稱以及bin-log的位置。
  3. Slave的IO進程接收到信息後,將接收到的日誌內容依次添加到Slave端的relay-log文件的最末端,並將讀取到的Master端的 bin-log的文件名和位置記錄到master-info文件中,以便在下一次讀取的時候可以清楚的告訴Master從何處開始讀取日誌。
  4. Slave的Sql進程檢測到relay-log中新增長了內容後,會立刻解析relay-log的內容成爲在Master端真實執行時候的那些可執行的內容,並在自身執行。

linux安裝mysql8而且實現主從同步

服務器準備

準備服務器Server1和Server2,若是在同一個服務器的話則安裝mysql時須要改變其端口。ui

卸載mysql

在安裝以前必須先檢查主機上有沒有安裝過mysql,若是安裝過的話必須先卸載。

安裝mysql

下載軟件包:

wget https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm

本地安裝:

yum localinstall mysql80-community-release-el7-1.noarch.rpm

安裝mysql:

yum install mysql-community-server

設爲開機啓動:

systemctl enable mysqld

systemctl daemon-reload

啓動mysql:

systemctl start mysqld

以上步驟就安裝好mysql8了。

獲取mysql的臨時密碼:

grep 'temporary password' /var/log/mysqld.log

登陸mysql:

mysql -uroot -p

會提示輸入密碼,輸入以前獲取的臨時密碼便可登陸。

此時須要修改mysql的密碼,要否則以後的步驟也會強制提示你須要修改密碼:

ALTER USER 'root'@'localhost' IDENTIFIED BY '121b33dAj934J1^Sj9ag';

mysql8默認對密碼的強度有要求,須要設置複雜一點,要否則也會提示錯誤。

刷新配置:

FLUSH PRIVILEGES;

主從配置

在主從配置以前須要確保兩臺mysql須要同步的庫狀態一致。

配置文件默認在/etc/my.cnf下。

在配置文件中新增配置:

[mysqld]
## 同一局域網內注意要惟一
server-id=100  
## 開啓二進制日誌功能,能夠隨便取(關鍵)
log-bin=mysql-bin
複製代碼

修改配置後須要重啓才能生效:

service mysql restart

重啓以後進入mysql:

mysql -uroot -p

在master數據庫建立數據同步用戶,授予用戶 slave REPLICATION SLAVE權限和REPLICATION CLIENT權限,用於在主從庫之間同步數據。

CREATE USER 'slave'@'%' IDENTIFIED BY '@#$Rfg345634523rft4fa';

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

語句中的%表明全部服務器均可以使用這個用戶,若是想指定特定的ip,將%改爲ip便可。

查看主mysql的狀態:

show master status;

記錄下FilePosition的值,而且不進行其餘操做以避免引發Position的變化。

在從my.cnf配置中新增:

mysqld]
## 設置server_id,注意要惟一
server-id=101  
## 開啓二進制日誌功能,以備Slave做爲其它Slave的Master時使用
log-bin=mysql-slave-bin   
## relay_log配置中繼日誌
relay_log=edu-mysql-relay-bin  
複製代碼

修改配置後須要重啓才能生效:

service mysql restart

重啓以後進入mysql:

mysql -uroot -p

change master to master_host='172.17.0.2', master_user='slave', master_password='@#$Rfg345634523rft4fa', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 2830, master_connect_retry=30;

master_host :Master的地址

master_port:Master的端口號

master_user:用於數據同步的用戶

master_password:用於同步的用戶的密碼

master_log_file:指定 Slave 從哪一個日誌文件開始複製數據,即上文中提到的 File 字段的值

master_log_pos:從哪一個 Position 開始讀,即上文中提到的 Position 字段的值

master_connect_retry:若是鏈接失敗,重試的時間間隔,單位是秒,默認是60秒

在從mysql中查看主從同步狀態:

show slave status \G;

此時的SlaveIORunning 和 SlaveSQLRunning 都是No,由於咱們尚未開啓主從複製過程。

開啓主從複製:

start slave;

再次查看同步狀態:

show slave status \G;

SlaveIORunning 和 SlaveSQLRunning 都是Yes說明主從複製已經開啓。

若SlaveIORunning一直是Connecting,有下面4種緣由:

一、網絡不通,檢查ip端口

二、密碼不對,檢查用於同步的用戶名和密碼

三、pos不對,檢查Master的Position

四、mysql8特有的密碼規則問題引發:

ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '@#$Rfg345634523rft4fa';

將密碼規則修改成:mysql_native_password

若是須要指定想要主從同步哪一個數據庫,能夠在master的my.cnf添加配置:

binlog-do-db:指定mysql的binlog日誌記錄哪一個db

或者在slave的my.cnf添加配置:

replicate-do-db=須要複製的數據庫名,若是複製多個數據庫,重複設置這個選項便可 replicate-ignore-db=須要複製的數據庫名,若是複製多個數據庫,重複設置這個選項便可

若是想要同步全部庫和表,在從mysql執行:

STOP SLAVE SQL_THREAD; CHANGE REPLICATION FILTER REPLICATE_DO_DB = (); start SLAVE SQL_THREAD;

若是以上步驟出現問題,能夠查看日誌:

/etc/log/mysqld.log

至此完成了mysql8主從同步搭建工做。

相關文章
相關標籤/搜索