MySQL主从复制与读写分离

一、主从复制

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

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

  • 25
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值