Linux——mysql主從復制與讀寫分離

目錄

一,理解什么是mysql主從復制

1,mysql支持的復制類型

2,mysql主從復制的工作流程

二,配置mysql主從復制

三,配置mysql主主復制

四,mysql讀寫分離

1,了解什么是mysql讀寫分離

2,mysql讀寫分離的工作原理

3,準備工作

?4,配置mysql讀寫分離

一,理解什么是mysql主從復制

1,mysql支持的復制類型

  • 基于語句的復制:

在主服務器上執行的sql語句,在從服務器上執行同樣的語句,mysql默認采用基于語句的復制,效率比較高。

  • 基于行的復制:

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

  • 基于二進制文件的復制:

完全基于語句復制,binlog日志文件中記錄原始 SQL 語句(默認模式)。

2,mysql主從復制的工作流程

  • 在每個事務更新數據完成之前,Master 將這些改變記錄進二進制日志。寫入二進制日志完成后,Master 通知存儲引擎提交事務。
  • Slave 將 Master 的 Binary log 復制到其中繼日志(Relay log)。首先,Slave 開始一個工作線程--I/0 線程,I/0 線程在 Master 上打開一個普通的連接,然后開始 Binlog dump process。Binlog dump process 從 Master 的二進制日志中讀取事件,如果已經跟上 Master,它會睡眠并等待 Master 產生新的事件。I/0 線程將這些事件寫入中繼日志。
  • SQL slave thread(SQl 從線程)處理該過程的最后一步。SQL 線程從中繼日志讀取事件,并重放其中的事件而更新 Slave數據,使其與 Master 中的數據保持一致。只要該線程與 I/0 線程保持一致,中繼日志通常會位于0S的緩存中,所以中繼日志的開銷很小。復制過程有一個很重要的限制,即復制在S1ave 上是串行化的,也就是說 Master 上的并行更新操作不能在 Slave 上并行操作。

二,配置mysql主從復制

1,準備工作

dnf -y install ntpdate          ##安裝時間同步軟件包
date                            ##查看時間是否同步systemctl stop firewalld        ##關閉防火墻
setenforce 0                    ##關閉linux內核##修改mysql配置文件,添加以下內容(mysqld模塊中添加)
[root@localhost local]# vim /etc/my.cnf
log-bin=/usr/local/mysql/mysql-bin            ##指定二進制文件位置
server-id=1                                   ##設置mysql服務id
binlog-format=MIXED                           ##用于控制二進制日志的記錄格式為混合模式systemclt restart mysqld     ##重啟mysql數據庫

2,登陸mysql進行操作

create user 'myslave'@'%' identified by 'pwd123';	##創建用戶grant replication slave on *.* to 'myslave'@'%';	##給復制權限
alter user 'myslave'@'%' identified with mysql_native_password by 'pwd123';   ##為myslave設置密碼為pwd123.flush privileges;       ##更新用戶信息mysql> show master status;            ##查看主服務區狀態信息,等會要用
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      342 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

3,在從設備進行操作

[root@localhost local]# vim /etc/my.cnf
server-id=2                ##在從服務器添加id(不能與主服務器重復)
systemclt restart mysqld     ##重啟mysql數據庫##在從服務器進行操作
change master to master_host='192.168.10.101',master_user='myslave',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=1438;start slave;              ##啟動slave
show slave status\G       ##查看主從狀態Slave_IO_Running: Yes                  ##找到此部分為兩個yes就成功了Slave_SQL_Running: Yes

4,驗證?

##在主服務器創建名為auth的數據庫
mysql> create database auth;##查看從服務器是否同步成功
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| auth               |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

三,配置mysql主主復制

1,配置從服務器

##在從服務器添加
[root@bogon ~]# vim /etc/my.cnf
log-bin=/usr/local/mysql/mysql-bin
binlog-format=MIXEDsystemclt restart mysqld     ##重啟mysql數據庫create user 'myslave'@'%' identified by 'pwd123'; ##創建用戶
grant replication slave on *.* to 'myslave'@'%';  ##修改權限
alter user 'myslave'@'%' identified with mysql_native_password by 'pwd123';  ##該密碼
flush privileges;    ##刷新show master status;	      ##查看狀態信息
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |     1149 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)stop slave;	                ##一定要關閉slave

