目录
一、前言
在企业应用中,成熟的业务通常数据量都比较大
单台MySQL在安全性、高可用性和高并发方面都无法满足实际的需求
配置多台主从数据库服务器以实现读写分离
二、主从复制原理
两个日志:① 二进制日志
② 中继日志
三个线程:master dump线程和salved的I/O线程、SQL线程 三个线程如何工作以达成一致
主要原理:master将数据保存在二进制日志中,I/O向dump发出同步请求,dump把数据发送给I/O线程,I/O写入本地的中继日志,SQL线程读取本地中继日志数据,同步到自己的数据库中,完成同步
三、复制方式
基于语句的复制(statement,MySQL默认类型)
在主服务器上执行的 SQL 语句,在从服务器上执行同样的语句。MySQL 默认采用基于语句的复制,效率比较高。
基于行的复制(row)
把改变的内容复制过去,而不是把命令在从服务器上执行一遍
混合类型的复制(mixed)
默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制
四、主从复制的同步方式
异步复制
异步复制指主库以异步的方式同步数据到一个从库或多个从库中。
这种模式下,主节点不会主动推送数据到从节点,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理。
同步复制
当主库执行完一个事务,然后所有的从库都复制了该事务并成功执行完才返回成功信息给客户端。
因为需要等待所有从库执行完该事务才能返回成功信息,所以全同步复制的性能必然会收到严重的影响。
半同步复制
在异步复制的基础上,确保任何一个主库上的事务在提交之前至少有一个从库已经收到该事务并记录下日志。
相对于异步复制,半同步复制提高了数据的安全性,一定程度的保证了数据能成功备份到从库,同时它也造成了一定程度的延迟,但是比全同步模式延迟要低,这个延迟最少是一个 TCP/IP 往返的时间。所以半同步复制最好在低延时的网络中使用。
五、应用场景
主要的性能是读和写,一般场景来说读请求更多
根据主从复制可以演变成读写分离,因为读写分离基于主从复制,使用读写分离从而解决高并发问题
六、读写分离原理
只在主服务器上写,只在从服务器上读
主数据库处理事务性查询,从数据库处理select查询
数据库复制用于将事务性查询的变更同步到集群中的从数据库
七、读写分离方案
基于程序代码内部实现
基于中间代理层实现:
MySQL-Proxy
Amoeba
八、错误排查
1. Connecting错误
排错思路如下:
二进制日志没有开启
IPTABLES 没有放开端口
对应的主机 IP地址写错了
实际操作:关闭主节点防火墙,重新开启从节点,即可连接上。
2. Slave_I/O_Running:NO
排错思路如下:
查看是否使用了nat的网络结构到导致网络有问题,连接不上。
有可能my.cnf有问题,配置文件
授权的问题,replication slave和file权限是必须的。
九、面试题
1. 如果I/O和sql不是yes呢,你是如何排查的
首先排查网络问题,使用ping命令查看从服务器是否能与主服务器同信
再查看防火墙和核心防护是否关闭(增强功能)
查看从服务slave是否开启
两个服务器的sever-id 是否相同导致只能连接一台
master_log_file master_log_pos 的值跟master是否一致
2.show slave status \G能看到哪些信息(比较重要的)
io状态 两个线程的yes
Last_Errno,Last_Error**
slave的SQL线程读取日志参数的的错误数量和错误消息。错误数量为0并且消息为空字符串表示没有错误;
如果Last_Error值不是空值,它也会在从属服务器的错误日志中作为消息显示。
3. 主从复制慢(延迟)有哪些可能
① 从库硬件比主库差,导致复制延迟
② 主从复制单线程,如果主库写并发太大,来不及传送到从库,就会导致延迟。从要更高版本的mysql
③ 可以支持多线程复制
④ 慢SQL语句过多
⑤ 网络延迟
⑥ master负载:主库读写压力大,导致复制延迟,架构的前端要加buffer及缓存层
⑦ slave负载:一般的做法是,使用多台slave来分摊读请求,再从这些slave中取一台专用的服务器,只作为备份用,不进行其他任何操作.
十、主从复制实验
虚拟机服务环境
Master服务器:192.168.174.10
Slave1 服务器:192.168.174.20
Slave2 服务器:192.168.174.30
Amoeba服务器:192.168.174.40
客户端服务器:192.168.174.40
1. master服务器配置
安装ntp、修改配置文件
2.两台slave服务器配置
3. 配置主从同步
- master服务器修改配置文件
- 配置规则
- 从服务器配置
slave1
slave2
开启从服务器功能
slave1
slave2
查看从服务器状态
slave1
slave2
测试数据同步
在主服务器上创建一个数据库
slave1
slave2
十一、读写分离实验
安装java环境
一直按enter,并输入yes,结束时‘是’和‘否’都可以点
安装Amoeba软件
先后再master、slave1、slave2数据库里给amoeba开放访问权限
回到amoeba服务器配置服务
测试读写分离
客户端安装数据库
在主服务器上
在两台从服务器上
slave1
slave2
主服务器
客户端服务器
实现分离