目录
一,理解什么是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