一、前言
mysql 提供一套操作十分簡便的方案來實施主從數據庫進行數據同步,使得開發人員能夠十分快速的構造一套高可用的主從數據庫環境。這裏主要探討一下mysql的同步過程,以及出現的一些概念、和簡單的原理做一下解釋。
二、binlog日誌
1.描述
如果想了解 mysql 主從數據庫之間是如何進行同步的,不可避免的就需要了解一下 binlog 日誌。 binlog 日誌又稱二進制日誌,從字面上的意思就知道 binlog 日誌存儲的形式爲二進制。 Binlog 日誌包含了所有針對數據庫的修改,包含了所有更新的數據以及潛在更新的數據(例如:沒有匹配任何行的update操作),除非 binlog 是基於行的日誌級別。此外,每個binlog日誌還包括了每個語句更新的時間長度信息。binlog的作用主要有以下兩點:
- 主要目的在於:
○ 第一:用於主從數據庫之間數據的同步
○ 第二:用於數據庫的數據的備份以及恢復
在啓用了binlog日誌之後,mysql所在服務器的性能會隨之下降。但是相比binlog提供的複製數據以及恢復數據的功能,這點的性能的下降不足掛齒。
2.日誌格式
binlog日誌格式類型分爲三種
-i.row-based
基於行的格式類型,記錄該條記錄在變更前以及變更後數據。需要特別注意的是一般要求相應的表擁有能標識該行記錄的主鍵。
配置方式:binlog-format=row
ii.statement-based
基於語句的格式類型,記錄了所有的記錄的執行語句。配置方式:binlog-format=statement
iii.mixed-base
以上兩種的混合方式記錄日誌,在master進行記錄時自動的切換模式。配置方式:binlog-format=mixed
在mysql 5.7.7 之前默認的方式爲statement-based,在這之後默認爲row-based方式。基於statement的方式可能出現一些不安全的問題,所以推薦使用基於行的方式。
3.配置binlog日誌
i.啓用binlog日誌
linux 環境下:
Vim /etc/my.cnf
[mysqld]
Log-bin=hostname[必須配置,但是可以不配置name。默認情況下,爲當前主機的host名稱,但是在生產環境中還是建議配置hostname。這是爲了在你不知情的情況下,修改了主機名稱,造成日誌文件不利於維護。]
Windows 環境下:
編輯 config 下面的my.ini 文件,配置如上
ii.查看binlog日誌
因爲binlog日誌的形式爲二進制爲鑑, Mysql 提供mysqlbinlog 來查看binlog日誌。直接進入到 mysql bin 文件目錄,shell>mysqlbinlog hostname.XXXX
三、主從同步
在瞭解了binlog的日誌之後,我們來正式瞭解一下mysql 主從同步的一些情況。
1.配置
-
i:對於master,需要配置基於行的方式記錄binlog日誌,配置server-id=1[需要保證在整個局域網內唯一即可]。並且在啓 用這些配置之後,需要重啓mysql實例。
-
ii:在master服務器新建一個用於讀取binlog日誌權限的mysql用戶。
GRANT REPLICATION SLAVE ON . TO ‘username’@‘host’ IDENTIFIED BY ‘mysql’; -
iii:對於slave來說,在配置完以上的配置之後。並且需要配置一些信息用來與master進行交互,
master_host:master主機的地址; master_user:主機上擁有binlog日誌讀取權限的用戶名; master_password:主機上擁有binlog日誌讀取權限的用戶名對應的密碼; master_log_file:binlog日誌文件名; master_log_pos:開始進行binlog日誌同步的位置。
2.基本原理
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-kFHfGjPe-1591524611970)(https://img-blog.csdn.net/20170117160814331?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2ZsMjAxMjEzMTQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]
在master服務器上,binlogdump線程主要負責兩個任務。
i.binlogdump線程寫入binlog日誌文件。binlog文件大小超過配置的最大值之後,binlog日誌文件
重新另起文件,同時在文件的名上自動加1。
ii.binlogdump線程將binlog日誌發送到slave。
在slave服務器,讀取binlog和執行binlog是分開執行的,分別由 I/O 線程與 SQL DATA 線程分別進行操作。
i.I/O 線程讀取從master發過來的binlog數據,寫入中繼文件[relaylog]。
ii.SQL DATA 線程讀取中繼文件,讀取binlog日誌內容同步到slave服務器。
四、查看master、slave 狀態
在master服務上,可以看到mysqlbinlog 正在同步的文件,當前同步的數據的日誌位置。
binlog_ignore_db:binlog日誌忽略的數據庫,也就是不記錄binlog日誌的數據庫。
binlog_do_db:記錄binlog日誌的數據庫。
slave_io_state: slave服務器I/O 線程讀取binlog日誌的狀態。有一些狀態:
trying to connect to the master
waiting for events from the master
reconnecting to the master。
一般在運行穩定的情況下,爲waiting for events from the master 這個狀態。
master_host:主機的地址。
master_user:主機服務器上用於讀取binlog日誌的mysql用戶。
master_post: 主機mysql實例的端口號.
connect_retry:slave連接master時長。默認情況下爲一分鐘,可以配置。
master_log_file:當前讀取masterbinlog日誌文件名。
read_master_log_pos:當前讀取masterbinlog日誌位置。
relay_log_file:當前服務器 sql 線程讀取的relay_log 日誌文件名。
relay_log_pos:當前服務器sql線程讀取位置
relay_master_log_file:當前讀取中繼日誌文件名。
slave_io_running: slave I/O 線程的狀態。
slave_sql_running: SQL 線程的狀態。
以上兩個狀態用來標誌slave日誌同步的狀態,當前如果狀態標誌爲 NO 的情況下。就表明該slave服務器運行沒有問題。
replicat_ignore_table:無需進行同步的數據庫。
五、總結
經過這些瞭解,我們已經能夠整體上了解mysql 主從同步的一些基本的概念和原理。binlog 日誌是整個mysql同步的核心內容,加上主從服務器各自的三個進程binlog dump 以及sql 進程以及 I/O 進程來輔助整個binloog從主服務器到從服務器的數據同步。