天天看點

MySQL複制以及調優

MySQL自帶複制方案,帶來好處有:

資料備份。 負載均衡。 分布式資料。

概念介紹:

主機(master):被複制的資料庫。 從機(slave):複制主機資料的資料庫。

複制步驟:

(1). master記錄更改的明細,存入到二進制日志(binary log)。

(2). master發送同步消息給slave。

(3). slave收到消息後,将master的二進制日志複制到本地的中繼日志(relay log)。

(4). slave重制中繼日志中的消息,進而改變資料庫的資料。

下面放一張經典的圖檔來說明這一過程:

MySQL複制以及調優

實作複制有以下步驟:

MySQL配置檔案一般存放在/etc/my.cnf

server-id是資料庫在整個資料庫叢集中的唯一标示,必須保持唯一。

重新開機MySQL。

<code>注:如果MySQL配置檔案中已經配置過此檔案,則可以跳過此步。</code>

在主庫裡面建立用于從庫複制主庫資料的賬号,并授予複制權限。

和第二步配置一樣,要注意的地方有兩點:

如果不需要從庫作為别的從庫的主庫的話,則不需要配置二進制日志。

很多時候複制并不需要複制主庫的全部資料庫(特别是mysql的資訊配置庫)。是以可以配置replicate_do_db來指定複制的資料庫

如果資料量不算大的情況下,可以使用mysqldump工具導出主庫資料,然後導入到從庫裡面。

如果資料量大的情況下應該使用Xtrabackup去進行資料庫的導出,此處不做介紹。

可能會有同學問,為什麼不直接使用二進制日志進行初始化呢?

如果我們主庫運作了比較長的一段時間,并不太适合使用從庫根據二進制日志進行複制資料,直接使用二進制日志去初始化從庫會比較耗費時間和性能。

更多的情況下,主庫的二進制日志的配置項沒有打開,是以也就不存在以前操作的二進制日志。

從庫執行下面指令

注意最後的兩個指令:MASTER_LOG_FILE和MASTER_LOG_POS,表示從庫的從哪個二進制檔案開始讀取,偏移量從那裡開始,這兩個參數可以從我們導入的SQL裡面找到。

MySQL複制以及調優

開啟複制

這時候就完成了複制,在主庫更新一個資料或者新增資料在從庫都可以查詢到結果。

MySQL複制以及調優

在主庫上也可以查詢的到複制線程的狀态。

MySQL複制以及調優

MySQL複制的日志格式有三種,根據主庫存放資料的方式不同有以下三種:

複制方式

特點

優點

缺點

row

基于行的格式複制,記錄需要修改的每行的資料資訊。 如果一個SQL修改了2w行的資料,那麼就會記錄2w行的日志格式

保證了資料的強一緻性,且由于記錄的是執行後的結果,在從庫上執行還原也會比較快

日志記錄數量很多,主從之間的傳輸需要更多的時間。

statement

基于段的日志格式複制,也就是記錄下更改的SQL記錄,而不是更改的行的記錄。

日志記錄量最小。

對于一些輸出結果不确定的函數,在從庫上執行一遍很可能會出現問題,如uuid,從庫根據日志還原主庫資料的時候需要執行一遍SQL,時間相對較慢。

mixed

混合上面兩種日志格式記錄記錄日志,至于什麼時候使用哪種日志方式由MySQL本身決定。

可以平衡上面兩種日志格式的優缺點。

mysql5.7以前預設使用statement格式。

設定方式,可以在配置檔案設定(首選):

或臨時設定全局變量(目前mysql連接配接有效):

由于兩個主從伺服器一般都會放在同一個機房裡面,兩者之間同步的速度會會比較快,為保證強一緻性,應該首選行的日志格式記錄(row),保證傳輸素速度可以選擇混合方式(mixed)。

而行的日志格式有下面三種記錄方式:

記錄方式

minimal

隻記錄被修改列的資料

full

記錄被修改的行的全部列的資料

noblob

特點同上,隻是如果沒有修改blob和text類型的列的情況下,不會記錄這些列的資料(也就是大資料列)

mysql預設是full,最好修改成minimal。

由于主庫和從庫之間不在同一個主機上,資料同步之間不可以避免地具有延遲,解決的方法有添加緩存,業務層的跳轉等待,如果非得從資料庫層面去減緩延遲問題,可以從複制時候的三大步驟(主庫産生日志,主從傳輸日志,從庫還原日志内容)入手:

1.主庫寫入到日志的速度

控制主庫的事務大小,分割大事務為多個小事務。

如插入20w的資料,改成插入多次5000行(可以利用分頁的思路)

2.二進制日志在主從之間傳輸時間

主從之間盡量在同一個機房或地域。

日志格式改用MIXED,且設定行的日志格式未minimal,原理詳見上面的日志格式介紹。

3.減少從庫還原日志的時間

在MySQL5.7版本後可以利用邏輯時鐘方式配置設定SQL多線程。

設定邏輯時鐘:slave_parallel_type=‘logical_clock’;

設定複制線程個數:slave_parallel_workers=4;

重新開機MySQL最好切換未MySQL使用者再進行操作,不然檔案啟動後會有權限問題。

搭建好MySQL的環境後就設定好配置裡的log-bin選項,這樣以後如果資料庫需要從庫的複制,就不需要重新開機資料庫,打斷業務的進行。

需要打開主庫的防火牆的對應的mysql端口。

由于從庫同步主庫的方式,監聽主庫發送的資訊,而不是輪詢,是以如果出現通信出現了故障,重新連接配接後如果主庫沒有進行資料更改的操作,從庫不會同步資料,是以可以通過插入空事務的方式同步資料。