數據庫管理與高可用-MySQL主從復制與讀寫分離

目錄

#1.1MySQL主從復制原理

? 1.1.1MySQL支持的復制類型

? 1.1.2復制的工作過程

#2.1MySQL讀寫分離原理

? 2.1.1常見的MySQL讀寫分離為為兩種

#3.1主從復制+讀寫分離的實驗案例


1.1MySQL主從復制的原理

? ? ? ? MySQL 主從復制是一種常用的數據同步機制,用于將主數據庫(Master)的數據變更同步到一個或多個從數據庫(Slave),實現數據冗余、讀寫分離和高可用性。?

?1.1.1MySQL支持的復制類型

? ? 1.基于語句的復制:在主服務器上執行的SQL語句,在從服務器上執行同樣的語句,MySQL默認采用基于語句的復制,效率比較高。

? ? 2.基于行的復制:把改變的內容復制過去,而不是把命令在從服務器上執行一遍。

? ? 3.混合類型的復制:默認采用基于語句的復制,一旦發現基于語句無法精確復制時,就會采用基于行的復制。

?1.1.2復制的工作過程

? 1. 在每個事務更新數據完成之前,Master 將這些改變記錄進二進制日志。寫入二進制日志完成后,Master 通知存儲引擎提交事務。

? 2.? Slave 將 Master 的 Binary log 復制到其中繼日志(Relay log)。首先,Slave 開始一個工作線程 ——I/O 線程,I/O 線程在 Master 上打開一個普通的連接,然后開始 Binlog dump process。Binlog dump process 從 Master 的二進制日志中讀取事件,如果已經跟上 Master,它會睡眠并等待 Master 產生新的事件。I/O 線程將這些事件寫入中繼日志。

? ? 3. SQL slave thread(SQL 從線程)處理該過程的最后一步。SQL 線程從中繼日志讀取事件,并重放其中的事件而更新 Slave 數據,使其與 Master 中的數據保持一致。只要該線程與 I/O 線程保持一致,中繼日志通常會位于 OS 的緩存中,所以中繼日志的開銷很小。復制過程有一個很重要的限制,即復制在 Slave 上是串行化的,也就是說 Master 上的并行更新操作不能在 Slave 上并行操作。

2.1MySQL讀寫分離原理

??MySQL 讀寫分離是優化數據庫負載、提升系統性能與可用性的常用方案,核心圍繞?“分離讀寫壓力,利用主從復制保障數據一致”。

?2.1.1常見的MySQL讀寫分離分為兩種??

? ?(1)基于程序代碼內部實現
? ? ?在代碼中根據 select、insert 進行路由分類,這類方法也是目前生產環境應用最廣泛的。優點是性能較好,因為在程序代碼中實現,不需要增加額外的設備作為硬件開支;缺點是需要開發人員來實現,運維人員無從下手。

? ?(2)基于中間代理層實現
? ? ? 代理一般位于客戶端和服務器之間,代理服務器接到客戶端請求后通過判斷后轉發到后端數據庫,有兩個代表性程序。

3.1主從復制+讀寫分離的實驗案例

配置Master主服務器

1.vim /etc/my.cnf

log-bin=/usr/local/mysql/data/mysql-bin

binlog_format = MIXED

server-id=1

2.重啟MySQL服務

3.登錄MySQL程序,給從服務器授權

?配置Slave從服務器

? 1.slave1,slave2上的server-id不能一致,slave1為server-id=2,而slave2為server-id=3,在vim /etc/my.cnf中配置。

? 2.重啟mysqld服務

? 3.登錄mysqld,配置同步

? 4.驗證主從復制效果

?搭建MySQL讀寫分離

? 安裝Mycat2

? ?安裝并配置mycat軟件

? ?創建Mycat2工作所必須得賬號

? ?啟動Mycat2

? ?第一步:Mycat增加數據源

?查看數據源信息

? ?第二步:創建Mycat集群

? ?查看并修改集群配置

? ?修改負載均衡的默認策略為輪詢

? ?修改配置后需要重啟mycat?

? ?登錄mycat集群,創建測試庫和測試表

? 停止slave1和slave2的主從同步

? ??slave1:

[root@localhost ~]# mysql -uroot -p
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)

? ?slave2:

[root@localhost ~]# mysql -uroot -p
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)

? 在master和slave1,slave2創建測試數據

? ? ??Master 上操作:

