主從復制的優勢是什么?如好搭建一個主從復制呢?

引言:

最近因為時間緣故,學校,比賽,面試很久沒有更新了,現在開始將會持續更新!!!歐克。我們往下看:


概述:

????????主從復制是指將數據庫的DDL和DML操作通過二進制日志傳到從庫服務器中,然后在從庫上對這些日志重新執行(也叫重做),從而使得從庫和主庫的數據保持同步。 MySQL支持一臺主庫同時向多臺從庫進行復制,從庫同時也可以作為其他從服務器的主庫,實現鏈狀復制。

好處是 :

  1. 主庫出現問題,從庫可以快速提供服務

  2. 降低主庫的壓力,實習讀寫分離,

  3. 可以在從庫中去備份文件,避免備份期間影響主庫服務 (數據之間存在延遲) ?

缺點:

? ? ?1. 數據一致性問題 。從庫數據同步存在延遲,無法保證實時一致性
? ? ?2. 單點故障問題,雖然從庫可以接管,但主庫宕機期間無法寫入的

? ? ?3. 資源消耗啊,配置和維護復雜性等...

原理:

? ? ? ? 其實之間的數據一致性主要是靠的日志文件中的二進制日志文件 -> Binlog 日志文件,主庫對數據的增刪改(DDL) 和 對表庫結構的更改(DML) 都會記錄到這個二進制日志文件中去,然后從庫有兩組線程,一組IOthread 線程 一組SQLthread 線程,當配置好用戶權限后,IOthread線程會發送一個請求來連接指定的主庫,對取主庫中的Binlog 日志文件的內容,然后寫到自己的一個Relay log (中繼日志)文件中去,然后另一組線程SQLthread 會去讀取這個中繼日志文件的數據變化,然后去執行寫入到自己的數據庫中去就保證了主從復制 !!!


插曲疑問:為什么不直接讀取到binlog 日志的內容修改直接寫到從庫中去呢?還多一個中繼日志

這里的中繼日志 有點緩沖區的味道,而且有著性能優化作用,寫入中繼日志也是順序,直接庫表容易數據IO

小插曲: 主從復制如何推事件的 :?

MySQL實際機制長連接+文件事件監聽低(無輪詢)毫秒級

????????主從復制依賴于從庫 I/O 線程主動連接主庫并請求 binlog 數據。主庫通過 Binlog Dump 線程響應請求,并在有新數據時立即發送(利用阻塞等待機制實現高效“準推送”),而不是主庫主動推送或持續通知從庫。?

Binlog Dump :?主庫收到從庫的請求后,會為這個特定的從庫連接創建一個專門的?Binlog Dump?線程。每個成功連接的從庫在主庫上都有自己的 Binlog Dump 線程。

  • Binlog Dump 線程讀取主庫上的 binlog 文件。

  • 它檢查從庫請求的 binlog 文件名和位置:

    • 如果請求的位置在當前的 binlog 文件內,則從這個位置開始讀取后續事件。

    • 如果請求的位置在更早的 binlog 文件(主庫可能已經進行了 binlog 輪轉,舊的 binlog 文件可能已被刪除或歸檔),Binlog Dump 線程會嘗試找到最早可用的 binlog 文件開頭,或者報錯(如果文件不可用)。

如圖:

從上圖來看,復制分成三步:

  1. Master主庫在事務提交時,會把數據變更記錄在二進制日志文件Binlog中。

  2. 從庫讀取主庫的二進制日志文件 Binlog,寫入到從庫的中繼日志 Relay Log。

  3. slave重做中繼日志中的事件,將改變反映它自己的數據。

搭建:

這里我就直接使用了虛擬機通過Docker 來創建2個容器來模擬主從庫,其效果也是一致的 !!!

1. 拉取MySQL鏡像

docker pull mysql:8.0

?

2. 創建網絡(這里方便讓容器可以互相通信,后續主庫連接使用)

docker network create mysql-replication-net

3. 啟動主服務器(Master)

docker run -d --name mysql-master \--network mysql-replication-net \-e MYSQL_ROOT_PASSWORD=rootpassword \-p 3306:3306 \-v mysql-master-data:/var/lib/mysql \mysql:8.0 \--server-id=1 \--log-bin=mysql-bin \--binlog-format=ROW \--character-set-server=utf8mb4 \--collation-server=utf8mb4_unicode_ci

參數:

--name mysql-master? ? ?為容器指定名稱?mysql-master,便于后續管理

--network mysql-replication-net?

?--server-id=1 指定集群服務下 的 id 為1 從庫不能重復?

?--read-only=0? ?這里沒有指定,默認就是0表示讀寫 1 表示只讀

--log-bin=mysql-bin 這里顯示啟用二進制日志,指定日志文件的前綴為mysql-bin ,MySQL 8.0 默認就開啟了

--binlog-format=ROW 這里指定二進制日志文件記錄方式為 ROW 模式 (默認也就是ROW)

如圖創建并且啟動一個主庫:

