热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

后端分布式系列:分布式存储-MySQL数据库事务与复制_MySQL

好久没有写技术文章了,因为一直在思考「后端分布式」这个系列到底怎么写才合适。最近基本想清楚了,「后端分布式」包括「分布式存储」和「分布式计算」两大类。结合实际工作中碰到的问题,以寻找答案的
\

好久没有写技术文章了,因为一直在思考 「后端分布式」这个系列到底怎么写才合适。最近基本想清楚了,「后端分布式」包括「分布式存储」和 「分布式计算」两大类。结合实际工作中碰到的问题,以寻找答案的方式来剖解技术,很多时候我们都不是在创造新技术,而是在应用技术。为了更有效率与效果的用好技术,我们需要了解一些技术的原理与工作方式。带着问题从使用者的角度去剖析技术原理,并将开源技术产品和框架作为一类技术的参考实现来讲解。以讲清原理为主要目的,对于具体实现的技术细节若无特别之处则尽可能点到即止。

事务与复制

近期参与了一个数据分布化相关的项目,涉及到数据库 MySQL 的数据分布化。简单来说就是需要在异地数据中心实现多点可写并保证分布后的数据能达成最终一致性。以前对 MySQL 作数据分布仅仅是读写分离,通过数据库自身的主从复制即可实现写主库、读从库。现在则需要双写主库并在经历一个短暂的延时后达成最终一致性,这个问题乍一想比较复杂,但归根结底还是数据最终一致性的问题。

先回到最简单的情况,只有一个 MySQL 数据库时,数据一致性是怎么保证的?了解数据库的都知道,这是通过数据库的事务特性来保证的,事务包括四大特性:

Atomicity 原子性 Consistency 一致性 Isolation 隔离性 Durability 持久性

事务的 ACID 四大特性不是本文重点,就不展开做学术性解说了,不了解的可以在后面参考文献里[3]去看相关文章。这里只想提一个问题,单一数据库事务能保证数据的一致性,那么 MySQL 在部署成主从架构时,如何保证主从之间数据的一致性的?

MySQL 为了提供主从复制功能引入了一个新的日志文件叫 binlog,它包含了引发数据变更的事件日志集合。从库请求主库发送 binlog 并通过日志事件还原数据写入从库,所以从库的数据来源为 binlog。这样 MySQL 主库只需做到 binlog 与本地数据一致就可以保证主从库数据一致(暂且忽略网络传输引发的主从不一致)。我们知道保证本地数据一致性是靠数据库事务特性来达成的,而数据库事务是如何实现的呢?先看下面这张图:

\vcrHu/nT2iByZWRvIGxvZyC6zSB1bmRvIGxvZ6GjvPK1pcC0y7WjrHJlZG8gbG9nILzHwrzKws7x0N64xLrztcTK/b7dLCB1bmRvIGxvZyC8x8K8ysLO8cewtcTUrcq8yv2+3aGjy/nS1LWx0ru49srCzvHWtNDQyrHKtbzKt6LJ+rn9s8y88ruvw+jK9sjnz8KjujwvcD4NCs/IvMfCvCB1bmRvL3JlZG8gbG9no6zIt7GjyNXWvsuitb20xcXMyc+z1r7DtOa0oqGjILj80MLK/b7dvMfCvKOsu7q05rLZ1/eyotLssr3LosXMoaMgzOG9u8rCzvGjrNTaIHJlZG8gbG9nINbQ0LTI6yBjb21taXQgvMfCvKGjDQo8cD7U2iBNeVNRTCDWtNDQysLO8bn9s8zW0MjnufvS8rnK1c/W0LbPo6y/ydLUzai5/SByZWRvIGxvZyDAtNbY1/bKws7xu/LNqLn9IHVuZG8gbG9nIMC0u9i59qOsyLexo8HLyv2+3bXE0rvWwtDUoaPV4tCptrzKx9PJysLO8dDUtOa0otL9x+bAtM3qs8m1xKOstasgYmlubG9nILK71NrKws7xtOa0otL9x+a3ts6nxNqjrLb4ysfTySBNeVNRTCBTZXJ2ZXIgwLS8x8K8tcSho8THw7S+zbHY0Ouxo9akIGJpbmxvZyDK/b7dus0gcmVkbyBsb2cg1q685LXE0rvWwtDUo6zL+dLUv6rG9MHLIGJpbmxvZyC688q1vMq1xMrCzvHWtNDQvs224MHL0ruyvaOsyOfPwqO6PC9wPg0Kz8i8x8K8IHVuZG8vcmVkbyBsb2ejrMi3saPI1da+y6K1vbTFxczJz7PWvsO05rSioaMguPzQwsr9vt28x8K8o6y7urTmstnX97Ki0uyyvcuixcyhoyC9q8rCzvHI1da+s9a+w7uvtb0gYmlubG9noaMgzOG9u8rCzvGjrNTaIHJlZG8gbG9nINbQ0LTI68zhvbu8x8K8oaMNCjxwPtXi0fm1xLuwo6zWu9KqIGJpbmxvZyDDu9C0s8m5pqOs1fu49srCzvHKx9Do0qq72Ln2tcSjrLb4IGJpbmxvZyDQtLPJuaa687y0yrkgTXlTUUwgQ3Jhc2ggwcu2vL/J0tS71ri0ysLO8bKizeqzyczhvbuho9Kq1/a1vdXiteOjrL7N0OjSqrDRIGJpbmxvZyC6zcrCzvG52MGqxvDAtKOstvjWu9PQsaPWpMHLIGJpbmxvZyC6zcrCzvHK/b7dtcTSu9bC0NSjrLLFxNyxo9ak1ve008r9vt21xNK71sLQ1KGjy/nS1CBiaW5sb2cgtcTQtMjruf2zzLK7tcOyu8e2yOu1vbS/tOK1xMrCzvG05rSi0v3H5ta00NC5/bPM1tCjrLKi0tTE2rK/t9ayvMq9ysLO8aOoeGEgysLO8aOptcS3vcq9zeqzycG9vde2zszhvbuho7340ruyvbXEz7i92r7NsrvVub+qwcujrL/J0tSyzr+0uvPD5rLOv7zOxM/XWzVdoaM8L3A+DQo8aDIgaWQ9"总结">总结

我们前面先提出了一个问题,然后从数据一致性的角度去思考,参考了 MySQL 的实现方式。理清并分析了 MySQL 单机环境是如何保证复制机制的数据一致性,也就是 binlog 和事务数据的一致。后面我们才能基于 binlog 这个机制去实现复制并保证主从复制的一致性。主从复制又引入了网络因素,进一步增加了保证主从数据一致性的复杂度,后面还会撰文进一步分析这个问题。

推荐阅读
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 数据库(外键及其约束理解)(https:www.cnblogs.comchenxiaoheip6909318.html)My ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
author-avatar
无淚丑尜鸭
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有