MySQL(二)主從同步原理

一、前言

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從主服務器到從服務器的數據同步。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章