网络服务商官方网站,域名查询ip地址,珠宝出售网站模板,明星百度指数排名目录 前言 为什么要主从复制#xff1f; 主从复制谁复制谁#xff1f; 数据放在什么地方#xff1f; 一、mysql支持的复制类型 1.1STATEMENT#xff1a;基于语句的复制 1.2ROW#xff1a;基于行的复制 1.3MIXED#xff1a;混合类型的复制 二、主从复制的工作过程 三个重… 目录 前言 为什么要主从复制 主从复制谁复制谁 数据放在什么地方 一、mysql支持的复制类型 1.1STATEMENT基于语句的复制 1.2ROW基于行的复制 1.3MIXED混合类型的复制 二、主从复制的工作过程 三个重要线程 三、中继日志relay log 3.1中继日志介绍 3.2中继日志格式 3.3中继日志的作用 3.4相关参数解析 四、搭建mysql主从复制 ①三台机器都关闭防火墙、核心防护 ②Mysql主从服务器时间同步 主服务器 时间同步 从服务器 时间同步 slave1时间同步 slave2时间同步 ③主服务器的mysql配置 ④从服务器的mysql配置 slave1配置 slave2配置 ⑤检测 去主服务器创建 去从服务器查看 五、MySQL主从复制延迟 六、MySQL读写分离 6.1什么是读写分离 6.2为什么要读写分离呢 6.3什么时候要读写分离 6.4主从复制与读写分离 6.7MySQL 读写分离原理 6.8目前较为常见的 MySQL 读写分离分为以下两种 6.8.1基于程序代码内部实现 6.8.2基于中间代理层实现 6.9读写分离原理 读写分离方案 6.9搭建读写分离 ①安装 Java 环境 ②安装Amoeba软件 ③ 配置 amoeba 读写分离 主服务器授权 从服务器授权: ④修改Amoeba服务配置读写分离负载均衡 amoeba.xml 配置文件的修改 修改 dbServers.xml 数据库配置文件 ⑤启动amoeba ⑥ 测试读写分离 主服务器 从服务器 七、温故而知新 7.1主从同步复制原理 7.2读写分离你们使用什么方式 7.3如何查看主从同步状态是否成功 7.4如果I/O不是yes呢你如何排查 7.5show slave status能看到哪些信息比较重要 7.6主从复制慢延迟会有哪些可能怎么解决 7.7mysql主从复制版本 在企业应用中成熟的业务通常数据量都比较大单台Mysql在安全性、高可用性和高并发方面都无法满足实际的需求配置多台主动数据库服务器以实现读写分离 主从复制和读写分离是为解决数据中的高并发 前言
为什么要主从复制
保证数据的完整性
主从复制谁复制谁
salve 复制 master的数据
数据放在什么地方
二进制文件 mysql-bin-000001中记录完整的sqlslave复制二进制文件到本地节点保存为中继日志文件方式最后基于这个中继日志 进行恢复 操作 将执行的sql同步到自己的数据库中达到与master 数据一致
一、mysql支持的复制类型
1.1STATEMENT基于语句的复制
在服务器上执行sql语句在从服务器上执行同样的语句mysql默认采用基于语句的复制5.7版本之前执行效率高。高并发的情况可能会出现执行顺序的误差事务的死锁。
1.2ROW基于行的复制
把改变的内容复制过去而不是把命令在从服务器上执行一 遍精确但效率低保存的文件会更大。5.7版本之后默认采用ROW模式
1.3MIXED混合类型的复制
默认采用基于语句的复制一旦发现基于语句无法精确复制时就会采用基于行的复制。更智能所以大部分情况下使用MIXED
二、主从复制的工作过程 两个日志主binlog二进制日志从relay-log中继日志 三个线程主dump线程从IO线程和SQL线程 1、主节点开启二进制日志从节点开启中继日志。
2、Master 节点将数据的改变记录成二进制日志bin log 当Master上的数据发生改变时增删改则将其改变写入二进制日志中。
3、从节点会在一定时间间隔内对Master的二进制日志进行探测其是否发生改变如果发生改变则开始一个I/O线程请求主节点的二进制事件。请求二进制数据
4、同时主节点为每个I/O线程启动一个dump线程用于通知和向其发送二进制日志I/O线程接收到bin-log内容后将内容保存至slave节点本地的中继日志Relay log中
5、从节点将启动SQL线程从中继日志中读取二进制日志在本地重放即解析成sql 语句逐一执行使得其数据和主节点的保持一致。最后I/O线程和SQL线程将进入睡眠状态等待下一次被唤醒。 ●中继日志通常会位于 OS 缓存中所以中继日志的开销很小。 ●复制过程有一个很重要的限制即复制在 Slave上是串行化的也就是说 Master上的并行更新操作不能在 Slave上并行操作。 首先client端tomcat将数据写入到master节点的数据库中master节点会通知存储引擎提交事务同时会将数据以基于行、基于sql、基于混合的方式保存在二进制日志中
SLAVE节点会开启I/O线程用于监听master的二进制日志的更新一旦发生更新内容则向master的dump线程发出同步请求
master的dump线程在接收到SLAVE的I/O请求后会读取二进制文件中更新的数据并发送给SLAVE的I/O线程
SLAVE的I/O线程接收到数据后会保存在SLAVE节点的中继日志中
同时SLAVE节点中的SQL线程会读取中继日志中的数据更新在本地的mysql数据库中
最终完成slave——复制master数据达到主从同步的效果 ①从数据库处理用户读操作主数据库处理用户写操作。 ②用户写入数据到主数据库时主数据库更新并写入binlog二进制日志中。 ③主数据库开启dump线程一边读取binlog日志一边通过网络将日志传输给从数据库。 ④从数据库通过io线程接收binlog日志并保存为中继日志(即binlog日志只是换了名称)。 ⑤从数据库开启sql线程将中继日志写入从数据库主从数据库复制完成。 主MySQL服务器做的增删改操作都会写入自己的二进制日志Binary log
然后从MySQL从服务器打开自己的I/O线程连接主服务器进行读取主服务器的二进制日志
I/O去监听二进制日志一旦有新的数据会发起请求连接
这时候会触发dump线程dump thread响应请求传送数据给I/O,通过tp的方式发送给I/Odump线程要么处于等待要么处于睡眠
I/O接收到数据之后存放在中继日志
SQL thread线程会读取中继日志里的数据存放到自己的服务器中。 三个重要线程 dump线程由主数据库开启用于读取主的二进制日志并传输给从数据库 。 用于监听 I/O线程 请求将二进制日志更新的数据发送给slave的I/O 线程 io线程由从数据库开启用于接收二进制日志并保存为中继日志。 sql线程由从数据库开启用于将中继日志写入备数据库中完成主从复制。 三、中继日志relay log 3.1中继日志介绍 中继日志relay log只在主从服务器架构的从服务器上存在。从服务器slave为了与主服务器(Master)保持一致要从主服务器读取二进制日志的内容并且把读取到的信息写入本地的日志文件中这个从服务器本地的日志文件就叫中继日志。然后从服务器读取中继日志并根据中继日志的内容对从服务器的数据进行更新完成主从服务器的数据同步。 搭建好主从服务器之后中继日志默认会保存在从服务器的数据目录下。 3.2中继日志格式 文件名的格式是从服务器名 - relay-bin.序号。中继日志还有一个索引文件从服务器名 - relay-bin.index用来定位当前正在使用的中继日志。 3.3中继日志的作用
中继日志用于主从服务器架构中从服务器用来存放主服务器二进制日志内容的一个中间文件。从服务器通过读取中继日志的内容来同步主服务器上的操作。
中继日志是连接master(主服务器)和slave(从服务器)的信息它是复制的核心I/O线程将来自master的binlog存储到中继日志中中继日志充当缓冲这样master不必等待slave执行完成就可以发送下一个binlog。
3.4相关参数解析
mysql show variables like %relay%; max_relay_log_size标记relay log 允许的最大值如果该值为0则默认值为max_binlog_size(1G)如果不为0则max_relay_log_size则为最大的relay_log文件大小relay_log定义relay_log的位置和名称如果值为空则默认位置在数据文件的目录datadir文件名默认为host_name-relay-bin.nnnnnnrelay_log_index同relay_log定义relay_log的位置和名称一般和relay-log在同一目录relay_log_info_file设置relay-log.info的位置和名称relay-log.info记录MASTER的binary_log的恢复位置和relay_log的位置relay_log_purge是否自动清空不再需要中继日志时。默认值为1(启用)。relay_log_recovery当slave从库宕机后假如relay-log损坏了导致一部分中继日志没有处理则自动放弃所有未执行的relay-log并且重新从master上获取日志这样就保证了relay-log的完整性。默认情况下该功能是关闭的将relay_log_recovery的值设置为 1时可在slave从库上开启该功能建议开启。relay_log_space_limit防止中继日志写满磁盘这里设置中继日志最大限额。注意但此设置存在主库崩溃从库中继日志不全的情况不到万不得已不推荐使用
sync_relay_log这个参数和sync_binlog是一样的当设置为1时slave的I/O线程每次接收到master发送过来的binlog日志都要写入系统缓冲区然后刷入relay log中继日志里这样是最安全的因为在崩溃的时候你最多会丢失一个事务但会造成磁盘的大量I/O
当设置为0时并不是马上就刷入中继日志里而是由操作系统决定何时来写入虽然安全性降低了但减少了大量的磁盘I/O操作。这个值默认是0可动态修改建议采用默认值。sync_relay_log_info这个参数和sync_relay_log参数一样当设置为1时slave的I/O线程每次接收到master发送过来的binlog日志都要写入系统缓冲区然后刷入relay-log.info里这样是最安全的因为在崩溃的时候你最多会丢失一个事务但会造成磁盘的大量I/O。当设置为0时并不是马上就刷入relay-log.info里而是由操作系统决定何时来写入虽然安全性降低了但减少了大量的磁盘I/O操作。这个值默认是0可动态修改建议采用默认值
四、搭建mysql主从复制
master 服务器192.168.246.7 ysql5.7slave1 服务器 192.168.246.8 Mysql5.7slave2 服务器 192.168.246.10 Mysql5.7 ①三台机器都关闭防火墙、核心防护
#关闭防火墙、防护
systemctl stop firewalld
systemctl disable firewalld.service
setenforce 0 ②Mysql主从服务器时间同步
主服务器 时间同步
yum install ntp -y #安装ntp服务用来完成时间同步
vim /etc/ntp.conf #修改配置文件
#末行添加以下两行
server 127.127.246.0 #设置本地为时钟源注意修改网段
fudge 127.127.246.0 stratum 8 #设置时间层级为8
service ntpd start #开启服务 server 127.127.246.0
fudge 127.127.246.0 startum 8 从服务器 时间同步
yum install ntp ntpdate -y #安装ntpdate同步
service ntpd start #开启服务
/usr/sbin/ntpdate 192.168.246.7 #使用 ntpdate同步本地时钟源
crontab -e #编辑定时任务
*/30 * * * * /usr/sbin/ntpdate 192.168.246.7 #三十分钟同步一次时间
crontab -l #查看定时任务
systemctl status crond.service #查看定时服务状态
slave1时间同步 slave2时间同步 ③主服务器的mysql配置
vim /etc/my.cnf
server-id 1 #master和两台slave的id都要不同
log-bin master-bin #添加主服务器开启二进制日志
binlog_format MIXED
log-slave-updates true #添加允许slave从master复制数据时可以写入到自己的二进制日志systemctl restart mysqld #重启mysql服务mysql -uroot -p123123
grant replication slave on *.* to myslave192.168.246.% identified by 123123; #同步权限所有用户所有表指定登录地址网段设置密码为123123
flush privileges; #刷新权限
show master status; #查看主服务器状态#File 列显示日志名Position 列显示偏移量 server-id 1
log-binmaster-bin
binlog_format MIXED
log-slave-updates true ④从服务器的mysql配置
#修改配置文件
vim /etc/my.cnf
[mysqld]
server-id 2 #修改注意id与Master的不同两个Slave的id也要不同
relay-logrelay-log-bin #添加开启中继日志从主服务器上同步日志文件记录到本地
relay-log-indexslave-relay-bin.index #添加定义中继日志索引文件的位置和名称一般和relay-log在同一目录
relay_log_recovery 1
#当 slave 从库宕机后假如 relay-log 损坏了导致一部分中继日志没有处理则自动放弃所有未执行的 relay-log并且重新从 master 上获取日志这样就保证了relay-log 的完整性。默认情况下该功能是关闭的将 relay_log_recovery 的值设置为 1 时 可在 slave 从库上开启该功能建议开启。
#重启服务
systemctl restart mysqld
#登录数据库进行同步设置
mysql -u root -p123123
change master to- master_host192.168.246.7, - master_usermyslave, - master_password123123,- master_log_filemysql-bin.000001,- master_log_pos604;
#配置同步注意master_log_file和master_log_pos的值要与master查询值一致start slave; #启动同步如果有报错执行reset alsve
show slave status\G; #查看slave状态确保io和sql线程都是yes代表同步正常Slave_IO_Running: Yes #负责与主机 io通信Slave_SQL_Running: Yes #负责自己的slave mysql进程##一般 Slave_IO_Running: No 的可能原因1. 网络不通 2. my.cnf配置有问题server-id重复3. 密码、file文件名、pos偏移量不对 4. 防火墙没有关闭
slave1配置 server-id 2
relay-logrelay-log-bin
relay-log-index slave-relay-bin.index
relay_log_recovery 1
slave2配置 ⑤检测
去主服务器创建 去从服务器查看 注如数据中途加入主从复制的库 需要导出主服务器库 的库文件并且导入到从服务器中 五、MySQL主从复制延迟
1、master服务器高并发形成大量事务 2、网络延迟 3、主从硬件设备导致 cpu主频、内存io、硬盘io 4、本来就不是同步复制、而是异步复制 从库优化Mysql参数。比如增大innodb_buffer_pool_size让更多操作在Mysql内存中完成减少磁盘操作。 从库使用高性能主机。包括cpu强悍、内存加大。避免使用虚拟云主机使用物理主机这样提升了i/o方面性。 从库使用SSD磁盘 网络优化避免跨机房实现同步
六、MySQL读写分离
6.1什么是读写分离
读写分离基本的原理是让主数据库处理事务性增、改、删操作INSERT、UPDATE、DELETE而从数据库处理SELECT查询操作数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
6.2为什么要读写分离呢
因为数据库的“写”写10000条数据可能要3分钟操作是比较耗时的。但是数据库的“读”读10000条数据可能只要5秒钟。所以读写分离解决的是数据库的写入影响了查询的效率
6.3什么时候要读写分离
数据库不一定要读写分离如果程序使用数据库较多时而更新少查询多的情况下会考虑使用。利用数据库主从同步再通过读写分离可以分担数据库压力提高性能。
6.4主从复制与读写分离
在实际的生产环境中对数据库的读和写都在同一个数据库服务器中是不能满足实际需求的无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的因此通过主从复制的方式来同步数据再通过读写分离来提升数据库的并发负载能力有点类似于rsync但是不同的是rsync是对磁盘文件做备份而mysql主从复制是对数据库中的数据、语句做备份
6.7MySQL 读写分离原理
读写分离就是只在主服务器上写只在从服务器上读基本的原理是让主数据库处理事务性操作而从数据库处理 select 查询数据库复制被用来把主数据库上事务性操作导致的变更同步到集群中的从数据库。
6.8目前较为常见的 MySQL 读写分离分为以下两种
6.8.1基于程序代码内部实现
在代码中根据 select、insert 进行路由分类这类方法也是目前生产环境应用最广泛的。优点是性能较好因为在程序代码中实现不需要增加额外的设备为硬件开支缺点是需要开发人员来实现运维人员无从下手。但是并不是所有的应用都适合在程序代码中实现读写分离像一些大型复杂的Java应用如果在程序代码中实现读写分离对代码改动就较大。
6.8.2基于中间代理层实现 代理一般位于客户端和服务器之间代理服务器接到客户端请求后通过判断后转发到后端数据库 有以下代表性程序。 1MySQL-Proxy。MySQL-Proxy 为 MySQL 开源项目通过其自带的 lua 脚本进行SQL 判断。 2Atlas。是由奇虎360的Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它是在mysql-proxy 0.8.2版本的基础上对其进行了优化增加了一些新的功能特性。360内部使用Atlas运行的mysql业务每天承载的读写请求数达几十亿条。支持事物以及存储过程。 3Amoeba。由陈思儒开发作者曾就职于阿里巴巴。该程序由Java语言进行开发阿里巴巴将其用于生产环境。但是它不支持事务和存储过程。 由于使用MySQL Proxy 需要写大量的Lua脚本这些Lua并不是现成的而是需要自己去写。这对于并不熟悉MySQL Proxy 内置变量和MySQL Protocol 的人来说是非常困难的。 Amoeba是一个非常容易使用、可移植性非常强的软件。因此它在生产环境中被广泛应用于数据库的代理层 6.9读写分离原理 只在主服务器上写只在从服务器上读主数据库处理事务性查询从数据库处理SELECT查询数据库复制用于将事务性查询的变更同步到集群中的从数据库 读写分离方案 基于程序代码内部实现基于中间代理层实现 MySQL-Proxy Amoeba mycat 搭建读写分离必须先搭建主从复制 6.9搭建读写分离 主mysql 服务器192.168.246.7 从mysql 服务器192.168.246.8 从mysql 服务器192.168.246.10 Amoeba 192.168.246.11 客户机 192.168.246.11 因为 Amoeba 基于是 jdk1.5 开发的所以官方推荐使用 jdk1.5 或 1.6 版本高版本不建议使用。
将jdk-6u14-linux-x64.bin 和 amoeba-mysql-binary-2.2.0.tar.gz.0 上传到/opt目录下。 Amoeba服务器配置 安装 Java 环境 因为 Amoeba 基于是 jdk1.5 开发的所以官方推荐使用 jdk1.5 或 1.6 版本高版本不建议使用 ①安装 Java 环境
[rootamoeba ~]# systemctl stop firewalld
[rootamoeba ~]# setenforce 0
[rootamoeba ~]# cd /opt/
[rootamoeba opt]# ls
[rootamoeba opt]#rz -E
[rootamoeba opt]#rz -E
[rootamoeba opt]#ls
amoeba-mysql-binary-2.2.0.tar.gz jdk-6u14-linux-x64.bin rh
[rootamoeba opt]#cp jdk-6u14-linux-x64.bin /usr/local/
[rootamoeba opt]# cd /usr/local/
[rootamoeba local]#chmod x jdk-6u14-linux-x64.bin
[rootamoeba local]# ./jdk-6u14-linux-x64.bin [rootamoeba local]#ls
bin etc games include jdk1.6.0_14 jdk-6u14-linux-x64.bin lib lib64 libexec sbin share src
[rootamoeba local]#mv jdk1.6.0_14/ /usr/local/jdk1.6
[rootamoeba local]#ls
bin etc games include jdk1.6 jdk-6u14-linux-x64.bin lib lib64 libexec sbin share src
[rootamoeba local]#vim /etc/profile export JAVA_HOME/usr/local/jdk1.6
export CLASSPATH$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin
export AMOEBA_HOME/usr/local/amoeba
export PATH$PATH:$AMOEBA_HOME/bin [rootamoeba local]#source /etc/profile
[rootamoeba local]#java -version
java version 1.6.0_14
Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mixed mode)
[rootamoeba local]#
②安装Amoeba软件
[rootamoeba local]#mkdir /usr/local/amoeba
[rootamoeba local]#ls
amoeba bin etc games include jdk1.6 jdk-6u14-linux-x64.bin lib lib64 libexec sbin share src
[rootamoeba local]#
[rootamoeba local]#tar zxvf /opt/amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
[rootamoeba local]#chmod -R 755 /usr/local/amoeba/
[rootamoeba local]#
[rootamoeba local]#/usr/local/amoeba/bin/amoeba
amoeba start|stop
[rootamoeba local]# ③ 配置 amoeba 读写分离 配置 Amoeba读写分离两个 Slave 读负载均衡 #先在Master、Slave1、Slave2 的mysql上开放权限给 Amoeba 访问 主服务器授权 grant all on *.* to test192.168.246.% identified by 123123; 从服务器授权: set global validate_password_policy0;
set global validate_password_length1;
#修改密码策略 ④修改Amoeba服务配置读写分离负载均衡
amoeba.xml 配置文件的修改
[rootamoeba ~]#cd /usr/local/amoeba/
[rootamoeba amoeba]#ls
benchmark bin changelogs.txt conf lib LICENSE.txt README.html
[rootamoeba amoeba]#cd /usr/local/amoeba/conf/
[rootamoeba conf]#ls
access_list.conf amoeba.xml dbServers.xml functionMap.xml log4j.xml ruleFunctionMap.xml
amoeba.dtd dbserver.dtd function.dtd log4j.dtd rule.dtd rule.xml
[rootamoeba conf]#cp amoeba.xml amoeba.xml.bak
[rootamoeba conf]#ls
access_list.conf amoeba.xml dbserver.dtd function.dtd log4j.dtd rule.dtd rule.xml
amoeba.dtd amoeba.xml.bak dbServers.xml functionMap.xml log4j.xml ruleFunctionMap.xml
[rootamoeba conf]#vim amoeba.xml cd /usr/local/amoeba/conf/cp amoeba.xml amoeba.xml.bak
vim amoeba.xml #修改amoeba配置文件30修改
property nameuseramoeba/property
32修改
property namepassword123123/property
115修改
property namedefaultPoolmaster/property
117去掉注释–
property namewritePoolmaster/property
property namereadPoolslaves/property 115G跳转到115行 修改 dbServers.xml 数据库配置文件
cp dbServers.xml dbServers.xml.bakvim dbServers.xml #修改数据库配置文件23注释掉
作用默认进入test库 以防mysql中没有test库时会报错
!-- mysql schema
property nameschematest/property
--
26修改
!-- mysql user --
property nameusertest/property
28-30去掉注释
property namepassword123123/property
45修改设置主服务器的名Master
dbServer namemaster parentabstractServer
48修改设置主服务器的地址
property nameipAddress192.168.246.7/property
52修改设置从服务器的名slave1
dbServer nameslave1 parentabstractServer
55修改设置从服务器1的地址
property nameipAddress192.168.246.8/property
58复制上面6行粘贴设置从服务器2的名slave2和地址
dbServer nameslave2 parentabstractServer
property nameipAddress192.168.246.10/property
65修改
dbServer nameslaves virtualtrue
71修改
property namepoolNamesslave1,slave2/property/usr/local/amoeba/bin/amoeba start #启动Amoeba软件按ctrlc 返回
netstat -anpt | grep java #查看8066端口是否开启默认端口为TCP 8066 ⑤启动amoeba
/usr/local/amoeba/bin/amoeba start
#后台启动Amoeba软件按ctrlc 返回 [rootamoeba conf]#netstat -anpt | grep java
tcp6 0 0 127.0.0.1:819 :::* LISTEN 3435/java
tcp6 0 0 :::8066 :::* LISTEN 3435/java
[rootamoeba conf]#netstat -anpt | grep 8066
tcp6 0 0 :::8066 :::* LISTEN 3435/java
[rootamoeba conf]# ⑥ 测试读写分离 在客户端服务器上进行测试 使用yum快速安装MySQL虚拟客户端 安装mariadb 可换一台新机器此处就不换了
[rootamoeba conf]#yum install -y mariadb-server mariadb
[rootamoeba conf]#systemctl start mariadb.service
[rootamoeba conf]#在客户端服务器上测试
mysql -u amoeba -p123456 -h 192.168.24611 -P8066
//通过amoeba服务器代理访问mysql 在通过客户端连接mysql后写入的数据只有主服务会记录然后同步给从--从服务器 通过amoeba服务器代理访问mysql 在通过客户端连接mysql后写入的数据只有主服务会记录然后同步给从--从服务器 主服务器 从服务器 然后我们停掉两台从服务器
主服务器 从服务器1 从服务器2 去客户端检测 客户端会分别向slave1和slave2读取数据显示的只有在两个从服务器上添加的数据没有在主服务器上添加的数据 在客户端加数据看看 然后再开启主从复制 开启主从复制后从服务器会和主服务器进行同步因此两个从服务器都拥有了主服务器的数据 七、温故而知新
7.1主从同步复制原理
首先client端tomcat将数据写入到master节点的数据库中master节点会通知存储引擎提交事务同时会将数据以基于行、基于sql、基于混合的方式保存在二进制日志中 SLAVE节点会开启I/O线程用于监听master的二进制日志的更新一旦发生更新内容则向master的dump线程发出同步请求 master的dump线程在接收到SLAVE的I/O请求后会读取二进制文件中更新的数据并发送给SLAVE的I/O线程 SLAVE的I/O线程接收到数据后会保存在SLAVE节点的中继日志中 同时SLAVE节点钟的SQL线程会读取中继日志钟的熟更新在本地的mysql数据库中 最终完成slave——复制master数据达到主从同步的效果
7.2读写分离你们使用什么方式
amoeba 代理 mycat 代码 sql_proxy
通过amoeba代理服务器实现只在主服务器上写只在从服务器上读 主数据库处理事务性查询从数据库处理select 查询 数据库复制被用来把事务查询导致的变更同步的集群中的从数据库
7.3如何查看主从同步状态是否成功
在从服务器上内输入 show slave status\G 查看主从信息查看里面有IO线程的状态信息还有master服务器的IP地址、端口事务开始号。 当 Slave_IO_Running和Slave_SQL_Running都是YES时 表示主从同步状态成功
7.4如果I/O不是yes呢你如何排查
首先排查网络问题使用ping 命令查看从服务器是否能与主服务器通信 再查看防火墙和核心防护是否关闭增强功能 接着查看从服务slave是否开启 两个从服务器的server-id 是否相同导致只能连接一台 master_log_file master_log_pos的值跟master值是否一致
7.5show slave status能看到哪些信息比较重要
IO线程的状态信息 master服务器的IP地址、端口、事务开始的位置 最近一次的错误信息和错误位置 最近一次的I/O报错信息和ID 最近一次的SQL报错信息和id
7.6主从复制慢延迟会有哪些可能怎么解决
主服务器的负载过大被多个睡眠或 僵尸线程占用 导致系统负载过大从库硬件比主库差导致复制延迟 主从复制单线程如果主库写作并发太大来不及传送到从库就会到导致延迟 慢sql语句过多 网络延迟 7.7mysql主从复制版本 若主从版本不一致从的版本一定要高于主保证可以向下兼容 因为若主的版本更新低版本的从无法兼容的。