MySQL主从复制与读写分离

一、主从复制

[1.1 MySQL的复制类型](#1.1 MySQL的复制类型)

[1.2 MySQL主从复制的工作过程](#1.2 MySQL主从复制的工作过程)

[1.3 主从复制延迟](#1.3 主从复制延迟)

[1.3.1 延迟优化](#1.3.1 延迟优化)

[1.4 MySQL 主从复制的搭建与配置](#1.4 MySQL 主从复制的搭建与配置)

[1.4.1 主服务器设置](#1.4.1 主服务器设置)

[1.4.2 从服务器设置](#1.4.2 从服务器设置)

​编辑

[1.4.3 主服务器的mysql配置](#1.4.3 主服务器的mysql配置)

[1.4.4 从服务器的mysql配置](#1.4.4 从服务器的mysql配置)

[1.4.5 验证主从复制效果](#1.4.5 验证主从复制效果)

二、读写分离

[2.1 读写分离原理](#2.1 读写分离原理)

[2.2 读写分离方案](#2.2 读写分离方案)

[2.3 MySQL 读写分离的搭建与配置](#2.3 MySQL 读写分离的搭建与配置)

三、小结


一、主从复制

(1)进行复制的原因是保证数据的完整性。

(2)主从复制是slave角色(从)复制master角色(主)的数据

(3)数据放在的地方:二进制文件 mysql-bin-000001--->记录完整的sql,!slave复制二进制文件到本地节点,保存为中继日志文件方式,最后基于这个中继日志进行恢复,操作将执行的sql同步到自己的数据库当中,从而达到与master数据的一致性。

1.1 MySQL的复制类型

(1)STATEMENT:基于语句的复制。在服务器上执行sql语句,在从服务器上执行同样的语句,mysql默认采用基于语句的复制,执行效率高。

(2)ROW:基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。

(3)MIXED:混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。

1.2 MySQL主从复制的工作过程

(1)Master节点将数据的改变记录成二进制日志(binlog),当Master上的数据发生改变时,则将其改变写入二进制日志中。

(2)slave节点会在一定时间间隔内对Master的二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/0线程请求 Master的二进制事件。

(3)同时Master节点为每个I/0线程启动一个dump线程,用于向其发送二进制事件,并保存至slave节点本地的中继日志(Relay Log)中,slave节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,即解析成 sql语句逐一执行,使得其数据和Master节点的保持一致,最后I/0线程和SQL线程将进入睡眠状态,等待下一次被唤醒。

1.3 主从复制延迟

1、master服务器高并发,形成大量事务

2、网络延迟

3、主从硬件设备导致(如cpu主频、内存io、硬盘io)

4、本来就不是同步复制、而是异步复制

1.3.1 延迟优化

(1)从库优化Mysql参数。比如增大innodb_buffer_pool_size,让更多操作在Mysql内存中完成,减少磁盘操作。

(2)从库使用高性能主机。包括cpu强悍、内存加大。避免使用虚拟云主机,使用物理主机,这样提升了i/o方面性。

(3)从库使用SSD磁盘。

(4)网络优化,避免跨机房实现同步。

1.4 MySQL 主从复制的搭建与配置

先关闭主机防火墙和核心防护

复制代码
systemctl stop firewalld
systemctl disable firewalld
setenforce 0

1.4.1 主服务器设置

(1)安装时间同步工具ntp

复制代码
yum install ntp -y

(2)编辑配置文件

复制代码
vim /etc/ntp.conf

(3)末尾追加以下配置内容

(4)启动ntp服务

复制代码
service ntpd start

1.4.2 从服务器设置

(1)启动ntp服务

复制代码
service ntpd start

(2)进行时间同步

(3)设置计划任务

复制代码
crontab -e

1.4.3 主服务器的mysql配置

(1)编辑配置文件

复制代码
vim /etc/my.cnf

(2)添加以下内容

(3)重启数据库服务

复制代码
systemctl restart mysqld

(4)登录数据库

复制代码
mysql -uroot -p123456

(5)给从服务器授权

1.4.4 从服务器的mysql配置

1)编辑配置文件

复制代码
vim /etc/my.cnf

(2)添加以下内容

(3)重启数据库服务

复制代码
systemctl restart mysqld

(4)登录数据库

复制代码
mysql -uroot -p123456

(5)配置并启动同步

(6)查看 Slave 状态

1.4.5 验证主从复制效果

(1) 在主服务器上添加数据库

(2)在从服务器上查看

二、读写分离

2.1 读写分离原理

(1)只在主服务器上写,只在从服务器上读。

(2)主数据库处理事务性查询,从数据库处理SELECT查询。

(3)数据库复制用于将事务性查询的变更同步到集群中的从数据库。

2.2 读写分离方案

(1)基于程序代码内部实现

(2)基于中间代理层实现(如MySQL-Proxy,Amoeba,Mycat)

2.3 MySQL 读写分离的搭建与配置

本次使用Amoeba 中间件完成MySQL的读写分离

(1)安装 Java 环境

输入yes,按enter。

(2)移动jdk位置

(3)配置环境变量

复制代码
vim /etc/profile
复制代码
source /etc/profile

(2)安装 Amoeba软件

(3)先在Master、Slave1、Slave2 的mysql上开放权限给 Amoeba 访问

(4)配置amoeba服务并启动

(5)测试读写分离

1)安装并启动mariadb

复制代码
yum install -y mariadb-server mariadb
systemctl start mariadb.service

2)在客户端服务器上测试

3)在主服务器上创建表

4)在两台从服务器上新增数据

5)在主服务器上新增数据

6)在客户端服务器上测试,客户端会分别向slave1和slave2读取数据,显示的只有在两个从服务器上添加的数据,没有在主服务器上添加的数据。

(7)在两个从服务器上执行 start slave; 即可实现同步在主服务器上添加的数据。

三、小结

1、主从同步复制原理

通过amoeba代理服务器,实现只在主服务器上写,只在从服务器上读;

主数据库处理事务性查询,从数据库处理select 查询;

数据库复制被用来把事务查询导致的变更同步的集群中的从数据库;

2、读写分离使用方式: amoeba 代理 mycat 代码 sql_proxy

3、查看主从同步状态是否成功

在从服务器上内输入 show slave status\G 查看主从信息查看里面有IO线程的状态信息,还有master服务器的IP地址、端口事务开始号。

当 Slave_IO_Running和Slave_SQL_Running都是YES时 ,表示主从同步状态成功。

4、如果I/O不是yes呢,排查方式。

首先排查网络问题,使用ping 命令查看从服务器是否能与主服务器通信,

再查看防火墙和核心防护是否关闭(增强功能),

接着查看从服务slave是否开启,

两个从服务器的server-id 是否相同导致只能连接一台,

master_log_file master_log_pos的值跟master值是否一致。

5、show slave status能看到的信息

IO线程的状态信息,

master服务器的IP地址、端口、事务开始的位置,

最近一次的错误信息和错误位置,

最近一次的I/O报错信息和ID,

最近一次的SQL报错信息和id,

6、主从复制慢(延迟)的原因

主服务器的负载过大,被多个睡眠或 僵尸线程占用 导致系统负载过大,从库硬件比主库差,导致复制延迟。

主从复制单线程,如果主库写作并发太大,来不及传送到从库,就会到导致延迟。

慢sql语句过多。

网络延迟。

注意:若主从版本不一致,从的版本一定要高于主,保证可以向下兼容,因为若主的版本更新,低版本的从无法兼容的。

相关推荐
一介草民丶2 小时前
Mysql | 主从复制的工作机制
数据库·mysql·oracle
hawk2014bj2 小时前
Ubuntu 安装 MySQL
android·mysql·ubuntu
酱学编程5 小时前
redis 延迟双删
数据库·redis·缓存
xujiangyan_7 小时前
MySQL的半同步模式
数据库·git·mysql
飞翔沫沫情7 小时前
《MySQL 5.7.44审计合规实践:插件集成与日志分割自动化方案》
数据库·mysql·mysql审计
MXsoft6187 小时前
云原生运维在 2025 年的发展蓝图
运维·服务器·数据库
不辉放弃8 小时前
SQL 主键(Primary Key)
数据库·sql·oracle
qq_339282238 小时前
PostgreSQL-常用命令
数据库·postgresql·oracle
沸材9 小时前
Redis——实现消息队列
数据库·redis·消息队列
しかし1181149 小时前
C语言队列的实现
c语言·开发语言·数据结构·数据库·经验分享·链表