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语句过多。

网络延迟。

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

相关推荐
大拇指的约定3 分钟前
数据库(MySQL):使用命令从零开始在Navicat创建一个数据库及其数据表(三),单表查询
数据库·mysql·oracle
阳光阿盖尔17 分钟前
redis——哨兵机制
数据库·redis·缓存·主从复制·哨兵
小小娥子18 分钟前
【Redis】Hash类型的常用命令
数据库·spring boot·redis
盒马盒马18 分钟前
Redis:cpp.redis++通用接口
数据库·c++·redis
barbyQAQ34 分钟前
Qt源码阅读——事件循环
开发语言·数据库·qt
银氨溶液38 分钟前
MySql数据引擎InnoDB引起的锁问题
数据库·mysql·面试·求职
IvorySQL1 小时前
济南站活动回顾|IvorySQL中的Oracle XML函数使用示例及技术实现原理
xml·数据库·sql·postgresql·oracle·开源
Data 3172 小时前
Hive数仓操作(十)
大数据·数据库·数据仓库·hive·hadoop
ON.LIN2 小时前
Hadoop大数据入门——Hive-SQL语法大全
大数据·数据库·hive·hadoop·分布式·sql
Elastic 中国社区官方博客2 小时前
Elasticsearch 开放推理 API 增加了对 Google AI Studio 的支持
大数据·数据库·人工智能·elasticsearch·搜索引擎