2,配置雙主連接

##在101操作
change master to master_host='192.168.10.102',master_user='myslave',master_ppassword='pwd123',master_log_file='mysql-bin.000001',master_log_pos=1149;	##查看102的狀態
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |     1149 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)##在102操作
change master to master_host='192.168.10.101',master_user='myslave',master_password='pwd123',master_log_file='mysql-bin.000001',master_log_pos=342;	##查看101的狀態
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      342 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

四,mysql讀寫分離

1,了解什么是mysql讀寫分離

  1. 主從復制機制
  • 主數據庫(Master):負責處理所有寫入操作(如 INSERT、UPDATE、DELETE),并將數據變更通過二進制日志(Binlog)實時同步到從數據庫。
  • 從數據庫(Slave):通過復制主庫的 Binlog 來保持數據與主庫一致,專門處理讀取操作(如 SELECT)。
  • 同步方式:支持異步復制(主庫無需等待從庫確認)、半同步復制(主庫等待至少一個從庫確認)和全同步復制(所有從庫確認后才提交),需根據業務一致性需求選擇。
  1. 讀寫路由規則
  • 寫操作:定向到主庫執行。
  • 讀操作:負載均衡到多個從庫執行,分攤主庫壓力。
  1. 主要優勢
  • 提升系統性能:讀寫操作分離后,主庫專注于寫入,從庫分擔讀壓力,避免單一節點資源競爭,尤其適合讀多寫少的場景。
  • 高可用性與容災:當主庫故障時,可通過切換(如自動故障轉移工具 Orchestrator、MHA)將某個從庫提升為主庫,減少服務中斷時間,從庫可作為備份節點或用于數據分析、報表生成等離線任務,不影響主庫性能。
  • 減輕主庫壓力避免大量讀操作阻塞寫入操作,提升主庫寫入效率(如高并發場景下的訂單創建、用戶注冊)。

2,mysql讀寫分離的工作原理

1,基于中間代理層實現

MyCAT 是一款開源的分布式關系型數據庫中間件,主要用于解決大規模數據存儲和高效查詢的需求。它支持分布式 SQL 查詢,兼容 MySQL通信協議,能夠通過數據分片提高數據查詢處理能力。MyCAT的前端用戶可以將其視為一個數據庫代理,使用 MySQL 客戶端工具和命令行訪問,而后端則可以通過 MySQL 原生協議與多個 MySQL服務器通信,或者使用 JDBC協議與大多數主流數據庫服務器通信

MyCat 通過SQL 攔截、解析和路由,將寫請求定向到主庫,讀請求負載均衡到從庫,同時結合主從復制監控和故障切換機制,實現了高性能、高可用的讀寫分離架構。其核心價值在于對應用透明,使開發者無需關心數據庫集群細節,專注于業務邏輯。

3,準備工作

需要五臺虛擬機(前提必須做好主從復制)

192.168.10.101mysql主服務器
192.168.10.102mysql從服務器
192.168.10.103mysql從服務器
192.168.10.104mycat服務器
192.168.10.105客戶端

?4,配置mysql讀寫分離

  • ?在mycat服務進行操作
