MySQL作为当前最流行的关系型数据库,在各个行业的系统中扮演着最重要的角色。随着大家对数据价值认可的逐步加深,数据的可靠性是最常被问到的一个问题。MySQL是如何保证数据可靠性的?京东智联云RDS-MySQL又做了哪些优化和新特性来保证用户数据的可靠性和一致性?本篇文章将为大家一一揭秘。

MySQL的Innodb存储引擎支持ACID(原子性Atomicity,一致性Consistency,隔离性Isolation,持久性Durability)特性,正是因为保证了一致性和持久性,所以数据才是可靠的。很多关系型数据库为保障数据库的可靠性,同时最大限度地提升性能,采用了预写日志(Write-Ahead Logging)的方法,MySQL也不例外。它将数据变化先写入日志,然后立刻返回给客户端更新成功,真正的数据再异步更新到磁盘的数据文件。如果中间系统发生故障,只要日志在数据就不会丢失,这就保证了数据的可靠性。

MySQL写入的日志就是binlog和redo log文件,下面我们来介绍下两种日志的写入流程。

事务执行过程中,MySQL会将所有变更记录到binlog cache中,在事务commit的时候一起写入binlog文件中。

binlog cache是由参数binlog_cache_size控制,默认32KB,如果事务很大,变更内容超过了binlog cache,则会写到磁盘中。通过命令show global status like 'Binlog_cache_disk_use';可以查看binlog cache写入磁盘的次数,如果数量过多,建议调大binlog_cache_size参数值。

每个线程都会分配binlog cache,但是都共用一份binlog文件。流程图如下:

在写入到系统的日志文件中有两个步骤,write和fsync。wirte是写入操作系统的缓存,fsync是持久化到磁盘文件,这个操作会占用系统的IOPS,而它们操作的时机是通过参数sync_binlog控制。sync_binlog=0,事务提交时,只做write操作,由操作系统自己控制fsync操作。这个是最危险的,一旦操作系统宕机,binlog cache中的变更内容全部会丢失。

sync_binlog=1,事务提交时,都会做write和fsync操作。安全性最高,但是性能损耗也是最大的。

sync_binlog=N,事务提交时,会做write操作,累积N个事务时做fsync操作。一旦操作系统宕机,会丢失binlog cache中部分变更内容。

事务执行过程中,也是先写入内存redo log buffer中,然后再写入到磁盘文件。其中redo log buffer是所有线程共用的。与binlog写到文件一样,写redo log也有write和fsync两个操作,它们操作的实际是通过参数innodb_flush_log_at_trx_commit控制。nnodb_flush_log_at_trx_commit=0,事务提交时,只将变更内容写到redo log buffer,由后台Master线程每秒write和fsync到磁盘文件。

innodb_flush_log_at_trx_commit=1,事务提交时,执行write和fsync操作。这是最安全的配置。

innodb_flush_log_at_trx_commit=2,事务提交时,只执行write操作,即只写到操作系统的缓存中,由后台Master线程每秒fsync到磁盘文件。

关于这个参数与数据可靠性之间的关系如下表所示:

参数sync_binlog=1与innodb_flush_log_at_trx_commit=1就是DBA常说的“双1”配置,也是线上环境数据最安全最可靠的配置。

再对比下binlog和redo log的不同之处:

binlogredo log

记录者MySQL serverInnodb引擎

记录时间事务commit的时候多种条件触发,随时记录

记录内容逻辑日志row格式或者statement格式物理日志数据页的变化,幂等的

binlogredo log

记录者MySQL serverInnodb引擎

记录时间事务commit的时候多种条件触发,随时记录

记录内容逻辑日志row格式或者statement格式物理日志数据页的变化,幂等的

binlog和redo log是如何配合起到数据可靠性的作用呢,就不得不提到两阶段提交。它可以保证binlog和redo log的数据一致性。下图是事务提交时两个日志的记录流程:

如果在此过程中出现系统异常,每个状态下都是可以保证数据一致性的。

le data-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">

innodb_suport_xa参数,这个参数控制是否打开两段式提交。默认开启,如果关闭了,事务则会以不同顺序的方式写入binlog。如果宕机恢复、xtarbackup恢复,都是会有数据不一致的风险。这个参数在MySQL5.7.10后就废弃了,必须开启。

MySQL发展到现在,集群也从主备异步复制、半同步复制、group replication不断发展和演变。但是它们的核心基础都是binlog,可以说MySQL的数据复制都依赖于它,而集群间的数据一致性更是与binlog有关。主要有两个点需要特别注意。

1. binlog的格式。statement、row和mixed。statement格式直接将SQL语句记录在binlog文件中,因为主从库是两个独立的服务,运行环境完全不同,所以会出现不一致的风险,比如执行delete from t limit 100。所以线上环境建议使用row格式。