??4. 配置主服務器

????????4.1: 接入主服務器容器:

docker exec -it mysql-master mysql -uroot -prootpassword

? ? ? ? 4.2 : 創建遠程連接賬號,并授予主從復制權限:

CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'replpassword';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

注: 這里我測試環境,同時指定插件為mysql_native_password,避免 MySQL 8.0 默認的?caching_sha2_password?導致的從庫連接問題(無需額外配置 SSL)。

4.3 :查看二進制日志的坐標

SHOW MASTER STATUS;

這里記住二進制日志文件,還有行數,后續便于從庫定位,決定從哪里開始復制!!!?

5. 啟動從服務器(Slave)

docker run -d --name mysql-slave \
--network mysql-replication-net \
-e MYSQL_ROOT_PASSWORD=rootpassword \
-p 3307:3306 \
-v mysql-slave-data:/var/lib/mysql \
mysql:8.0 \
--server-id=2 \
--log-bin=mysql-bin \
--binlog-format=ROW \
--relay-log=mysql-relay-bin \
--log-slave-updates=1 \
--read-only=1 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci

?如圖:

參數:

這里的 --read-only =1 表示當前的庫只是只讀,同時指定--server-id = 2 表示當前的服務id 不要重復即可!

6. 配置從服務器

6.1進入從服務器容器:

docker exec -it mysql-slave mysql -uroot -prootpassword

6.2 執行sql語句 (來連接主庫)

這里的參數要和上面的一致

CHANGE MASTER TO
MASTER_HOST='mysql-master',
MASTER_USER='repl',
MASTER_PASSWORD='replpassword',
MASTER_LOG_FILE='mysql-bin.000006',
MASTER_LOG_POS= 544;

?-- 檢查從服務器狀態

7. 開始測試:?

首先我們從庫主庫開始都只有系統表如下:

我們開始操作主庫:?

創建一個hz_mn庫, 同時在里面創建一個學生表,student 表,然后插入一些數據即可

如下:

CREATE DATABASE IF NOT EXISTS hz_mn;USE hz_mn;CREATE TABLE IF NOT EXISTS student (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(255),age INT
);INSERT INTO student(name, age) VALUES('hz', 19);SELECT * FROM student;

如圖:?

docker exec -it mysql-master mysql -uroot -prootpassword

然后去查看從庫:

docker exec -it mysql-slave mysql -uroot -prootpassword

可以看到 從庫 已經同步成功了,也出現了相應的庫hz_mn 和表 student,查詢student表的情況:

select? * from student;

歐克,沒有問題,我們主從復制也就搭建完成了? !!!?

總結:

????????主從復制是MySQL高可用架構的基礎,理解其原理并掌握搭建方法對于數據庫管理員至關重要。通過合理配置,可以實現讀寫分離、負載均衡、數據備份等多種應用場景。

歐克,我們下次再見

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/911684.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/911684.shtml
英文地址,請注明出處:http://en.pswp.cn/news/911684.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux Shell腳本中basename和dirname的詳細用法教程

在Linux Shell腳本中,basename和 dirname是兩個非常實用的命令,常用于處理文件路徑和名稱。本文將詳細介紹這兩個命令的用法,并提供豐富的示例代碼,以幫助您更好地理解和應用它們。 一、basename命令 1.1 基本用法 basename命令…

3D世界里的“盜夢空間”!在方塊里再造一個世界?高級特效get?

有沒有想過,游戲里的鏡子、傳送門、或者屏幕上播放的實時3D動畫是怎么實現的? 答案就是一項黑科技——渲染目標(Render Targets)。它允許我們不直接渲染到屏幕,而是“偷偷地”渲染到一張幕后的貼圖上,然后…

淺析一種基于深度學習算法的維吾爾文OCR技術的實現原理及其應用場景

維吾爾文OCR技術是一種基于人工智能和深度學習技術的維吾爾文光學字符識別工具,能夠快速、準確地將印刷體或手寫體維吾爾文轉換為可編輯、可搜索的數字化文本。該技術適用于政府、教育、出版、金融等多個行業,助力維吾爾文信息的高效處理與智能化管理。 …

如何使用MQTTX軟件來進行MQTT協議的測試

下載MQTTX軟件 下載地址及說明文檔開始使用 - MQTTX 文檔,比較詳細 為什么使用MQTTX 何時要使用MQTTX軟件呢?用來檢測物聯網模塊上云的數據就很方便,當然云上如果有日志系統的話也是可以用的。 物聯網模塊,以利爾達模塊為例 NT26-KCN系列…

ELK 和 OpenShift 中的 EFK