##準備好mycat的四個安裝組件
[root@daili src]# ls
debug                    mycat2-1.21-release-jar-with-dependencies.jar
jdk-8u171-linux-x64.rpm  mycat2-install-template-1.20.zip
kernels                  mysql-connector-java-8.0.18.jar
[root@daili src]# rpm -ivh jdk-8u171-linux-x64.rpm ##在mycat服務器進行操作
rpm -ivh jdk-8u171-linux-x64.rpm ##使用rpm安裝jdkunzip mycat2-install-template-1.20.zip -d /usr/local/  ##解壓mycat的安裝包,解壓到/usr/local
中ln -s /usr/local/mycat/bin/* /usr/local/bin          ##別忘了制作軟鏈接cd /usr/local/mycat/bin
[root@daili bin]# chmod +x *                  ##最后授予可執行的權限[root@daili bin]# mycat -h       ##使用此命令測試mycat是否安裝成功
Usage: /usr/local/bin/mycat { console | start | stop | restart | status | dump }
  • 在主從服務器進行操作
##在主服務器進行操作(不需要在從服務器進行操縱,因為已經做過主從復制,從服務器已經復制過)
create user 'mycat'@'%' identified by 'pwd123';       ##創建mycat用戶用于連接grant all on *.* to 'mycat'@'%';                      ##對mycat用戶進行授權alter user 'mycat'@'%' identified with mysql_native_password by 'pwd123';   ##對mycat用戶賬號進行配置變更明確指定該用戶的密碼為加密方式。flush privileges;         ##刷新權限##在從服務器查看mycat用戶
select * from mysql.user\G            Host: %User: mycatSelect_priv: YInsert_priv: YUpdate_priv: Y
......./省略部分內容
  • 在mycat服務器進行操作
vim mycat/conf/datasources/prototypeDs.datasource.json "password":"pwd123",                       ##密碼改為pwd123"url":"jdbc:mysql://192.168.10.101:3306/mysql?      ##ip改為主服務192.168.10.101 useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8","user":"mycat",          ##賬戶修改為mycat[root@daili local]# cat /usr/local/mycat/conf/users/root.user.json  ##查看登陸mycat用到的賬號和密碼
{"dialect":"mysql","ip":null,"password":"123456","transactionType":"xa","username":"root"
}[root@daili conf]# pwd
/usr/local/mycat/conf[root@daili conf]# vim server.json"defaultLoadBalance":"BalanceRoudRobin",            ##改為輪詢算法(3行)mycat restart   ##重啟mycat
  • 在105客戶端進行登陸
[root@localhost ~]# dnf -y install mysql    ##使用dnf方法安裝mysql[root@localhost ~]# mysql -uroot -p123456 -P8066 -h192.168.10.104        ##進行登陸-P一定要為大寫
mysql>
  • 改進讀寫分離
##增加主庫master:     "name":"master"  ##name后面名字用戶自定義
mysql>/*+ mycat:createDataSource{ "name":"master","url":"jdbc:mysql://192.168.10.101:3306/?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true","instanceType":"WRITE","user":"mycat","password":"pwd123"} */;##增加從庫slave1和slave2:               ##name后面名字用戶自定義
mysql>/*+ mycat:createDataSource{ "name":"slave1","url":"jdbc:mysql://192.168.10.102:3306/?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true","instanceType":"READ","user":"mycat","password":"pwd123"} */;##name后面名字用戶自定義
mysql>/*+ mycat:createDataSource{ "name":"slave2","url":"jdbc:mysql://192.168.10.103:3306/?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true","instanceType":"READ","user":"mycat","password":"pwd123"} */;##創建Mycat集群
mysql>/*! mycat:createCluster{"name":"cls01","masters":["master"],"replicas":["slave1","slave2"]} */;"masters":["master"]    ##名字是在增加主庫進行創建的
"replicas":["slave1","slave2"]} */;    ##增加從庫進行創建的
  • 進行驗證?
##在105客戶端進行查看
mysql> create database a123;
Query OK, 0 rows affected (0.04 sec)mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| a123 ##在主從服務器分別查看
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| a123  ##在主服務器進行創建數據庫
mysql> create database aaa456;
Query OK, 1 row affected (0.01 sec)##在105客戶端登陸查看
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| aaa456

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

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

相關文章

MongoDB數據庫深度解析:架構、特性與應用場景

在現代應用程序開發中,數據存儲技術的選擇至關重要。在眾多的數據庫管理系統中,MongoDB以其靈活性和強大的功能迅速崛起,成為NoSQL數據庫中的佼佼者。本文將深入解析MongoDB的架構、核心特性、性能優化及其在實際應用中的最佳實踐&#xff0c…

