Mysql主從同步的實現原理與配置實戰

来源:https://www.cnblogs.com/a609251438/archive/2019/11/06/11805160.html
-Advertisement-
Play Games

1、什麼是mysql主從同步? 當master(主)庫的數據發生變化的時候,變化會實時的同步到slave(從)庫。 2、主從同步有什麼好處? 水平擴展資料庫的負載能力。 容錯,高可用。Failover(失敗切換)/High Availability 數據備份。 3、主從同步的原理是什麼? 首先我們來 ...


1、什麼是mysql主從同步?

當master(主)庫的數據發生變化的時候,變化會實時的同步到slave(從)庫。

2、主從同步有什麼好處?

  • 水平擴展資料庫的負載能力。
  • 容錯,高可用。Failover(失敗切換)/High Availability
  • 數據備份。

3、主從同步的原理是什麼?

首先我們來瞭解master-slave的體繫結構。如下圖:



不管是delete、update、insert,還是創建函數、存儲過程,所有的操作都在master上。當master有操作的時候,slave會快速的接收到這些操作,從而做同步。

 

但是,這個機制是怎麼實現的呢?在master機器上,主從同步事件會被寫到特殊的log文件中(binary-log);在slave機器上,slave讀取主從同步事件,並根據讀取的事件變化,在slave庫上做相應的更改。

如此,就實現了主從同步了!

下麵我們來詳細的瞭解。3.1主從同步事件有哪些上面說到:在master機器上,主從同步事件會被寫到特殊的log文件中(binary-log);

主從同步事件有3種形式:statement、row、mixed。

  1. statement:會將對資料庫操作的sql語句寫入到binlog中。
  2. row:會將每一條數據的變化寫入到binlog中。
  3. mixed:statement與row的混合。Mysql決定什麼時候寫statement格式的,什麼時候寫row格式的binlog。


3.2在master機器上的操作

當master上的數據發生改變的時候,該事件(insert、update、delete)變化會按照順序寫入到binlog中。binlog dump線程當slave連接到master的時候,master機器會為slave開啟binlog dump線程。當master 的 binlog發生變化的時候,binlog dump線程會通知slave,並將相應的binlog內容發送給slave。

 

3.3在slave機器上的操作

當主從同步開啟的時候,slave上會創建2個線程。

  • I/O線程。該線程連接到master機器,master機器上的binlog dump線程會將binlog的內容發送給該I/O線程。該I/O線程接收到binlog內容後,再將內容寫入到本地的relay log。
  • SQL線程。該線程讀取I/O線程寫入的relay log。並且根據relay log的內容對slave資料庫做相應的操作。

3.4如何在master、slave上查看上述的線程?

使用SHOW PROCESSLIST命令可以查看。如圖,在master機器上查看binlog dump線程

如圖,在slave機器上查看I/O、SQL線程。


接下來給大家講解mysql主從同步實戰系統環境:系統的話大同小異,都差不多,我這裡用的是ubuntu16.04+mysql5.7,用到兩台伺服器:其中master IP:192.168.33.22,另一個slave IP:192.168.33.33

 

master機器上的操作

1、更改配置文件我們找到文件/etc/mysql/mysql.conf.d/mysqld.cnf

配置如下:

bind-address = 192.168.33.22 #your master ip
server-id = 1 #在master-slave架構中,每台機器節點都需要有唯一的server-id
log_bin = /var/log/mysql/mysql-bin.log #開啟binlog

 

2、重啟mysql,以使配置文件生效。

sudo systemctl restart mysql

 

3、創建主從同步的mysql user。

$ mysql -u root -p
Password:

##創建slave1用戶,並指定該用戶只能在主機192.168.33.33上登錄。
mysql> CREATE USER 'slave1'@'192.168.33.33' IDENTIFIED BY 'slavepass';
Query OK, 0 rows affected (0.00 sec)

##為slave1賦予REPLICATION SLAVE許可權。
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'192.168.33.33';
Query OK, 0 rows affected (0.00 sec)

 

4、為MYSQL加讀鎖為了主庫與從庫的數據保持一致,我們先為mysql加入讀鎖,使其變為只讀。

mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.00 sec)

 

5、記錄下來MASTER REPLICATION LOG 的位置該信息稍後會用到。

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File    | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |  613 |    |     |     |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
 
 

6、將master DB中現有的數據信息導出

$ mysqldump -u root -p --all-databases --master-data > dbdump.sql

 

7、接觸master DB的讀鎖

mysql> UNLOCK TABLES;

 

8、將步驟6中的dbdump.sql文件copy到slave

scp dbdump.sql [email protected]:/home/ubuntu

 

 

slave機器上的操作

1、更改配置文件我們找到文件/etc/mysql/mysql.conf.d/mysqld.cnf

更改配置如下:

bind-address = 192.168.33.33 #your slave ip
server-id = 2 #master-slave結構中,唯一的server-id
log_bin = /var/log/mysql/mysql-bin.log #開啟binlog

 

2、重啟mysql,以使配置文件生效

sudo systemctl restart mysql

 

 

3、導入從master DB。導出的dbdump.sql文件,以使master-slave數據一致

$ mysql -u root -p < /home/ubuntu/dbdump.sql

 

4、使slave與master建立連接,從而同步

$ mysql -u root -p
Password:

mysql> STOP SLAVE;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> CHANGE MASTER TO
 -> MASTER_HOST='192.168.33.22',
 -> MASTER_USER='slave1',
 -> MASTER_PASSWORD='slavepass',
 -> MASTER_LOG_FILE='mysql-bin.000001',
 -> MASTER_LOG_POS=613;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)

MASTER_LOG_FILE='mysql-bin.000001'與MASTER_LOG_POS=613的值,是從上面的SHOW MASTER STATUS得到的。經過如此設置之後,就可以進行master-slave同步了

 

~

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 之前寫過一篇博客“深入理解Linux修改hostname”,裡面總結了RHEL 5.7下麵如何修改hostname,當然這篇博客的內容其實也適用於CentOS 6,但是自CentOS 7開始,已經跟CentOS 6已經有很大不同了,一直沒有總結CentOS 7下修改hostname的相關知識點,今天... ...
  • [20191106]善用column格式化輸出.txt# man columnDESCRIPTION The column utility formats its input into multiple columns. Rows are filled before columns. Input i ...
  • Listener refused the connection with the following error: ORA-12514, TNS:listener does not currently know of service requested in connect descriptor. ...
  • elastic search 集群新增node 同一臺物理機 ...
  • [Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(0... ...
  • 說來和MySQL倒是有緣,畢業的第一份工作就被分配到了RDS團隊,主要負責把MySQL弄到雲上做成資料庫服務。雖說整天和MySQL打交道,但說實話那段時間並沒有很深入的理解MySQL內核,做的事情基本都是圍繞著MySQL做管控系統,比較上層。好在周邊都是MySQL內核神級人物,在他們的熏陶下多多少少 ...
  • 初次使用redis時,在鏈接Redis後,運行報錯“No module named redis”。 具體代碼如下: import redis r = redis.Redis(host='192.168.2.22',port=6379,db=2) r.set('name','Delia') print ...
  • mysql不支持全連接,但可以通過左外連接+ union+右外連接實現 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...