一、主从复制
主从复制是读写分离和高可用MHA的前提。
1.1 主从复制的模式
MySQL的默认模式
异步模式:主库在更新完事务之后,会立即把结果返回给从服务器,但主库并不关心从库是否接受到、是否处理成功。
一旦出现网络问题或其他因素影响,容易导致同步失败。特点:效率高,不够安全。
2、全同步模式
主库在更新完事务之后,立即把结果返回到从库,所有的从库执行完毕之后才能继续下一个同步。
特点:安全,性能不高
3、半同步复制
介乎于异步和全同步之间。主库更新完事务之后,也是会同步到从库。同步提交之后有一个等待时间,这个等待时间是一个TCP/IP的往返时间,一般在5ms左右。
特点:一定程度上保证效率,一定程度上保证安全,即数据的完整性。
1.2 主从复制的特点
-
主从复制的常见架构模式,一般是奇数台:一主两从 或 两主三从 ;比较少见两主两从
-
一般只有主库复制到从库,即主库的更新会同步到从库,但从库的数据更新不会同步到主。
-
如果是主主模式,则主库之间互为主库,各自的更新会互相同步。
主从复制的延迟怎么解决?1、网络问题:防火墙原因;网络设备问题 2、硬件设备问题:CPU、内存、磁盘出现问题 3、配置文件问题。
1.3 主从复制的设置类型
1.3.1 双一设置:安全性设置
配置文件当中进行双一设置可以提高数据配置的一致性,提高数据的安全性。
前提:数据库的存储引擎要是InnoDB
双一设置可以提高安全性,但是对性能影响较大,适用于对数据安全性要求极高的场景。
1.3.2 性能化设置
解释:极端性能化,一旦系统重启、刷新等,会丢失日志
N为较大的数字,比如10,即最多提交几次事务会进行磁盘刷新,将日志内容保存到磁盘
解释:每次更新都保存在内存中,不进行刷新,不推荐设置
解释:控制InnoDB存储引擎缓冲池的大小,增大可以提高数据库的性能,但是占用的是系统内存,配置的时候要注意合理化使用
1.4 主从复制的实现
实现是基于mysql的二进制日志,根据主库的二进制文件的标志位,实现主和从的同步。主从服务器之间,服务器的时间要同步。
1.4.1 架构
主:mysql1 :20.0.0.41
从1:mysql2 :20.0.0.42
从2:mysql3 :20.0.0.43
1.4.2 配置流程
- 对三台mysql服务器统一配置如下
2.对主库配置如下
3.三台库上都创建用户myslave:
4.在主库上查看主的状态,获取后面配置需要的信息
5.对从库1配置如下:
6.对从库2配置如下:
7.两台从库mysql服务器同步操作
master_log_file
取决于主库的二进制日志文件具体是哪个,就是上面通过命令show master status;
获取的File
列下面的值master_log_pos
取决于上面通过命令show master status;
获取的主库的二进制日志文件的position 8.启动同步,查看同步是否成功
Slave_IO_Running
:检查从库和主库的IO通信是否正常Slave_SQL_Runing
:检查从库的SQL线程是否正常运行
在主从同步完成之前,需要先停止服务,一般是初始化的时候配置,防止因为其他操作,导致position的位置变化,导致同步失败。如果IO或SQL检查出现no,需要重置slave设置:
2.2 读写分离的实现
2.2.1 架构
主从服务器:
主:mysql1 :20.0.0.41
从1 :mysql2 :20.0.0.42
从2 :mysql3 :20.0.0.43
20.0.0.10 :test1:代理服务器 jdk1.6 Amoeba (需要准备jdk1.6版本的安装包,以及Amoeba的软件包)
20.0.0.20 :test2 : 客户端 mysql / mariadb
2.2.2 配置流程
基于上文配置完成的主从服务器,继续配置如下
- test1 和 test2 关闭防火墙、守护进程
2、代理服务器test1上安装java环境
-
配置 Amoeba读写分离,两个 Slave 读负载均衡
4.1) 先在Master、Slave1、Slave2 的mysql上开放权限给 Amoeba 访问
如果主从复制处于running,就不需要配置两台从库,在主库上建完用户,从库会自动复制
3.1 主从同步复制原理
(1)Master节点将数据的改变记录成二进制日志(bin log),当Master上的数据发生改变时,
则将其改变写入二进制日志中。
(2)Slave节点会在一定时间间隔内对Master的二进制日志进行探测其是否发生改变,如果发生改变,
则开始一个I/O线程请求 Master的二进制事件。
(3)同时Master节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,
并保存至Slave节点本地的中继日志(Relay log)中,Slave节点将启动SQL线程从中继日志中读取二进制日志,
在本地重放,即解析成 sql 语句逐一执行,使得其数据和 Master节点的保持一致,最后I/O线程和SQL线程将进入睡眠状态,
等待下一次被唤醒。