MySQL 主从复制与读写分离

发布时间:2024年01月03日

目录

一、MySQL主从复制

1、概述

2、mysql支持的复制类型

3、MySQL主从复制的工作过程

4、主从复制实际操作

主服务器:

①关闭防护墙和安全机制

②设置时间同步

③修改配置文件参数

④给从服务器授权

从服务器:

①关闭防护墙和安全机制

②设置时间同步

③修改配置文件参数

④进入数据库做主从配置

测试:

5、配置MySQL主从复制可能遇到的常见问题(注意点)

6、MySQL主从复制延迟

7、MySQL主从复制数据不一致

8、MySQL主从复制的同步模式

二、读写分离

1、MySQL读写分离的方式有哪些


一、MySQL主从复制

1、概述

? ? ? 在实际的生产环境中,成熟的业务通常数据量都比较大,数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。有点类似于rsync,但是不同的是rsync是对磁盘文件做备份,而mysql主从复制是对数据库中的数据、语句做备份。

2、mysql支持的复制类型

(1)STATEMENT:基于语句的复制。在服务器上执行sql语句,在从服务器上执行同样的语句,mysql在5.7版本之前默认采用基于语句的复制,特点是执行效率高,在高并发情况下可能会无法精确复制。

(2)ROW:基于的复制。在5.7版本之后默认使用基于行的复制,把改变的内容复制过去,而不是把命令在从服务器上执行一遍。特点是非常精确,保存的数据量可能会变大,效率变慢。

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

3、MySQL主从复制的工作过程

①首先需要主服务器开启二进制日志,备服务器开启中继日志

②主服务器的数据更新时,会将其改变写入二进制日志中

③如果主服务器的二进制日志发生改变,备服务器会开启io线程向主服务器请求二进制日志事件/记录

④主服务器为每个io线程开启一个dump线程,用于向从服务器发送二进制事件

⑤从服务器保存二进制日志到中继日志中,并开启SQL线程读取中继日志中的二进制事件并解析成sql语句进行重放/逐一执行,使得数据和主服务器保持一致

注:

中继日志通常会位于 OS 缓存中,所以中继日志的开销很小

复制过程有一个很重要的限制,即复制在 Slave上是串行化的,也就是说 Master上的并行更新操作不能在 Slave上并行操作

4、主从复制实际操作

主服务器:

①关闭防护墙和安全机制
②设置时间同步

使用主服务器做边缘服务器

③修改配置文件参数

vim /etc/my.cnf

systemctl restart mysql

④给从服务器授权

mysql -uroot -p123

从服务器:

①关闭防护墙和安全机制
②设置时间同步

③修改配置文件参数

vim /etc/my.cnf

systemctl restart mysql

④进入数据库做主从配置

?mysql -uroot -p123

测试:

在主服务器创建库表并写入数据

再去从服务器验证

5、配置MySQL主从复制可能遇到的常见问题(注意点)

一般 Slave_IO_Running: No 的可能性:

①注意配置文件中的server-id是否为唯一

②检查防火墙是否关闭

③检查主备服务器之间是否能相互ping通

④登录从数据库(stop slave)检查change master to是否配置有误,如果有误则重新配置

6、MySQL主从复制延迟

登录数据库使用show slave status\G命令,其中Seconds_Behind_Master配置项和SQL_Delay配置项如果为0则表示主从复制之间不存在延迟,如果不为0为任意正数,则主从复制之间存在延迟。

主从复制延迟原因:

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

2、网络延迟

3、主从硬件设备导致

cpu主频、内存io、硬盘io

4、是同步复制、而不是异步复制

解决策略:

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

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

3、从库使用SSD固态磁盘

4、网络优化,避免跨机房实现同步

5、架构方面:比如在事务当中尽量对主库读写,其他非事务中的读在从库。消除一部分延迟带来的数据库不一致。增加缓存降低一些从库的负载。

7、MySQL主从复制数据不一致

解决方案:

①先进入主库,进行锁表,防止数据写入,进入只读状态
使用命令:mysql> flush tables with read lock;

②进行数据备份

mysqldump -uroot -p -hlocalhost > mysql.bak.sql

③查看master 状态

mysql> show master status;

④把mysql备份文件传到从库机器,进行数据恢复

scp mysql.bak.sql 192.168.130.20:/tmp/

⑤停止从库的状态

mysql> stop slave;

⑥到从库执行mysql命令,导入数据备份

mysql> source /tmp/mysql.bak.sql

⑦设置从库同步,注意该处的同步点,就是主库show master status信息里的| File| Position两项

change master to master_host = '192.168.130.10', master_user = 'myslave', master_port=3306, master_password='123', master_log_file = 'mysqld-bin.000001', master_log_pos=3260;

⑧重新开启从同步

mysql> stop slave;

⑨查看同步状态

mysql> show slave status\G 查看:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

8、MySQL主从复制的同步模式

●异步复制(Asynchronous replication)
MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果宕机了,此时主上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。

●全同步复制(Fully synchronous replication)
指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。

●半同步复制(Semisynchronous replication)
介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。

二、读写分离

1、MySQL读写分离的方式有哪些

①基于程序代码内部实现
在代码中根据 select、insert 进行路由分类,这类方法也是目前生产环境应用最广泛的。
优点是性能较好,因为在程序代码中实现,不需要增加额外的设备为硬件开支;缺点是需要开发人员来实现,运维人员无从下手。
但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的Java应用,如果在程序代码中实现读写分离对代码改动就较大。

②基于中间代理层实现
代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,有以下代表性程序。
(1)MySQL-Proxy。MySQL-Proxy 为 MySQL 开源项目,通过其自带的 lua 脚本进行SQL 判断。
(2)Atlas。是由奇虎360的Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它是在mysql-proxy 0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。360内部使用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条。支持事物以及存储过程。
(3)Amoeba。由陈思儒开发,作者曾就职于阿里巴巴。该程序由Java语言进行开发,阿里巴巴将其用于生产环境。但是它不支持事务和存储过程。
(4)Mycat。是一款流行的基于Java语言编写的数据库中间件,是一个实现了MySql协议的服务器,其核心功能是分库分表。配合数据库的主从模式还可以实现读写分离。

由于使用MySQL Proxy 需要写大量的Lua脚本,这些Lua并不是现成的,而是需要自己去写。这对于并不熟悉MySQL Proxy 内置变量和MySQL Protocol 的人来说是非常困难的。
Amoeba是一个非常容易使用、可移植性非常强的软件。因此它在生产环境中被广泛应用于数据库的代理层。

文章来源:https://blog.csdn.net/lcy913/article/details/135341882
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。