为什么构建大型分布式存储系统很难
- 需要高性能。解决方案 sharding,把完整的任务通过 sharding 分给多台服务器去做。
- 故障。 多台服务器会导致系统故障变得很频繁,解决方案 容错
- 容错。 要保证容错,一个解决方案就是多做几个备份
- 备份。 如果有了多个副本,就会遇到各种奇怪的不一致问题
- 一致性。 要保证数据的一致性,就会导致性能会变低
复制系统主要有两种实现:
- 状态转移:主定期把自己内存的状态同步给备。状态转移在处理多核问题时更为高效。
- 复制状态机:主和备之需要处理来自 client 的操作,比如 add 1.
对于复制状态机来说,我们必须要问的一个问题就是该去复制什么状态?它的答案是复制所有状态。
大多数团队做的复制是应用程序级别的复制,复制的功能实现在应用程序内部。还有一种复制是机器级别的复制,它不需要考虑上面运行的是什么软件,但它相对低效。
一个完整的消息传播流程应该是:数据输入 - 数据包 - 数据 + 网卡中断 - 接收数据。虽然主备都是执行 client 的消息,但是主备同步的时候总会有些非确定性事件,比如下面的场景
- 指令执行不一样:例如随机数生成。
- 多核并行:多核也是非确定性的一个来源。master 上 core 1 比 core2 先拿到锁,slave 上刚好相反,可能结果就会不同。
Last modified on 2026-02-15