2. 数据延迟。当从库出现延迟,会造成集群数据不一致。从库延迟的原因很多,这里列举以下几个线上经常出现的延迟原因:

a)大事务。binlog只有在事务commit时才会记录到文件,然后从库才能读取到数据变更,所以当有大事务的时候,主库提交后从库才开始执行。

b)大并发。5.6和5.7版本都支持并行复制,但是并行度有限,当主库并发较高时,从库会出现延迟。

c)表结构。主库表没有主键,binlog是row格式的,主库执大量行数的更新SQL时,从库会执行多次全表扫描,造成延迟。

d)等待锁。从库一般会承担备份功能,使用xtrabackup进行备份会执行FLUSH NO_WRITE_TO_BINLOG TABLES和FLUSH TABLES WITH READ LOCK操作,在特殊情况下,这两个操作会堵塞复制的SQL线程,造成延迟。

京东智联云RDS-MySQL集群使用主从复制架构,为了保证用户存储数据可靠性和安全性,我们对关键流程做了一系列优化和改善工作。以用户数据安全为己任,以用户体验为中心。

1. 物理环境硬件,采用高性能的NVME硬盘,最新型号物理机配置。

网络,跨AZ机器的网络延迟在1.2ms以内,配置万兆网卡。

2. 软件环境数据面,参考京东高并发、高可靠的业务系统优化经验,京东智联云对RDS操作系统配置、MySQL参数配置做了一些列优化,保证数据库集群数据的可靠性。

控制面,针对集群的延迟,有多组延迟监控、报警;针对不同延迟原因,会触发不同的优化逻辑,自动降低延迟。

当物理机出现问题或者做数据迁移时,都会涉及MySQL集群的高可用操作,因为MySQL集群的复制特点,有可能会出现数据丢失的情况。京东智联云RDS-MySQL在切换时是要保证用户数据一致性优先的,在判断集群数据完全可靠的情况下,再做切换操作,保证用户的数据不丢失,不写花。

MySQL高可用切换流程的复杂性,不在切换的过程,而是触发切换条件的判断,下面介绍下RDS-MySQL自动高可用切换的判断流程。哨兵服务检查数据库和操作系统状态,发现实例服务异常,则触发多组哨兵服务的数据库服务检查和投票机制,确认服务真实不可用再进行切换流程。

主库实时上报GTID信息,如果发生自动高可用,即主库服务不可用时,首先会对比从库的Retrieved_Gtid_Set值,确保从库的IO thread已经拉取了主库全部的binlog内容。

然后再对比从库的Retrieved_Gtid_Set和Executed_Gtid_Set范围值,保证从库拉取的binlog全部应用完成。

高可用流程切换完成后,会对集群数据做一致性校验,并触发建立新从库的流程。

数据库备份是数据安全的最重要屏障,当出现极端情况下,集群所有节点的数据都不可用,就需要依赖备份保证数据的可靠性和安全性。我们对RDS-MySQL的备份、恢复流程做了一系列优化,保证用户系统在灾备时恢复时间尽量短,恢复数据尽可能最新。每日全量备份,实时binlog备份;

所有备份上传到对象存储,多备份保存,多区域存放;

定期做备份数据的有效性验证;

高可用、扩容、删除等重要流程强制做数据库的数据备份;

支持软删除功能,单库表恢复功能。

京东智联云RDS-MySQL的用户在使用过程中,出现过很多数据可靠性相关的案例,下面举一些典型案例来分享:

问题由于用户并发较大,集群从库出现延迟。

发现从库对于用户是不可见的,所以从库延迟用户是无需感知的。通过后台的监控系统,触发从库延迟报警,运维人员才发现这个问题。

解决后台任务会扫描所有报警信息,当扫描到延迟报警后,会结合该实例的其他信息定位故障原因,然后自动调整集群数据库配置,达到降低延迟的目的。延迟报警解除后,恢复集群配置。

意义RDS-MySQL部分报警已经实现了“负载异常检测”、“自动诊断”、“线上配置优化”、“优化效果跟踪”的闭环处理。可帮助用户快速、安全、准确地处理集群数据安全隐患。

问题由于用户并发较大,集群从库出现延迟。

发现从库对于用户是不可见的,所以从库延迟用户是无需感知的。通过后台的监控系统,触发从库延迟报警,运维人员才发现这个问题。

解决后台任务会扫描所有报警信息,当扫描到延迟报警后,会结合该实例的其他信息定位故障原因,然后自动调整集群数据库配置,达到降低延迟的目的。延迟报警解除后,恢复集群配置。

