看完这篇还不懂 MySQL 主从复制,可以回家躺平了~
共 4852字,需浏览 10分钟
·
2021-07-09 03:07
我们在平时工作中,使用最多的数据库就是 MySQL 了,随着业务的增加,如果单单靠一台服务器的话,负载过重,就容易造成宕机。
这样我们保存在 MySQL 数据库的数据就会丢失,那么该怎么解决呢?
其实在 MySQL 本身就自带有一个主从复制的功能,可以帮助我们实现负载均衡和读写分离。
对于主服务器(Master)来说,主要负责写,从服务器(Slave)主要负责读,这样的话,就会大大减轻压力,从而提高效率。
接下来,跟着小羽一起来看看它都有哪些核心知识点呢:
简介
随着业务的增长,一台数据服务器已经满足不了需求了,负载过重。这个时候就需要减压了,实现负载均衡读写分离,一主一丛或一主多从。
主服务器只负责写,而从服务器只负责读,从而提高了效率减轻压力。
主从复制可以分为:
主从同步:当用户写数据主服务器必须和从服务器同步了才告诉用户写入成功,等待时间比较长。 主从异步:只要用户访问写数据主服务器,立即返回给用户。 主从半同步:当用户访问写数据主服务器写入并同步其中一个从服务器就返回给用户成功。
形式
一主一从
一主多从
多主一从
双主复制
级联复制
原理
过程
工作过程
从库生成两个线程,一个 I/O 线程,一个 SQL 线程; I/O 线程去请求主库的 binlog,并将得到的 binlog 日志写到 relay log(中继日志) 文件中; 主库会生成一个 log dump 线程,用来给从库 I/O 线程传 binlog; SQL 线程会读取 relay log 文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;
请求流程
当从服务器连接主服务器时,主服务器会创建一个 log dump 线程,用于发送 binlog 的内容。在读取 binlog 的内容的操作中,会对象主节点上的 binlog 加锁,当读取完成并发送给从服务器后解锁。 当从节点上执行 start slave
命令之后,从节点会创建一个 IO 线程用来连接主节点,请求主库中更新 binlog。IO 线程接收主节点 binlog dump 进程发来的更新之后,保存到 relay-log 中。从节点 SQL 线程负责读取 realy-log 中的内容,解析成具体的操作执行,最终保证主从数据的一致性。
类型
异步复制
同步复制
半同步复制
MySQL 5.5
开始集成,需要 master 和 slave 安装插件开启半同步模式。延迟复制
方式
语句复制
传输效率高,减少延迟。 在从库更新不存在的记录时,语句赋值不会失败。而行复制会导致失败,从而更早发现主从之间的不一致。 设表里有一百万条数据,一条sql更新了所有表,基于语句的复制仅需要发送一条sql,而基于行的复制需要发送一百万条更新记录
行数据复制
不需要执行查询计划。 不知道执行的到底是什么语句。 例如一条更新用户总积分的语句,需要统计用户的所有积分再写入用户表。如果是基于语句复制的话,从库需要再一次统计用户的积分,而基于行复制就直接更新记录,无需再统计用户积分。
混合类型的复制
配置
# 如果在双主复制结构中没有设置ID的话就会导致循环同步问题
server_id=1
# 即日志中记录的是语句还是行更新或者是混合
binlog_format=mixed
# 在进行n次事务提交以后,Mysql将执行一次fsync的磁盘同步指令。将缓冲区数据刷新到磁盘。
# 为0的话由Mysql自己控制频率。
sync_binlog=n
# 为0的话,log buffer将每秒一次地写入log file中并且刷新到磁盘。
# mysqld进程崩溃会丢失一秒内的所有事务。
# 为1的话,每次事务log buffer会写入log file并刷新到磁盘。(较为安全)
# 在崩溃的时候,仅会丢失一个事务。
# 为2的话,每次事务log buffer会写入log file,但一秒一次刷新到磁盘
innodb_flush_logs_at_trx_commit=0
# 阻止从库崩溃后自动启动复制,给一些时间来修复可能的问题,
# 崩溃后再自动复制可能会导致更多的问题。并且本身就是不一致的
skip_slave_start=1
# 是否将从库同步的事件也记录到从库自身的bin-log中
# 允许备库将重放的事件也记录到自身的二进制日志中去,可以将备库当做另外一台主库的从库
log_slave_update
# 日志过期删除时间,延迟严重的话会导致日志文件占用磁盘
expire_logs_days=7
问题
延迟
网络方面:尽量保证主库和从库之间的网络稳定,延迟较小; 硬件方面:从库配置更好的硬件,提升随机写的性能; 配置方面:尽量使 MySQL 的操作在内存中完成,减少磁盘操作。或升级 MySQL5.7 版本使用并行复制; 建构方面:在事务中尽量对主库读写,其它非事务的读在从库。消除一部分延迟带来的数据库不一致。增加缓存降低一些从库的负载。
数据丢失
注意事项
MySQL 主从复制是 MySQL 高可用性,高性能(负载均衡)的基础; 简单,灵活,部署方式多样,可以根据不同业务场景部署不同复制结构; 复制过程中应该时刻监控复制状态,复制出错或延时可能给系统造成影响; MySQL 主从复制目前也存在一些问题,可以根据需要部署复制增强功能。
作用
数据更安全:做了数据冗余,不会因为单台服务器的宕机而丢失数据; 性能大大提升:一主多从,不同用户从不同数据库读取,性能提升; 扩展性更优:流量增大时,可以方便的增加从服务器,不影响系统使用; 负载均衡:一主多从相当于分担了主机任务,做了负载均衡。
应用场景
横向扩展
数据安全
数据分析
远距离数据分布
拆分访问
有道无术,术可成;有术无道,止于术
欢迎大家关注Java之道公众号
好文章,我在看❤️