【MySQL】读写分离主从复制
创始人
2024-04-14 15:32:06
0

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)重新启动主从,从库断开期间那部分丢失的数据会自动同步过来的

相关内容

热门资讯

【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
ASM贪吃蛇游戏-解决错误的问... 要解决ASM贪吃蛇游戏中的错误问题,你可以按照以下步骤进行:首先,确定错误的具体表现和问题所在。在贪...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...