MySQL主从复制
admin
2023-04-15 22:21:27
0次

MySQL主从复制
主从复制类型:
异步方式:一般的MySQL复制,主server只负责发送二进制日志,不check从是否完成
半同步方式:在一堆从中,主只保证其中一个返回同步完成即可,如果超时,自动降级为异步
级联方式:主复制给其中一个从,这个从再复制给后面的一堆从,用于减轻主的负担
架构:
普通一主多从:
MySQL主从复制
带负载均衡的读写分离:
MySQL主从复制
带级联复制和负载均衡的读写分离:
MySQL主从复制

MySQL主从复制

主从步骤:

  1. 主上面为每个slave开启一个dump thread
  2. 从上的IO thread和主上的dump thread连接,并发送二进制日志,在从上保存为realy log
  3. 从上的SQL thread从relay log中逐条读取并在本地执行
    主从配置:
    主上配置:
  4. 开启binlog
  5. 设置server id
  6. 创建同步用户,并授予REPLICATION SLAVE和REPLICATION CLIENT权限
    从上配置:
  7. 开启relay log
  8. 设置与主不同的server id
  9. CHANGE MASTER TO MASTER_HOST='',MASTER_PORT=,MASTER_USER='',MASTER_PASSWORD='',MASTER_LOG_FILE='',MASTER_LOG_POS=;
  10. start slave io_thread;start slave sql_thread;
  11. 配置skip-slave-start=1
    半同步配置:
  12. 安装master/slave remi插件:INSTALL PLUGIN
  13. 启用master/slave remi插件
  14. 设置超时时间即可,超出此时长后自动降级为异步方式
    同步过滤配置:
    主上可选配置(不推荐,因为会导致二进制事件丢失):
  15. binlog-do-db: 二进制日志记录此库操作
  16. binlog-ingire-db: 二进制日志忽略此库操作
    从上可选(推荐,但会导致不必要的性能消耗):
  17. replicate-do-db:同步此db
  18. replicate-ingire-db:忽略此db
  19. replicate-do-table:同步此表
  20. replicate-ingire-table:忽略此表
  21. replicate-wild-do-table=tb%:支持正则,同步tb开头的表
  22. replicate-wild-ingire-table=tb_:主持正则,忽略以tb开头后跟一个字符的表

基于GTID及多线程复制:
1、基于GTID是一种安全复制方式,MySQL5.6版本后支持全局事务ID,在复制是根据全局事务ID进行复制,在复制时从会反馈自己的复制状态以及记录复制了哪些语句,其他从也知道另外从的复制位置等,在主从切换时更安全。
2、多线程复制是基于多个库的,每个库一个单线程,多个库可以使用多个线程。

一、 什么是GTID ( Global transaction identifiers ):
MySQL-5.6.2开始支持,MySQL-5.6.10后完善,GTID 分成两部分,一部分是服务的UUid,UUID保存在mysql数据目录的auto.cnf文件中,
这是一个非常重要的文件,不能删除,这一部分是不会变的。另外一部分就是事务ID了,随着事务的增加,值一次递增,如下图
+---------------+----------+--------------+------------------+--------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+--------------------------------------------+
| binlog.000029 | 23556 | | | 724afcc2-29d6-11e4-9902-000c290c0121:1-362 |
+---------------+----------+--------------+------------------+--------------------------------------------+
GTID:724afcc2-29d6-11e4-9902-000c290c0121:1-362
UUID:724afcc2-29d6-11e4-9902-000c290c0121
transactionId:1-362
在整个复制架构中GTID 是不变化的,即使在多个连环主从中也不会变。
例如:ServerA --->ServerB ---->ServerC
GTID从在ServerA ,ServerB,ServerC 中都是一样的。

二、 GTID的工作原理:
1、master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。
2、slave端的i/o 线程将变更的binlog,写入到本地的relay log中。
3、sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。
4、如果有记录,说明该GTID的事务已经执行,slave会忽略。
5、如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。
6、在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。

三、 GTID的优点:
1.一个事务对应一个唯一ID,一个GTID在一个服务器上只会执行一次
2.GTID是用来代替传统复制的方法,GTID复制与普通复制模式的最大不同就是不需要指定二进制文件名和位置
3.减少手工干预和降低服务故障时间,当主机挂了之后通过软件从众多的备机中提升一台备机为主机

那么GTID复制是怎么实现自动同步,自动对应位置的呢?
例如:ServerC <-----ServerA ----> ServerB
主机ServerA
备机:ServerB,ServerC
当主机ServerA 挂了之后 ,此时ServerB执行完了所有从ServerA 传过来的事务,
ServerC 延时一点。这个时候需要把 ServerB 提升为主机 ,Server C 继续为备机。
当ServerC 链接ServerC 之后,首先在自己的二进制文件中找到从ServerA 传过来的最新的GTID,
然后将这个GTID 发送到ServerB ,ServerB 获得这个GTID之后,就开始从这个GTID的下一个GTID
开始发送事务给ServerC。这种自我寻找复制位置的模式减少事务丢失的可能性以及故障恢复的时间。

四、 GTID的限制:
1.不支持非事务引擎
2.不支持create table ... select 语句复制(主库直接报错)
原理:( 会生成两个sql,一个是DDL创建表SQL,一个是insert into 插入数据的sql。
由于DDL会导致自动提交,所以这个sql至少需要两个GTID,但是GTID模式下,只能给这个sql生成一个GTID )
3.不允许一个SQL同时更新一个事务引擎表和非事务引擎表
4.在一个复制组中,必须要求统一开启GTID或者是关闭GTID
5.开启GTID需要重启(5.7除外)
6.开启GTID后,就不再使用原来的传统复制方式
7.对于create temporary table 和 drop temporary table语句不支持
8.不支持sql_slave_skip_counter

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...