文章目录
1.什么是主从复制?
主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是准实时的业务数据库。
1.1MySQL 主从形式
2.为什么要做主从复制!
-
实时灾备,用于故障切换
- 做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。
-
读写分离,主库写操作,从库提供查询服务
- 开发中有时候会遇见++某个sql语句需要锁表,导致暂时不能使用读的服务++,这样就会影响现有业务,
- 使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。
-
架构的扩展
- 随着系统中业务访问量的增大,如果是单机部署数据库,就会导致I/O访问频率过高。
- 有了主从复制,增加多个数据存储节点,将负载分布在多个从节点上,降低单机磁盘I/O访问的频率,提高单个机器的I/O性能。
3.主从原理
3.1图解:
MySQL主从复制涉及到三个线程,一个运行在主节点(log dump thread
),其余两个(I/O thread
, SQL thread
)运行在从节点,如下图所示:
3.2具体操作:
-
1.
binlog
输出线程:每当有从库连接到主库的时候,主库都会创建一个线程然后发送binlog
内容到从库。在从库里,当复制开始的时候,从库就会创建两个线程进行处理: -
2.从库I/O线程:当
START SLAVE
语句在从库开始执行之后,从库创建一个I/O线程,该线程连接到主库并请求主库发送binlog
里面的更新记录到从库上。从库I/O线程读取主库的binlog
输出线程发送的更新并拷贝这些更新到本地文件,其中包括relay log
文件。 -
3.从库的SQL线程:从库创建一个SQL线程,这个线程读取从库I/O线程写到
relay log
的更新事件并执行。
4.总结
MySQL之间数据复制的基础是二进制日志文件(binary log file
)。
一台MySQL数据库一旦启用二进制日志后,其作为master
,它的数据库中所有操作都会以“事件”的方式记录在二进制日志中,其他数据库作为slave
通过一个I/O线程与主服务器保持通信,并监控master
的二进制日志文件的变化,如果发现master
二进制日志文件发生变化,则会把变化复制到自己的中继日志中,然后slave的一个SQL线程会把相关的“事件”执行到自己的数据库中,以此++实现从数据库和主数据库的一致性,也就实现了主从复制++。
5.可能出现的问题及解决方法
5.1mysql主从复制存在的问题:
-
主库宕机后,数据可能丢失
-
从库只有一个sql Thread,主库写压力大,复制很可能延时
5.2解决方法:
-
半同步复制———解决数据丢失的问题
- 从MySQL5.5开始,MySQL已经支持半同步复制了,半同步复制介于异步复制和同步复制之间,主库在执行完事务后不立刻返回结果给客户端,需要等待至少一个从库接收到并写到relay log中才返回结果给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时++它也造成了一个TCP/IP往返耗时的延迟++。
-
并行复制————解决从库复制延迟的问题
- a. 优化网络
- b. 升级从库硬件配置
- c. Slave调整参数,关闭binlog,修改innodb_flush_log_at_trx_commit参数值
- d. 升级MySQL版本到5.7,使用并行复制