12|分布式系统设计:数据一致性与故障容错的纠葛
郑建勋
你好,我是郑建勋。
前面几节课,我们介绍了微服务为什么是一种自然演进的架构,也讨论了微服务架构伴随而来的问题。
微服务可以分散到多个机器中,它本身是分布式架构的一种特例,所以自然也面临着和分布式架构同样的问题。除了我们之前介绍的可观测性等问题之外,微服务还面临着分布式架构所面临的核心难题:数据一致性和可用性问题。
这节课,我们还是循序渐进地看看,随着系统的发展,为什么必然会面临数据一致性问题,又怎么在实践中解决这类问题。
数据一致性的诞生背景
在微服务架构中,服务一般被细粒度地拆分为无状态的服务。无状态服务(stateless service)指的是当前的请求不依赖其他请求,服务本身不存储任何信息,处理一次请求所需的全部信息要么都包含在这个请求里,要么可以从外部(例如缓存、数据库)获取。这样,每一个服务看起来都是完全相同的。这种设计能够在业务量上涨时快速实现服务水平的扩容,并且非常容易排查问题。然而我们也需要看到,这种无状态的设计其实依托了第三方服务,比较典型的就是数据库。
以关系型数据库 MySQL 为例,在实践中,随着我们业务量的上涨,一般会经历下面几个阶段。
硬件的提升:选择更强的 CPU、更大的内存、更快的存储设备。
设计优化:通过增加缓存层减轻数据库的压力、利用合适的索引设计快速查找数据、使用监控慢查询日志优化不合理的业务 SQL 语句。
服务拆分:拆分后,子系统配置单独的数据库服务器。
分库分表:通过 ID 取余或者一致性哈希策略将请求分摊到不同的数据库和表中。
数据备份:例如,将存储 1 年以上的数据转存到其他数据库中。
主从复制与读写分离:将 Leader 节点数据同步到 Follower 节点中,一般只有一个 Leader 节点可以处理写请求,其余 Follower 节点处理读请求,这样可以提高数据库的并发访问。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了分布式系统设计中的数据一致性和故障容错问题,重点关注微服务架构中的无状态服务和数据库的分布式优化所引发的挑战。文章介绍了分布式系统中的网络延迟、分区、系统故障和时钟不可靠等问题,并探讨了最终一致性和线性一致性的概念,以及CAP定理对一致性、可用性和分区容忍度的影响。强调了在实践中需要在线性一致性和可用性之间进行权衡,并指出了共识算法在保证故障容错性方面的重要性。另外,还介绍了分布式协调服务的使用场景,包括分布式锁、配置管理和服务发现。最后,文章提到了在无信网络中的共识问题,以及比特币系统中使用的PoW算法来解决共识难题。整体而言,本文对分布式系统设计中的关键概念和挑战进行了深入浅出的解释,对于读者快速了解分布式系统设计的数据一致性和故障容错具有重要参考价值。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 进阶 · 分布式爬虫实战》,新⼈⾸单¥68
《Go 进阶 · 分布式爬虫实战》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(4)
- 最新
- 精选
- RealmCassandra如何保证数据最终一致性: 1、逆熵机制(Anti-Entropy) 使用默克尔树(Merkle Tree)来确认多个副本数据一致,对于不一致数据,根据时间戳来获取最新数据。 2、读修复机制(Read Repair) 当Cassandra读数据时,需要根据读一致级别设定读取N个节点的副本数据,并按照时间戳返回最新数据给用户后,会对所有副本数据进行检测和修复,确保所有副本数据一致。 3、提示移交机制(Hinted Handoff) 当Cassandra写数据时,需要根据写一致性级别将数据写入到N个节点数据副本中,只有N个节点写入成功才会给用户返回操作成功,为防止要写入节点宕机导致操作失败,Cassandra采用提示移交机制将操作相关数据写入到随机节点,宕机节点恢复后可根据这些数据进行重放,最终获得数据一致性。 Gossip(闲话)协议会将宕机节点恢复的消息传递给其他节点,并及时进行数据修复。 提示移交机制产生的数据保存在系统表(system.hints)中,默认保存3小时。 4、分布式删除(Distributed Deletes) 由于Cassandra在多个节点上保存数据副本,如果直接对记录进行删除,在所有副本数据完全删除前,多个节点间数据不一致且无法按照时间戳判断该记录需要被修复还是被删除。Cassandra采用分布式删除机制,在删除记录时插入一条关于该记录的墓碑(tombstone),墓碑中包含接受客户端请求的存储节点执行请求的时间(Local delete time),通过墓碑来标识该记录已被删除。 Cassandra中压缩过程中实现垃圾回收机制,清理这些被墓碑标记的记录,以释放这些记录占用空间。 以上从网上查阅的资料,感觉对“时间戳”依赖很高,如何保障不同节点上事件的时间戳一定是准确的?
作者回复: 绝对的unix时间戳是无法保证准确的,但是逻辑时钟是可以保证准确的,再想一想呢
2022-11-05归属地:北京25 - 一打七老师说分区容忍度,指能够容忍任意数量的消息丢失。但是大部分说法是由于网络不稳定,可以容忍网络分区。这两种说法区别还是挺大的,希望老师能解惑一下,谢谢2022-11-09归属地:北京2
- 那时刻请问老师,文中提到,不可靠的时钟:这意味着我们无法依靠绝对的时钟来确定操作的顺序。 如何来解决这个问题呢?使用相对时钟么?2022-11-18归属地:北京1
- Geek_2c2c44贴一段IBM对partition tolerance的解释, 我觉的可能会更准确一点: A partition is a communications break within a distributed system—a lost or temporarily delayed connection between two nodes. Partition tolerance means that the cluster must continue to work despite any number of communication breakdowns between nodes in the system.2024-01-09归属地:浙江
收起评论