目錄
一,理解什么是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讀寫分離
- 主從復制機制
- 主數據庫(Master):負責處理所有寫入操作(如 INSERT、UPDATE、DELETE),并將數據變更通過二進制日志(Binlog)實時同步到從數據庫。
- 從數據庫(Slave):通過復制主庫的 Binlog 來保持數據與主庫一致,專門處理讀取操作(如 SELECT)。
- 同步方式:支持異步復制(主庫無需等待從庫確認)、半同步復制(主庫等待至少一個從庫確認)和全同步復制(所有從庫確認后才提交),需根據業務一致性需求選擇。
- 讀寫路由規則
- 寫操作:定向到主庫執行。
- 讀操作:負載均衡到多個從庫執行,分攤主庫壓力。
- 主要優勢
- 提升系統性能:讀寫操作分離后,主庫專注于寫入,從庫分擔讀壓力,避免單一節點資源競爭,尤其適合讀多寫少的場景。
- 高可用性與容災:當主庫故障時,可通過切換(如自動故障轉移工具 Orchestrator、MHA)將某個從庫提升為主庫,減少服務中斷時間,從庫可作為備份節點或用于數據分析、報表生成等離線任務,不影響主庫性能。
- 減輕主庫壓力避免大量讀操作阻塞寫入操作,提升主庫寫入效率(如高并發場景下的訂單創建、用戶注冊)。
2,mysql讀寫分離的工作原理
1,基于中間代理層實現
MyCAT 是一款開源的分布式關系型數據庫中間件,主要用于解決大規模數據存儲和高效查詢的需求。它支持分布式 SQL 查詢,兼容 MySQL通信協議,能夠通過數據分片提高數據查詢處理能力。MyCAT的前端用戶可以將其視為一個數據庫代理,使用 MySQL 客戶端工具和命令行訪問,而后端則可以通過 MySQL 原生協議與多個 MySQL服務器通信,或者使用 JDBC協議與大多數主流數據庫服務器通信
MyCat 通過SQL 攔截、解析和路由,將寫請求定向到主庫,讀請求負載均衡到從庫,同時結合主從復制監控和故障切換機制,實現了高性能、高可用的讀寫分離架構。其核心價值在于對應用透明,使開發者無需關心數據庫集群細節,專注于業務邏輯。
3,準備工作
需要五臺虛擬機(前提必須做好主從復制)
192.168.10.101 | mysql主服務器 | |
192.168.10.102 | mysql從服務器 | |
192.168.10.103 | mysql從服務器 | |
192.168.10.104 | mycat服務器 | |
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