意义RDS-MySQL部分报警已经实现了“负载异常检测”、“自动诊断”、“线上配置优化”、“优化效果跟踪”的闭环处理。可帮助用户快速、安全、准确地处理集群数据安全隐患。

问题由于用户并发较大,集群从库出现延迟。

发现从库对于用户是不可见的,所以从库延迟用户是无需感知的。通过后台的监控系统,触发从库延迟报警,运维人员才发现这个问题。

解决后台任务会扫描所有报警信息,当扫描到延迟报警后,会结合该实例的其他信息定位故障原因,然后自动调整集群数据库配置,达到降低延迟的目的。延迟报警解除后,恢复集群配置。

意义RDS-MySQL部分报警已经实现了“负载异常检测”、“自动诊断”、“线上配置优化”、“优化效果跟踪”的闭环处理。可帮助用户快速、安全、准确地处理集群数据安全隐患。

问题用户因为人为误操作,导致删除了线上系统的部分数据。

发现用户提工单,想快速恢复删除表的数据到指定时间点。

解决控制台提供单库、单表按时间点快速恢复的功能。技术服务人员直接反馈给用户该功能的使用文档。用户通过自助操作,完成对删除数据的恢复操作。

意义RDS-MySQL将备份和恢复功能用到极致,两类备份方式对应多种恢复流程,方便用户快速、安全地实现恢复数据库需求。RDS-MySQL恢复流程支持:1. 根据时间点创建2. 根据时间点单库、单表本地恢复3. 根据备份创建和本地覆盖恢复

问题用户因为人为误操作,导致删除了线上系统的部分数据。

发现用户提工单,想快速恢复删除表的数据到指定时间点。

解决控制台提供单库、单表按时间点快速恢复的功能。技术服务人员直接反馈给用户该功能的使用文档。用户通过自助操作,完成对删除数据的恢复操作。

意义RDS-MySQL将备份和恢复功能用到极致,两类备份方式对应多种恢复流程,方便用户快速、安全地实现恢复数据库需求。RDS-MySQL恢复流程支持:1. 根据时间点创建2. 根据时间点单库、单表本地恢复3. 根据备份创建和本地覆盖恢复

问题用户因为人为误操作,导致删除了线上系统的部分数据。

发现用户提工单,想快速恢复删除表的数据到指定时间点。

解决控制台提供单库、单表按时间点快速恢复的功能。技术服务人员直接反馈给用户该功能的使用文档。用户通过自助操作,完成对删除数据的恢复操作。

意义RDS-MySQL将备份和恢复功能用到极致,两类备份方式对应多种恢复流程,方便用户快速、安全地实现恢复数据库需求。RDS-MySQL恢复流程支持:1. 根据时间点创建2. 根据时间点单库、单表本地恢复3. 根据备份创建和本地覆盖恢复

问题用户因为人为误操作,导致删除了线上系统的部分数据。

发现用户提工单,想快速恢复删除表的数据到指定时间点。

解决控制台提供单库、单表按时间点快速恢复的功能。技术服务人员直接反馈给用户该功能的使用文档。用户通过自助操作,完成对删除数据的恢复操作。

意义RDS-MySQL将备份和恢复功能用到极致,两类备份方式对应多种恢复流程,方便用户快速、安全地实现恢复数据库需求。RDS-MySQL恢复流程支持:1. 根据时间点创建2. 根据时间点单库、单表本地恢复3. 根据备份创建和本地覆盖恢复

问题用户因为人为误操作,导致删除了线上系统的部分数据。

发现用户提工单,想快速恢复删除表的数据到指定时间点。

解决控制台提供单库、单表按时间点快速恢复的功能。技术服务人员直接反馈给用户该功能的使用文档。用户通过自助操作,完成对删除数据的恢复操作。

意义RDS-MySQL将备份和恢复功能用到极致,两类备份方式对应多种恢复流程,方便用户快速、安全地实现恢复数据库需求。RDS-MySQL恢复流程支持:1. 根据时间点创建2. 根据时间点单库、单表本地恢复3. 根据备份创建和本地覆盖恢复

