【MySQL】读写分离&主从复制

本文介绍了在高并发场景下解决读写操作不平衡问题的读写分离策略,并详细阐述了MySQL主从复制的实现过程,包括主从配置、权限设置、从库初始化及测试。通过主从复制,可以将读操作分散到从库,提高系统的整体性能。
摘要由CSDN通过智能技术生成

1. 原理篇

1.1 读写分离问题场景:

高并发场景,读数据操作远高于写数据操作 ——

在这里插入图片描述

为了实现读写分离,我们使用数据库的主从复制:

在这里插入图片描述

1.2 主从复制:

  1. 实现主从复制的流程如下:
    在这里插入图片描述
  2. MySQL 的主从复制实现机制如下:

在这里插入图片描述

(1) master 将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);

(2) slave 将 master 的 binary log events 拷贝到它的中继日志(relay log);

(3) slave重做中继日志中的事件,将改变反映到它自己的数据。

在这里插入图片描述

2. 实战篇

2.1 搭建 MySQL 主从集群

2.1.1 环境说明

准备两个 CentOS7 ,在每个上都安装一下 MySQL 。
安装方法见:CentOS7 安装 MySQL 数据库~~~

安装完一个后,直接再克隆一个 CentOS 7 就 Ok 了,复制虚拟机见 WMWare 克隆CentOS虚拟机~~~

但是这里要注意一件事,使用克隆方式生成的虚拟中的 MySQL 和原 CentOS 中的 MySQL 具有相同的 uuid (MAC 地址),需要给克隆体更换一下 uuid,更换方法如下:

(注: 以下操作在 MySQL 客户端执行)

  1. 生成新的uuid,并记录下来
select uuid();

在这里插入图片描述

  1. 查看配置文件目录

MySQL 的 uuid 是存在 auto.cnf 配置文件中的,我们要找到这个配置文件的位置,执行如下语句:

show variables like 'datadir';

在这里插入图片描述

  1. 将 auto.cnf 中的 uuid 修改为上述第一步记录的 uuid (这步回到 CentOS 下执行,退出 mysql 客户端方式为 ,输入 exit;
vi /var/lib/mysql/auto.cnf

内容修改为:

server-uuid=xxxxxx
  1. 重启 mysql 服务
service mysqld restart
2.1.2 主库配置
  1. 查看数据库状态
systemctl status mysqld
  1. 停服务器
systemctl stop mysqld
  1. 修改配置文件
vi /etc/my.cnf

修改方式:在后面加入

server-id=1
log-bin=mysql-bin #解释:server-id服务的唯一标识(主从之间都必须不同);log-bin启动二进制日志名称为mysql-bin

在这里插入图片描述

  1. 重启 mysql 服务
systemctl start mysqld
  1. 登录 mysql
mysql -uroot -p5201314love
  1. 在主库中新添加一个从库的账号

添加一个名称为repl,账号密码为5201314love,允许登录的从库ip为192.168.244.130的账号(%为任意ip)

mysql> CREATE USER 'repl 此处为用户名称'@'192.168.244.130此处为从服务器的ip地址' IDENTIFIED BY '5201314love 此处为登录密码';

执行完上述语句后,可以通过下列语句查看下授权是否创建成功

 SELECT * FROM mysql.user  where user = 'repl'\G;

在这里插入图片描述

可爱的题外话:如果提示密码太简单不复合策略加在前面加这句

mysql> set global validate_password_policy=0;
  1. 给从库账号添加授权
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.244.130'; # 说明给用户repl一个从库复制的权限在这个ip上
  1. 查看主库的状态
mysql> SHOW MASTER STATUS

在这里插入图片描述

需记录: File是二进制日志文件名,Position 是日志开始的位置。后面设置从库的时候会用到,需要记录下来。

2.1.3 从库配置

  1. 查看数据库状态
systemctl status mysqld
  1. 停服务器
systemctl stop mysqld
  1. 修改配置文件
vi /etc/my.cnf

修改的内容为在后面加入:

server-id=2
  1. 重启
systemctl start mysqld
  1. 登录
mysql -uroot -p5201314love
  1. 使用主库授权的账号
mysql> CHANGE MASTER TO
    -> MASTER_HOST='192.168.244.130',
    -> MASTER_USER='repl',
    -> MASTER_PASSWORD='5201314love',
    -> MASTER_LOG_FILE='mysql-bin.000006',
    -> MASTER_LOG_POS=324;

说明:
1)192.168.244.130:主库主机ip,根据实际情况改写
2)repl:主库授权的账号
3)5201314love:主库授权账号密码
4)mysql-bin.000006:主库日志文件名,上面记录过的
5)324:主库日志文件位置,根据上面主库查询到的主库日志文件位置填写,上面记录过的

  1. 重启
systemctl stop mysqld
systemctl start mysqld

2.1.4 测试配置结果

在主库添加数据库、表、数据,检测从库是不是有同样操作,使用 Navicat 连接测试:

在这里插入图片描述

主从常用主从命令如下:

  1. 查看主库状态
mysql>show master status;
  1. 查看从库状态
mysql>show slave status;

2.1.5 关于从库停机无法同步

问题描述:从库停机修改配置,从起数据库之后,出现无法同步主库内容

解决方案:

1)停止主从

mysql> stop slave;

2)设置

mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; 
mysql> START SLAVE; 

3)重新启动主从,从库断开期间那部分丢失的数据会自动同步过来的

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值