MySQL主从复制与读写分离

发布于:2024-03-29 ⋅ 阅读:(18) ⋅ 点赞:(0)

一、主从复制

1.1 MySQL的复制类型

1.2 MySQL主从复制的工作过程

1.3 主从复制延迟

1.3.1 延迟优化

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

1.4.1 主服务器设置

1.4.2 从服务器设置

​编辑

1.4.3 主服务器的mysql配置

1.4.4 从服务器的mysql配置

1.4.5 验证主从复制效果

二、读写分离

2.1 读写分离原理

2.2 读写分离方案

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语句过多。
网络延迟。

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

本文含有隐藏内容,请 开通VIP 后查看