当前位置: 首页 > news >正文

MySQL传统主从复制(第一弹)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

0、引言

MySQL主从复制的原理及搭建,故障分析

 

一、MySQL主从同步的架构及原理

原理:

1)Slave连接到master,主从数据一致,开启同步,开始同步数据

2) 用户在主上写入数据,日志储存到binlog,master上IO thread读取主库binlog,然后把信息传递给从库上的IO thread

3)从库上的IO thread再把部分信息存储在master.info(存储连接位置信息)和relay log里(存储binlog信息)

4)从库上的SQL thread监测到relay log有更新,把更新的信息恢复到从库,然后把位置点信息记录下来

 

 

二、MySQL实现主从同步的几种方式及使用价值

 

1、MySQL主从复制的几种实现方式

l  基于binlog+position的传统复制

l  基于事务的GTID复制

l  多源复制

l  Group replication(5.7新特性)

l  半同步

 

2、MySQL主从复制的使用价值

l  利用从库做高可用

l  利用从库做读写分离

l  利用从库做升级

 

 

三、MySQL基于binlog三种模式下的复制

 

1、基于statement格式的复制

优点:binlog文件小,节省磁盘IO,只记录执行的SQL,方便阅读统计

缺点:对MySQL特殊函数不能复制,可能会导致主从不一致

 

2、基于row格式的复制

优点:详细记录每一行的修改信息(上下文信息),不会出现某些特定情况下函数、触发器、存储过程不执行的情况,方便flashback

缺点:binlog文件会更大,不能直接看到用户执行的SQL语句

 

3、基于mixed格式的复制

汇合使用row格式和statement格式,对于DDL记录会statement格式,对于table里的行操作记录为row格式。但是bug较多,不建议使用

 

 

四、MySQL的主从配置

 

1、建立用于同步的账号(权限replication slave)

2、确保server-id全局唯一,并开启log-bin

3、备份主库,恢复到从库,确保主从数据一致

4、查看主库位置信息并配置连接,开启主从

 

Tips:

1、如果库表较多,可以使用percona-tools工具集进行主从校验

2、也可以看slave status输出,了解同步状况

>show slave status\G;关注下面几个信息

Slave_IO_Running:从库I/O线程是否工作

Slave_SQL_Running:从库SQL线程是否工作

Seconds_Behind_Master:同步延迟时间,单位秒

Master_Log_File:主库上的I/O线程目前读到的binlog

Read_Master_Log_Pos:主库上的I/O线程目前读到的binlog的点

Relay_Master_Log_File:从库SQL线程目前执行到的主库binlog

Exec_Master_Log_Pos:从库SQL线程目前执行到的主库binlog的点

Relay_Log_File:从库SQL线程目前执行的relay log

Relay_Log_Pos:从库SQL线程目前执行的relay log的点

 

 

五、MySQL主从复制怎么保证数据一致性

 

在MySQL中,一次事务提交后,需要写undo、写redo、写binlog,写数据文件等等。在这个过程中,可能在某个步骤发生crash,就有可能导致主从数据的不一致。那么如何保证复制数据一致性呢?

1、在master上修改配置,设置双一,保证每次提交后,日志落盘

innodb_flush_log_at_trx_commit = 1

sync_binlog = 1

 

2、在slave上修改配置,前两个选项是确保slave上和复制相关的元数据表也采用innoDB引擎,受到innoDB事务安全的保护,后一个选项是开启relay log自动修复机制,尽可能避免数据丢失

master_info_repository = "TABLE"

relay_log_info_repository = "TABLE"

relay_log_recovery = 1

 

通过以上两个方式基本可以保证主从环境里数据一致性,如果还是出现主从数据不一致,可通过pt-table-checksum 和 pt-table-sync 工具来进行数据的校验和修复。

 

 

六、MySQL主从复制常见问题及处理

MySQL同步中断常见是由两个方面引起:

I/O中断 :网络问题、主机宕机、授权改变

SQL中断:执行的SQL出错

 

1、主从复制过程中,修改用于复制账号的密码,导致主从不同步

原来主从正常运行,后来修改用于复制账号的密码,修改完后重新执行

change master to master_host='xxx.xxx.xxx.xxx', master_user='replication user', master_password='passwd', master_port=xxxx, master_log_file='mysql-binlog.000xxx', master_log_pos=xxx;

悲剧了,如果指定MASTER_HOST与MASTER_PORT参数,slave会认为master与之前的不是同一个(即便MASTER_HOST 与 MASTER_PORT所带的参数与之前相同),之前指定的master的binlog文件名及位置将不再适用。

因此,更新密码后,只需要

change master to master_user='replication user', master_password='new passwd';

 

2、同步延时

seconds_behind_master>0

可能的原因:

l  主库在大量导入数据

l  从库硬件跟不上,导致性能下降

l  从库读负载较大

l  RAID卡充放电

 

3、常见的error code及意义

1062错误:

主键冲突,一般可以跳过此类错误或者在配置文件中设置slave-skip-errors=1062

 

1032错误:

找不到这条记录,可以在从库手动插入数据。或者跳过这个错误,要视情况而定。

 

1050错误:

从库上表存在了,直接删除这个表即可

 

 

参考文档:

FAQ系列 | 如何保证主从复制数据一致性

http://imysql.com/2015/11/20/mysql-faq-how-make-sure-replicate-data-consistant.shtml

 

为了方便大家交流,本人开通了微信公众号,和QQ群291519319。喜欢技术的一起来交流吧

转载于:https://my.oschina.net/u/3023401/blog/805011

相关文章:

  • MySQL数据库中日期中包涵零值的问题
  • 添加第三方源需要执行更新的时候报错,倒入公钥
  • JavaScript总结3
  • 一个绚丽的downloading动效分析与实现!
  • 判断2的幂次方(多种算法)
  • VMware中装Win2012并配置Hyper-v
  • MySQL运维之神奇的参数
  • IOS技能点
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • Linux学习总结(22)——CentOS7.2安装Nginx
  • JS根据经纬度获取地址信息
  • 源码解读之工具--Source Insight
  • 如果就
  • Hydra用户手册
  • ABP学习日记1
  • [Vue CLI 3] 配置解析之 css.extract
  • 08.Android之View事件问题
  • axios 和 cookie 的那些事
  • C# 免费离线人脸识别 2.0 Demo
  • es的写入过程
  • FineReport中如何实现自动滚屏效果
  • javascript 总结(常用工具类的封装)
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Netty源码解析1-Buffer
  • Rancher如何对接Ceph-RBD块存储
  • 大整数乘法-表格法
  • 大主子表关联的性能优化方法
  • 反思总结然后整装待发
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 利用DataURL技术在网页上显示图片
  • 那些被忽略的 JavaScript 数组方法细节
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 使用docker-compose进行多节点部署
  • 无服务器化是企业 IT 架构的未来吗?
  • 移动端 h5开发相关内容总结(三)
  • 1.Ext JS 建立web开发工程
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #include
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • .NET CLR基本术语
  • .net 使用ajax控件后如何调用前端脚本
  • .NET企业级应用架构设计系列之开场白
  • .Net转前端开发-启航篇,如何定制博客园主题
  • /proc/stat文件详解(翻译)
  • @Conditional注解详解
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042