文章插图
作者 | Jaana Dogan,谷歌软件工程师
译者 | 弯月,责编 | 夕颜
出品 | CSDN(ID:CSDNnews)
大多数计算机系统都有某种需要保存到存储系统的状态 。多年来我积累了许多数据库知识,大多都是从导致数据丢失和网站下线的设计错误中吸取的教训 。在以数据为主的系统中,数据库是整个系统设计的核心,也是需要权衡的重点 。尽管数据库的工作原理不可忽视,但许多应用程序开发者看到的、经历过的问题依然仅仅是冰山一角 。在这篇文章中,我想分享一些我认为特别有用的知识 。
1 99.999%的情况下网络耗时不是问题,只不过是运气好人们经常说如今的网络很稳定,也有人争论许多系统宕机都是因为网络故障 。现在这方面的研究很有限,而且多数研究都集中在拥有独立网络、专用硬件和配备了专人负责的大型组织中 。
google的Spanner(Google的分布式数据库)实现了99.999%的服务在线,他们的研究表明,仅有7.6%的问题是由网络导致的,尽管他们将高可用性归功于专用的网络 。2014年Bailis和Kingsbury的调查(https://cacm.acm.org/magazines/2014/9/177925-the-network-is-reliable/fulltext)挑战了1994年Peter Deutsh发表的“分布式计算的陷阱”(https://en.wikipedia.org/wiki/Fallacies_of_distributed_computing) 。网络真的可靠吗?
除了这些巨头之外,互联网上并没有太完整的调查 。大型供应商也没有提供足够的有关客户网络故障的数据 。云提供商的网络导致的故障同样会导致部分互联网宕机数个小时,但这也仅仅是一小部分许多人能注意到的故障而已 。有时候,许多我们不得而知的网络宕机也会造成巨大影响 。云服务的客户也不一定能够注意到自己遇到的问题 。当网络宕机时,客户并不能确定故障是由供应商的网络故障导致的 。对于他们而言,第三方服务就是黑盒子 。只有那些供应商自己才能估计出影响的范围 。
与那些大企业的系统相比,如果你的系统中网络问题导致的宕机只占很小比例,那么只能说你的运气好 。网络依然会受到各种传统问题的影响,如硬件故障、拓扑变化、管理配置改变,以及断电等 。但我最近听说,鲨鱼也会导致网络故障(https://twitter.com/rakyll/status/1249891472993693696) 。
ACID有很多含义ACID指原子性、一致性、孤立性和持久性 。这些是数据库事务需要保证的几项特性,只有保障这几项特性才能在崩溃、错误、硬件故障等极端情况下保证数据的有效性 。没有ACID或类似的保障,应用程序开发者就不能判断哪些应该由数据库负责,哪些应该由开发者自己负责 。绝大多数关系型事务数据库都试图遵循ACID,但新的标准(如NoSQL)催生了一大批不保证ACID的数据库,因为ACID的实现代价相当大 。
我刚刚入行时,曾经和技术领导争论过ACID是否已经过时 。可以说,ACID只是一个松散的描述,而不是严格的实现标准 。如今,我认为ACID非常有用,因为它提供了一大类的问题(以及一大类可能的解决方案) 。
并非每个数据库都支持ACID,即使是实现了ACID的数据库,对于ACID的解读也不尽相同 。其原因之一就是实现ACID需要做出的妥协非常多 。数据库通常声称自己符合ACID,但在某些极端情况下依然会有不同的解释,或者它们对于那些“不太可能发生”的情况的处理方法也不一样 。开发者至少可以在较高层次上理解数据库的实现方式,理解它们何时会出现问题,以及设计上的取舍 。
最有争议的莫过于MongoDB的ACID实现(即使在第四版发行后该争论依然存在 。)MongoDB很长时间都不支持日志,尽管它每隔60秒(甚至更长)才会向磁盘保存一次数据 。考虑如下情况:应用程序发出了两个写请求(w1和w2) 。Mongo能将第一个写请求持久化,但w2的持久化会因为硬件故障而失败 。
文章插图
该图演示了MongoDB在写入磁盘之前失败时的数据情况 。
将数据提交到磁盘是一项昂贵的操作,避免提交能够以牺牲持久性的代价换来性能的提升 。今天,MongoDB已经支持日志,但脏写操作依然可能会影响数据的持久性,因为默认情况下MongoDB每隔100毫秒提交一次数据 。因此,即使有日志支持,类似的情况依然可能发生,尽管发生故障时导致的变化丢失会少很多 。
3每个数据库的一致性和隔离性的能力都不同在ACID属性中,一致性和隔离性在不同实现之间最大的区别,因为实现上的妥协更多 。一致性和隔离性都是非常昂贵的功能 。两者都要求协调,为了保证数据一致性,这两者都会导致竞争的发生 。当需要在多个数据中心水平扩展时(特别是跨越不同地理区域的多个数据中心时),该问题就愈发严重 。关于这个现象更一般的解释参见CAP理论 。值得指出的是,应用程序能够处理一部分不一致性的问题,有经验的程序员也可以添加额外的逻辑,因此不必完全依赖数据库 。
推荐阅读
- 使用sublime打造一个终极版的Python开发编辑环境
- Android开发者必知的内存、性能优化细节
- linux服务器开发中网络数据分析与故障排查
- 北京企业退休人员死亡有多少钱?
- app开发完成后为什么需要进行ios签名内测?
- 苹果企业开发者账号卖多少钱
- 程序员和开发者,细品之下见差别
- 怎样避免ios开发者账号封禁问题
- 优秀的后端应该有哪些开发习惯?
- 前端开发用什么工具?前端开发需要哪些软件