分布式系统
一个系统如果说是分布式系统,意味着:
1. 运行在多个服务器上面;
2. 它们需要同步数据,因此是有状态的;
分布式系统同步数据需要面临的问题:
1. 系统本身的不可靠性,比如宕机、磁盘损坏等;
2. 网络的不可靠;
解决模式
针对上面的问题,有固定的解决思路。
1. 进程crash
进程可能在任何时间,因为软件或者硬件的原因奔溃,比如:
(1)运维正部署过程的正常启停
(2) IO 操作时,由于磁盘已满未正常处理异常,导致进程被 killed
对于进程crash,你需要保证已经回复确认成功的 client 你需要保证数据成功持久化,这就要求同步持久化。
实际上很多系统在设计的时候并不会保证每一次插入或更新都会被立即保存到磁盘,因为 IO 是非常耗时的操作,通常都会有一个 in-memory 的结构,用来保存用户的操作,然后周期性地进行刷盘。这就带来一个问题,如果进程突然 crash,就会丢失上次刷盘后到当前时间的数据。
=> write-ahead log
为了解决这个问题,引入了 “预写日志”, “write-ahead log”,,服务器将每一个写操作的命令都保存到一个追加文件里。文件追加操作时顺序写,通常会比较快,没有性能影响,服务器恢复后可以重放日志,恢复数据。
但是,服务器恢复之前是无法继续为客户端提供服务的,因此就引入多节点部