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

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...