ELK 和 OpenShift 中的 EFK 確實是同類日志解決方案的不同實現,核心功能相似但組件略有差異。以下是詳細對比和解釋: 1. ELK vs EFK:核心區別 組件ELK 棧EFK 棧(OpenShift 默認)日志收集Logstash(Java 實現…

Python UDP Socket 實時在線刷卡掃碼POS消費機門禁控制服務端示例源碼

本示例使用的設備:https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.1d292c1bk8Qc9r&ftt&id17021194999 一、服務端綁定IP開啟UDP端口接收消費機提交的請求 import sys import os import socket import time import datetimeIpList[] if sys.pl…

對于高考邊界的理解以及未來就業層級的學習與思考

目錄 一、2024年高考全國多少考生,文化課,文科理科,分別總分多少分?清北得多少分能上?二、1342萬人里面,有多少人能上清北,多少能上985,多少能上211,多少能上二本&#x…

JVM調優實戰 Day 4:JVM類加載機制

【JVM調優實戰 Day 4】JVM類加載機制 文章內容 在Java虛擬機(JVM)的運行過程中,類加載機制是整個程序啟動和運行的基礎。它決定了Java類是如何被動態加載到JVM中,并為后續的字節碼執行做好準備。理解JVM類加載機制不僅有助于我們…

R 語言中的判斷語句

R 語言中的判斷語句 在R語言編程中,判斷語句是執行條件邏輯的基礎。它們允許程序根據特定的條件執行不同的代碼塊。本文將深入探討R語言中的幾種常見判斷語句,包括if語句、if-else語句和switch語句,并探討它們的用法和場景。 1. if語句 if…

從設備自動化到智能管控:MES如何賦能牛奶飲料行業高效生產?

萬界星空科技全新推出的:新一代智能化MES系統,深度融合AI大數據技術,實現生產全流程可視化、智能排產、實時質量追溯與設備互聯,助力企業降本增效30%。 現開放免費試用名額,體驗智能化生產管理的高效與便捷&#xff01…

TDengine 技術參數配置大全

1. 背景 TDengine 的 taos.cfg 中配置項及使用 SQL 命令 alter 修改的系統變量之間的關系如何,哪些是持久存儲項,哪些設置是臨時項,這章將詳細說明。 本文是技術參考資料,請收藏。 2.定義 1. 全局配置參數 全局配置參數&#…

無人機神經網絡模塊運行與技術難點

一、神經網絡模塊的運行方式 1. 分層處理架構 感知層 多模態數據融合:通過八元數卷積網絡(OCNN)統一處理LiDAR、攝像頭、IMU等異構傳感器數據,將點云坐標(x/y/z)、圖像RGB與光流信息編碼至8維虛部&#…

前端react框架實現打包時間動態加入配置展示在指定頁面

注意: 當前方法特定為 create-react-app 構建框架,其他的構建流程不同,不能直接照搬 react-scripts 的方式。 ? 目標: 在 React 打包(build)時,自動將當前時間寫入代碼中某個變量或 console…

原子操作(CAS)

原子操作 原子操作原理什么是原子操作?原子性原子變量相關接口內存序 shared_ptr的實現 原子操作原理 什么是原子操作? 原子操作其實就是指在多線程的環境下,確保對共享變量的操作不會被干擾,從而避免了競態條件。 我們都知道&…

馬克思主義基本原理期末復習下

二十、資本的原始積累 所謂資本原始積累,就是以暴力手段使生產者與生產資料分離資本快速集中于少數人手中,資本主義得以快速發展的歷史過程。具體過程其一,用暴力手段奪取農民的土地,如英國圈地運動在國外建立殖民地,…

體育數據api接口,足球api籃球api電競api,比賽賽事數據api

在體育行業,數據驅動一切,從內容分發到競猜預測,從用戶互動到商業變現,背后少不了一個關鍵詞:數據接口(API)。無論是實時比分、比賽事件、歷史統計,還是球員詳情、戰績排名&#xff…

Harmony 狀態監聽 @Monitor和@Computed

Monitor與Computed裝飾器在ArkUI狀態管理中的協同應用 一、裝飾器概述 1. Monitor裝飾器 Monitor是ArkUI狀態管理V2中的核心裝飾器,用于深度監聽狀態變量的修改: 支持監聽嵌套類屬性、多維數組項和對象數組中的指定項變化能夠獲取變化前后的值進行比…

同濟大學多模態感知具身導航全面綜述

作者: I-Tak Ieong, Hao Tang 單位:同濟大學計算機學院,北京大學計算機學院 論文標題: Multimodal Perception for Goal-oriented Navigation: A Survey 論文鏈接:https://arxiv.org/pdf/2504.15643 主要貢獻 基于…

2025年CCF先進音頻技術競賽

由中國計算機學會主辦、CCF語音對話與聽覺專委會承辦、語音之家協辦、華為終端有限公司贊助的CCF先進音頻技術大賽正式啟動。大賽旨在推動國內高等院校及科研院所在音頻技術領域的專業人才培養,支持學生科技創新,選拔優秀人才。 賽事官網:ht…

手撕線程池

線程池的目的: 1.復用線程,減少頻繁創建和銷毀的開銷 創建和銷毀線程是昂貴的系統操作,涉及內核調度、內存分配; 使用線程池預先創建一批線程,在多個任務間循環復用,避免資源浪費,提高性能。 …