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
相关推荐
一只叫煤球的猫2 小时前
MySQL 8.0 SQL优化黑科技,面试官都不一定知道!
后端·sql·mysql
寒山李白2 小时前
MySQL安装与配置详细讲解
数据库·mysql·配置安装
文牧之2 小时前
PostgreSQL 的扩展pg_freespacemap
运维·数据库·postgresql
deriva3 小时前
某水表量每15分钟一报,然后某天示数清0了,重新报示值了 ,如何写sql 计算每日水量
数据库·sql
Leo.yuan4 小时前
数据库同步是什么意思?数据库架构有哪些?
大数据·数据库·oracle·数据分析·数据库架构
zhangzhangkeji4 小时前
(33)课54--??:3 张表的 join-on 连接举例,多表查询总结。
mysql
Kookoos4 小时前
ABP VNext 与 Neo4j:构建基于图数据库的高效关系查询
数据库·c#·.net·neo4j·abp vnext
云之兕4 小时前
MyBatis 的动态 SQL
数据库·sql·mybatis
gaoliheng0064 小时前
Redis看门狗机制
java·数据库·redis