怎么做网站劳务中介,那个相亲网站做的比较好,网站主页跳转index,叶文语 厦门建设局前言
搭建参考#xff1a;搭建Mysql主从复制
为什么要做主从复制#xff1f;
做数据的热备#xff0c;作为后备数据库#xff0c;主数据库服务器故障后#xff0c;可切换到从数据库继续工作#xff0c;避免数据丢失。架构的扩展。业务量越来越大#xff0c;I/O访问频…前言
搭建参考搭建Mysql主从复制
为什么要做主从复制
做数据的热备作为后备数据库主数据库服务器故障后可切换到从数据库继续工作避免数据丢失。架构的扩展。业务量越来越大I/O访问频率过高单机无法满足此时做多库的存储降低磁盘I/O访问的频率提高单个机器的I/O性能。读写分离使数据库能支撑更大的并发。在报表中尤其重要。由于部分报表sql语句非常的慢导致锁表影响前台服务。如果前台使用master报表使用slave那么报表sql将不会造成前台锁保证了前台速度。使数据在地理位置上更接近用户从而降低访问延迟。游戏分西南大区 华南大区 北部大区等
Mysql支持三种主要的二进制日志binlog格式
1、STATEMENT基于语句的复制
记录导致数据更改的SQL语句。这种方式效率较高因为它只需记录执行的语句但是可能在某些情况下如使用函数或非确定性操作导致数据不一致。
优点效率高缺点数据一致性存在问题 例如update xxx set timenow() where id1
2、ROW基于行的复制
记录实际更改的数据行。这种方式提供了最高的数据一致性因为它是基于数据更改的而不是执行的语句。适合所有情况尤其是当复制环境中存在复杂的SQL或者函数操作时。
优点数据一致性强缺点性能低 例如存在一个表要更新其中10万条数据那么就会造成十万条记录被写入binary.log日志造成性能和空间的浪费。
3、MIXED混合类型的复制
MySQL会根据情况自动选择STATEMENT或ROW模式来记录日志。对于不涉及非确定性函数的简单更新它可能使用STATEMENT格式而对于可能引起问题的语句则使用ROW格式。
Mysql主从复制的实现方式
1、异步复制Asynchronous Replication
这是最基础的复制模式主服务器提交事务后立即返回而不等待从服务器确认。这种方式下主从之间的数据延迟可能较大但写入性能最高。
2、半同步复制Semi-Synchronous Replication
MySQL 5.5 引入了半同步复制在MySQL 8.0 中进一步完善增强半同步。在半同步模式下主服务器必须等待至少一个从服务器确认收到二进制日志事件后才能提交事务。这样保证了至少有一个副本有最新的数据但可能会影响写入性能。 注 MySQL 中的增强半同步配置具有一个参数rpl_semi_sync_master_timeout它定义了主数据库等待备库确认的超时时间。如果超过这个超时时间主数据库将切换到异步复制模式。
3、完全同步复制Fully Synchronous Replication
在某些配置中可以实现所有从节点都确认后主节点才提交但这通常会导致写性能显著下降。
主从复制的工作过程 主节点开启二进制日志从节点开启中继日志。 Master 节点将数据的改变记录成二进制日志bin log 当Master上的数据发生改变时增删改则将其改变写入二进制日志中。 从节点会在一定时间间隔内对Master的二进制日志进行探测其是否发生改变如果发生改变则开始一个I/O线程请求主节点的二进制事件。请求二进制数据 同时主节点为每个I/O线程启动一个dump线程用于通知和向其发送二进制日志I/O线程接收到bin-log内容后将内容保存至slave节点本地的中继日志Relay log中 从节点将启动SQL线程从中继日志中读取二进制日志在本地重放即解析成sql 语句逐一执行使得其数据和主节点的保持一致。最后I/O线程和SQL线程将进入睡眠状态等待下一次被唤醒。
1、三个线程
dump线程由主数据库开启用于读取主的二进制日志并传输给从数据库 。用于监听 I/O线程 请求将二进制日志更新的数据发送给slave的I/O 线程io线程由从数据库开启用于接收二进制日志并保存为中继日志。sql线程由从数据库开启用于将中继日志写入备数据库中完成主从复制。
2、二个日志
中继日志relay log只在主从服务器架构的从服务器上存在。从服务器slave为了与主服务器(Master)保持一致要从主服务器读取二进制日志的内容并且把读取到的信息写入本地的日志文件中这个从服务器本地的日志文件就叫中继日志。然后从服务器读取中继日志并根据中继日志的内容对从服务器的数据进行更新完成主从服务器的数据同步。
搭建好主从服务器之后中继日志默认会保存在从服务器的数据目录下。
中继日志格式 文件名的格式是从服务器名 - relay-bin.序号。中继日志还有一个索引文件从服务器名 - relay-bin.index用来定位当前正在使用的中继日志。
主从数据库同步
1、主库数据导出
#所有表只读
FLUSH TABLES WITH READ LOCK;
#导出所有数据库
mysqldump --all-databases --master-data -u 用户名 -p dbdump.sql
#释放读锁
UNLOCK TABLES;2、从库还原
#登录mysql关闭IO线程
STOP REPLICA IO_THREAD;
#命令行执行导入操作
mysql -u root -p dbdump.sql
#再次登录mysql开启IO线程
START REPLICA IO_THREAD;主从复制的问题及解决方案
Master宕机时数据丢失问题
使用半同步复制方案可以解决主库宕机造成的数据丢失问题。参考链接半同步复制
读写分离方案
1、基于dynamic-datasource-spring-boot-starter实现
此插件基于Mybatis拦截实现通过判断MappedStatement的SqlCommandType如果为SELECT则操作从库否则操作主库。
Bean
public MasterSlaveAutoRoutingPlugin masterSlaveAutoRoutingPlugin(){return new MasterSlaveAutoRoutingPlugin();
}