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,准备工作

cs 复制代码
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进行操作

cs 复制代码
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,在从设备进行操作

cs 复制代码
[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,验证

cs 复制代码
##在主服务器创建名为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,配置从服务器

cs 复制代码
##在从服务器添加
[root@bogon ~]# vim /etc/my.cnf
log-bin=/usr/local/mysql/mysql-bin
binlog-format=MIXED


systemclt 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,配置双主连接

cs 复制代码
##在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.101 | mysql主服务器 | |
| 192.168.10.102 | mysql从服务器 | |
| 192.168.10.103 | mysql从服务器 | |
| 192.168.10.104 | mycat服务器 | |
| 192.168.10.105 | 客户端 | |

4,配置mysql读写分离

  • 在mycat服务进行操作
cs 复制代码
##准备好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安装jdk
 
unzip 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 }
  • 在主从服务器进行操作
cs 复制代码
##在主服务器进行操作(不需要在从服务器进行操纵,因为已经做过主从复制,从服务器已经复制过)
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: mycat
             Select_priv: Y
             Insert_priv: Y
             Update_priv: Y
......./省略部分内容
  • 在mycat服务器进行操作
cs 复制代码
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客户端进行登陆
cs 复制代码
[root@localhost ~]# dnf -y install mysql    ##使用dnf方法安装mysql

[root@localhost ~]# mysql -uroot -p123456 -P8066 -h192.168.10.104        ##进行登陆-P一定要为大写
mysql>
  • 改进读写分离
cs 复制代码
##增加主库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"]} */;    ##增加从库进行创建的
  • 进行验证
cs 复制代码
##在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
相关推荐
学地理的小胖砸20 分钟前
【Python 操作 MySQL 数据库】
数据库·python·mysql
dddaidai1231 小时前
Redis解析
数据库·redis·缓存
数据库幼崽1 小时前
MySQL 8.0 OCP 1Z0-908 121-130题
数据库·mysql·ocp
Amctwd1 小时前
【SQL】如何在 SQL 中统计结构化字符串的特征频率
数据库·sql
betazhou2 小时前
基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL
linux·数据库·mysql·oracle·ogg
lyrhhhhhhhh2 小时前
Spring 框架 JDBC 模板技术详解
java·数据库·spring
喝醉的小喵3 小时前
【mysql】并发 Insert 的死锁问题 第二弹
数据库·后端·mysql·死锁
初次见面我叫泰隆4 小时前
MySQL——1、数据库基础
数据库·adb
Chasing__Dreams4 小时前
Redis--基础知识点--26--过期删除策略 与 淘汰策略
数据库·redis·缓存