3D曲面上的TSP問題(一):曲面上點集距離求解

3D曲面上&#xff0c;兩點的距離求解不能采用歐式距離&#xff0c;而需要計算測地線距離。 代碼使用CGAL 5.6.2 OpenCV 4.11.0 版本實現 #include "cgal_utils.h" #include <CGAL/AABB_tree.h> #include <CGAL/AABB_traits.h> #include <CGAL/AABB_…

【歌曲結構】2:小節與歌曲結構信息整合

歌曲小節與結構信息整合 我將為您整合小節信息與歌曲結構,創建一個更加詳細的JSON數據結構。 處理方法 將小節時間與歌曲結構段落進行匹配為每個小節添加所屬段落信息為小節添加格式化的時間戳為小節添加對應時間范圍內的歌詞{"song_title": "財神廟前許三億…

C語言:深入理解指針(3)

目錄 一、數組名的理解 二、用指針訪問數組 三、一維數組傳參的本質 四、冒泡排序 五、二級指針 六、指針數組 七、指針數組模擬二維數組 八、結語 一、數組名的理解 數組名其實就是首元素的地址 int arr[3] {1,2,3}; printf("arr :%p\n" ,arr); printf(…

Spring MVC 接口的訪問方法如何設置

RequestMapping 是 Spring 框架中用于映射 HTTP 請求到控制器方法的注解。它支持以下 HTTP 方法訪問類型&#xff0c;通過 method 屬性指定&#xff1a; GET&#xff1a;用于獲取資源POST&#xff1a;用于提交數據PUT&#xff1a;用于更新資源DELETE&#xff1a;用于刪除資源PA…

linux libdbus使用案例

以下是一個基于 Linux libdbus 的詳細指南,包含服務端和客戶端的完整代碼示例,涵蓋 方法調用、信號發送 和 異步消息處理。libdbus 是 D-Bus 的底層 C 庫,直接操作 D-Bus 協議,適合需要精細控制的場景。 1. libdbus 的核心機制 連接管理:通過 dbus_bus_get 連接系統總線或…

Day118 | 靈神 | 二叉樹 | 刪點成林

Day118 | 靈神 | 二叉樹 | 刪點成林 1110.刪點成林 1110. 刪點成林 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 最直接的思路就是看當前結點的值是不是在要刪除的列表中&#xff0c;在的話刪除當前結點并把左右孩子加入res中 很可惜這樣是錯的&#xff0c;…

趣味編程:鐘表

目錄 1. 效果展示 2. 源碼展示 3. 邏輯概述 3.1 表針繪制函數&#xff08;DrawHand&#xff09; 3.2 表盤繪制函數 3.3 主程序邏輯 4. 小結 概述&#xff1a;本篇博客主要介紹簡易鐘表的繪制。 1. 效果展示 該鐘表會隨著系統的時間變化而變化&#xff0c;動態的效…

ansible進階02

管理主機清單變量 使用變量的原則 變量創建的位置 角色的defaults或vars目錄主機清單playbook或主機清單所在位置的子目錄group_vars和host_varsplay或角色或任務 無論在哪創建變量&#xff0c;都應該遵守一些規則&#xff1a; 保持簡潔不要重復造輪子。不要反復在多個位置…

C40-指針

一 指針的引入 什么是指針:指針是一個變量&#xff0c;其值是另一個變量的內存地址 簡單的使用地址輸出一個變量: 代碼示例 #include <stdio.h> int main() {int a10;printf("a的地址是:%p\n",&a);printf("a%d\n",*(&a)); //*號是取值運算符…

Nginx 返回 504 狀態碼表示 網關超時(Gateway Timeout)原因排查

Nginx 返回 504 狀態碼表示 網關超時&#xff08;Gateway Timeout&#xff09;&#xff0c;這意味著 Nginx 作為反向代理服務器&#xff0c;在等待上游服務器&#xff08;如后端應用服務器、數據庫服務器等&#xff09;響應時&#xff0c;超過了預設的時間限制&#xff0c;最終…

DeepSeek推理優化技巧:提升速度與降低成本

文章目錄 DeepSeek推理優化技巧&#xff1a;提升速度與降低成本引言一、模型優化&#xff1a;減少模型參數與計算量1. 模型剪枝&#xff08;Pruning&#xff09;2. 模型量化&#xff08;Quantization&#xff09;3. 知識蒸餾&#xff08;Knowledge Distillation&#xff09; 二…

深度解析 Sora:從技術原理到多場景實戰的 AI 視頻生成指南【附學習資料包下載】

一、技術架構與核心能力解析 1.1 時空建模體系的創新突破 Sora 在視頻生成領域的核心優勢源于其獨特的時空建模架構。區別于傳統將視頻拆解為單幀處理的模式,Sora 采用時空 Patch 嵌入技術,將連續視頻序列分割為 32x32 像素的時空塊(每個塊包含相鄰 3 幀畫面),通過線性投…

【實戰篇】數字化打印——打印部署管理接口開發

前言 前面的章節已經介紹了打印管理模塊的主要界面設計&#xff0c;本篇介紹用myBuilder開發界面接口&#xff0c;實現最終的功能。 1. 配置打印應用菜單 首先配置掛載好模塊菜單 讓菜單點擊能訪問到對應的頁面 2. 打印部署管理數據表詳細設計 以下是打印部署管理的數據表字…

Window下Jmeter多機壓測方法

1.概述 Jmeter多機壓測的原理&#xff0c;是通過單個jmeter客戶端&#xff0c;控制多個遠程的jmeter服務器&#xff0c;使他們同步的對服務器進行壓力測試。 以此方式收集測試數據的好處在于&#xff1a; 保存測試采樣數據到本地機器通過單臺機器管理多個jmeter執行引擎測試…

ResourceBundle多語言國際化

在 Java 中&#xff0c;ResourceBundle 是一個用于國際化&#xff08;i18n&#xff09;和本地化&#xff08;l10n&#xff09;的一種機制&#xff0c;它使得程序能夠根據不同的區域設置&#xff08;如語言、國家等&#xff09;加載不同的資源文件。ResourceBundle 主要用于從外…

精益數據分析(62/126):從客戶訪談評分到市場規模估算——移情階段的實戰進階

精益數據分析&#xff08;62/126&#xff09;&#xff1a;從客戶訪談評分到市場規模估算——移情階段的實戰進階 在創業的移情階段&#xff0c;科學評估用戶需求與市場潛力是決定產品方向的關鍵。今天&#xff0c;我們結合Cloud9 IDE的實戰經驗與《精益數據分析》的方法論&…

第四天——貪心算法——種花

1. 題目 有一個花壇&#xff0c;其中0 表示該位置是空的&#xff0c;可以種花。1 表示該位置已經有花&#xff0c;不能種花。 規則&#xff1a;新種的花不能種在相鄰的位置&#xff08;即如果某個位置已經種了花&#xff0c;它的左右兩個相鄰位置不能再種花&#xff09;。給定…

【重磅】配電網智能軟開關和儲能聯合規劃

目錄 1 主要內容 目標函數 數據說明 節點系統圖 2 部分代碼 3 程序結果 4 下載鏈接 1 主要內容 該程序復現《具有源荷不平衡特性的配電網智能軟開關和儲能聯合規劃》部分模型&#xff0c;未考慮聚類分析和分布魯棒部分&#xff0c;就智能軟開關和儲能聯合規劃部分進行了…

QMK固件OLED顯示屏配置教程:從零開始實現個性化鍵盤顯示(實操部分)

QMK固件OLED顯示屏配置教程:從零開始實現個性化鍵盤顯示 ?? 前言: 作為一名鍵盤愛好者,近期研究了QMK固件的OLED顯示屏配置,發現網上的教程要么太過復雜,要么過于簡單無法實際操作。因此決定寫下這篇教程,從零基礎出發,帶大家一步步實現鍵盤OLED屏幕的配置與個性化顯示…