后台数据到mysql怎样保持实时更新_京东智联云MySQL数据库如何保障数据的可靠性?...相关推荐

  1. 后端传输大量log数据_京东智联云MySQL读写分离最佳实践 ,轻松搞定数据库高性能扩展...

    数字化时代,数据库对任何企业而言都是其应用的核心资源.MySQL作为当前最流行的关系型数据库,虽然是开源软件,但是其简单易懂.易于部署管理,且具有ACID特性.强大的SQL查询等特点,被各种业务系统作 ...

  2. binlog数据库不写入binlog_京东智联云MySQL数据库如何保障数据的可靠性?

    MySQL作为当前最流行的关系型数据库,在各个行业的系统中扮演着最重要的角色.随着大家对数据价值认可的逐步加深,数据的可靠性是最常被问到的一个问题.MySQL是如何保证数据可靠性的?京东智联云RDS- ...

  3. 京东智联云MySQL读写分离最佳实践 ,轻松搞定数据库高性能扩展

    云妹导读: 互联网公司业务往往都有着高并发.大数据量等特点,为了在激烈的市场竞争中占得先机,需要不断推陈出新,并做大量的促销运营活动.但由于互联网的特殊性,企业无法提前预判这些活动给技术架构带来的压力 ...

  4. mysql基于binlog增量更新_一个应用它提取MySQL binlog,解析binlog并将增量更新数据推送到不同的接收器...

    DolphinBeat Other languages: 中文 This is a high available server that pulls MySQL binlog, parses binl ...

  5. 2021阿里云开发者大会|【云原生数据库:一站式数据服务】分论坛即将开启

    简介:我们也诚邀您莅临[云原生数据库:一站式数据服务]分论坛与大家一起探讨云原生数据库的前沿技术与应用场景的最佳实践 2021阿里云开发者大会将于5月29日正式开启 阿里云资深技术专家.行业大咖 以及 ...

  6. 后台数据到mysql怎样保持实时更新_MySQL是如何保证数据的完整性

    数据的一致性和完整性对于在线业务的重要性不言而喻,如何保证数据不丢呢?今天我们就探讨下关于数据的完整性和强一致性,MySQL做了哪些改进. 一. MySQL的二阶段提交 在Oracle和MySQL这种 ...

  7. 怎么使用 JavaScript 将网站后台(后端)的数据变化(图片)实时更新到前端?

    引用文章:怎么使用 JavaScript 将网站后台的数据变化实时更新到前端? - 李宏训的回答 - 知乎

  8. php更新用户数据为空,php – Instagram实时更新标签 – 获取空数据,为什么?

    Heloo, 我正在开发一个项目,我需要从Instagram获得某些标签的实时更新. 这是我创建订阅的代码 $client_id = 'MOJID'; $client_secret = 'MOJIDS ...

  9. datagridview实时更新数据_旭诺云盒|智能办公新趋势进出口数据自动提取,通关状态实时更新...

    春节期间,很多公司同事都被滞留在老家无法返回公司上班,为了保证公司业务正常运转,同事之间依靠邮件.微信.QQ等工具进行文件和数据的传递,增加了很多数据整理时间.且电子口岸.单一窗口这些进出口企业频繁使 ...

最新文章

  1. python抓包工具_「docker实战篇」python的docker爬虫技术-fiddler抓包软件详细配置(七)...
  2. UCZProgressView CALayer旋转
  3. python怎么建文件dome_Python专题(四) 如何制作一个demo给老板看
  4. ubuntu系统使用Anaconda安装tensorflow-gpu环境
  5. 翻转链表python递归_Python实现链表反转的方法【迭代法与递归法】
  6. 从全职高手开始的系统_全职高手8年登上巅峰荣耀,阅文做对了什么?
  7. 遍历系统进程和对应模块以及创建进程
  8. 下载centos(阿里云)
  9. 分布估计算法(Estimation of Distribution Algorithm)
  10. JAVA环境变量配置方法(Windows)
  11. Qt安装与使用(小白专用教程)
  12. 测试用例设计——正交实验法
  13. iOS之Apple ID双重认证与两步验证的区别
  14. 现代电子计算机数学理论基础,知到食品营养学(暨南大学)2020网课答案
  15. 记录踩过的坑-WPS文字
  16. C语言初学者需要知道的十句话,听说不知道的人都没学好编程
  17. php大华视频监控接入,大华摄像头实时视频接入Demo
  18. 怎么在html中创建单选按钮?
  19. 股价狂跌超70%,特斯拉到底怎么了?
  20. 美国FBA海运专线有哪些优势?

热门文章

  1. 4道关于Python函数的练习题
  2. Python中sorted函数的用法
  3. python函数加括号于不加括号的区别
  4. tensorflow tf.enable_eager_execution()(立即执行操作,不添加到稍后在“ tf.Session”中执行的图)
  5. linux——延时任务与定时任务
  6. 计算机组成原理(哈工大刘宏伟)
  7. 利用NavicatPremium把Oracle迁移到MySQL
  8. java zmq订阅_从ZMQ PUB套接字获取订户过滤器
  9. ios11更新提示信任_iOS13.6.1正式版更新,主要修复两大问题
  10. SpringBoot笔记:SpringBoot2.3集成SpringSession+nginx+redis实现session共享