mysql> use test;
Database changed
mysql> insert into test.zang values ('1','zhang','this_is_master');
Query OK, 1 row affected (0.01 sec)

? ? ?slave1上操作:

mysql> use test;
Database changed
mysql> insert into test.zang values ('2','zhang','this_is_slave1');
Query OK, 1 row affected (0.01 sec)

? ? ?slave2上操作:

mysql> use test;
Database changed
mysql> insert into test.zang values ('3','zhang','this_is_slave2');
Query OK, 1 row affected (0.01 sec)

? ?登錄mycat集群,查詢tets.zang的數據

[root@localhost ~]# mysql -uroot -p123456 -P8066 -h192.168.10.101
mysql> select * from test.zang; 
+----+-------+----------------+
| id | name  | address        |
+----+-------+----------------+
|  2 | zhang | this_is_slave1 |
+----+-------+----------------+
1 row in set (0.01 sec)mysql> select * from test.zang; #第二次查詢
+----+-------+----------------+
| id | name  | address        |
+----+-------+----------------+
|  3 | zhang | this_is_slave2 |
+----+-------+----------------+
1 row in set (0.01 sec)
mysql> select * from test.zang;  
+----+-------+----------------+
| id | name  | address        |
+----+-------+----------------+
|  2 | zhang | this_is_slave1 |
+----+-------+----------------+
1 row in set (0.01 sec)[root@localhost ~]# mysql -uroot -p123456 -P8066 -h192.168.10.101
MySQL [(none)]>insert into zang values('4','zhang','write_test');
Query OK, 1 row affected (0.08 sec)

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

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

相關文章

Python60日基礎學習打卡Day45

之前的神經網絡訓練中,為了幫助理解借用了很多的組件,比如訓練進度條、可視化的loss下降曲線、權重分布圖,運行結束后還可以查看單張圖的推理效果。 如果現在有一個交互工具可以很簡單的通過按鈕完成這些輔助功能那就好了,他就是…

React項目的狀態管理:Redux Toolkit

目錄 1、搭建環境 2、Redux Toolkit 包含了什么 3、使用示例 (1)創建user切片 (2)合并切片得到store (3)配置store和使用store 使用js來編寫代碼,方便理解一些 1、搭建環境 首先&#xf…

父組件prop傳向子組件的值,被子組件直接v-model綁定 功能不生效

隱式修改組件屬性會導致功能異常 實際操作中發現,即便是父組件把簡單數據通過prop傳給了子組件,子組件再使用v-model綁定,也不行,響應式還是對異常 原vue2業務中存在組件定義某個類型為Object的屬性,然后將該屬性對象…

c#bitconverter操作,不同變量類型轉byte數組

緣起:串口數據傳輸的基礎是byte數組,write(buff,0,num)或者writeline(string),如果是字符串傳輸就是string變量就可以了,但是在modbus這類hex傳遞時,就要遇到轉換了,拼湊byte數組時需要各種變量的值傳遞,解…

【Redis】set 類型

set 一. set 類型介紹二. set 命令sadd、smembers、sismemberscard、spop、srandmembersmove、srem集合間操作交集:sinter、sinterstore并集:sunion、sunionstore差集:sdiff、sdiffstore 三. set 命令小結四. set 內部編碼方式五. set 使用場…

02-Redis常見命令

02-Redis常見命令 Redis數據結構介紹 Redis是一個key-value的數據庫,key一般是String類型,不過value的類型多種多樣: 貼心小建議:命令不要死記,學會查詢就好啦 Redis為了方便學習,將操作不同數據類型的命…

Rk3568驅動開發_GPIO點亮LED_12

