[1.1 MySQL的复制类型](#1.1 MySQL的复制类型)
[1.2 MySQL主从复制的工作过程](#1.2 MySQL主从复制的工作过程)
[1.3 主从复制延迟](#1.3 主从复制延迟)
[1.3.1 延迟优化](#1.3.1 延迟优化)
[1.4 MySQL 主从复制的搭建与配置](#1.4 MySQL 主从复制的搭建与配置)
[1.4.1 主服务器设置](#1.4.1 主服务器设置)
[1.4.2 从服务器设置](#1.4.2 从服务器设置)
[1.4.3 主服务器的mysql配置](#1.4.3 主服务器的mysql配置)
[1.4.4 从服务器的mysql配置](#1.4.4 从服务器的mysql配置)
[1.4.5 验证主从复制效果](#1.4.5 验证主从复制效果)
[2.1 读写分离原理](#2.1 读写分离原理)
[2.2 读写分离方案](#2.2 读写分离方案)
[2.3 MySQL 读写分离的搭建与配置](#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语句过多。
网络延迟。
注意:若主从版本不一致,从的版本一定要高于主,保证可以向下兼容,因为若主的版本更新,低版本的从无法兼容的。