需求: 用配置寄存器方式控制點燈非常原始,現在采用更方便的Linux提供的pctrl和gpio子系統編寫字符驅動 1.設備樹配置: 現將開發板中呼吸燈關閉掉防止占用到我需要使用的引腳 /* Narnat 2025-5-29 RK3568 GPIO 無需設置pinctrl*/gpioled{co…

阿里云ACP云計算備考筆記 (3)——云存儲RDS

目錄 第一章 云存儲概覽 1、云存儲通用知識 ① 發展歷史 ② 云存儲的優勢 2、云存儲分類 3、文件存儲業務場景 第二章 塊存儲 1、塊存儲分類 2、云盤的優勢 3、創建云盤 4、管理數據盤 ① 格式化數據盤 ② 掛載數據盤 ③ 通過 API 掛載云盤 5、管理系統盤 ① 更…

亞矩陣云手機實測體驗:穩定流暢背后的技術邏輯?

最近在測試一款云手機服務時,發現亞矩陣的表現出乎意料地穩定。作為一個經常需要多設備協作的開發者,我對云手機的性能、延遲和穩定性要求比較高。經過一段時間的體驗,分享一下真實感受,避免大家踩坑。 ??1. 云手機能解決什么問…

STM32H562----------ADC外設詳解

1、ADC 簡介 STM32H5xx 系列有 2 個 ADC,都可以獨立工作,其中 ADC1 和 ADC2 還可以組成雙模式(提高采樣率)。每個 ADC 最多可以有 20 個復用通道。這些 ADC 外設與 AHB 總線相連。 STM32H5xx 的 ADC 模塊主要有如下幾個特性: 1、可配置 12 位、10 位、8 位、6 位分辨率,…

【Android】雙指旋轉手勢

一,概述 本文參考android.view.ScaleGestureDetector,對雙指旋轉手勢做了一層封裝,采用了向量計算法簡單實現,筆者在此分享下。 二,實例 如下,使用RotateGestureDetector即可委托,實現旋轉手…

B站的視頻怎么下載下來——Best Video下載器

B站(嗶哩嗶哩)作為國內最受歡迎的視頻平臺之一,聚集了無數優質內容:動漫番劇、游戲實況、學習課程、紀錄片、Vlog、鬼畜剪輯……總有那么些視頻讓人想反復觀看、離線觀看,甚至剪輯創作。 但你是否遇到過這樣的煩惱&am…

基于SFC的windows系統損壞修復程序

前言 在平時使用Windows操作系統時會遇到很多因為系統文件損壞而出現的錯誤 例如:系統應用無法打開 系統窗口(例如開始菜單)無法使用 電腦藍屏或者卡死 是如果想要修復很多人只能想到重裝系統。但其實Windows有一個內置的系統文件檢查器可以修復此類錯誤。 原理 SFC命令…

智紳科技 —— 智慧養老 + 數字健康,構筑銀發時代安全防護網

在老齡化率突破 21.3% 的當下,智紳科技以 "科技適老" 為核心理念,構建 "監測 - 預警 - 干預 - 照護" 的智慧養老閉環。 其自主研發的七彩喜智慧康養平臺,通過物聯網、AI 和邊緣計算技術,實現對老年人健康與安…

用函數實現模塊化程序設計(適合考研、專升本)

函數 定義:本質上是一段可以被連續調用、功能相對獨立的程序段 c語言是通過“函數”實現模塊化的。根據分類標準不同函數分為以下幾類。 用戶角度:庫函數、自定義函數 函數形式:有參函數、無參函數 作用域:外部函數、內部函數 …

OpenCV 滑動條調整圖像亮度

一、知識點 1、int createTrackbar(const String & trackbarname, const String & winname, int * value, int count, TrackbarCallback onChange 0, void * userdata 0); (1)、創建一個滑動條并將其附在指定窗口上。 (2)、參數說明: trackbarname: 創建的…

vcs仿真產生fsdb波形的兩種方式

目錄 方法一: 使用verilog自帶的系統函數 方法二: 使用UCLI command 2.1 需要了解什么是vcs的ucli,怎么使用ucli? 2.2 使用ucli dump波形的方法 使用vcs仿真產生fsdb波形有兩種方式,本文參考《vcs user guide 20…

【前端】每日一道面試題6:解釋Promise.any和Promise.allSettled的使用場景及區別。

Promise.any() 和 Promise.allSettled() 是 JavaScript 中用于處理異步操作的兩種不同策略的 Promise 組合器,它們的核心區別在于邏輯目標與結果處理方式: 1. Promise.any() 使用場景: 需要獲取 首個成功結果(類似競速成功優先&…

數據鏈路層__

文章目錄 數據鏈路層基本概念(1)鏈路管理:面向連接的服務(2)幀同步:成幀1、字符計數法2、字符填充法(帶填充的首尾界符法)3、帶填充的首位標志法4、物理層編碼違例法 (3&…

coze智能體后端接入問題:

是否一定要按照coze官方API文檔格式調用? 不一定:以下面代碼為例(給了注釋) app.route(/compare_models, methods[POST]) def compare_models():print("收到 compare_models 請求!") #begin-這一部分代碼作用:從前端接…