所以,您的数据不是很耐用...
在第1部分中,我使用gRPC和Go编写了一个非常简单的服务器,该服务器用于服务Get和Put请求内存中的映射。如果服务器退出,它将丢失所有数据,对于数据库,我必须承认这是非常糟糕的。
我实现了预写日志记录,允许在服务器重新启动时恢复内存中状态。尽管这个想法真的很简单,但实现起来却是很困难的!最后,我看了 LevelDB , Cassandra 和 etcd 如何解决此问题。
预写日志
预写日志(WAL)是数据库系统中一种常用的技术,用于保证写操作的原子性和持久性。WAL背后的关键思想是,在我们对数据库状态进行任何实际修改之前,我们必须首先记录我们希望是原子性的和持久存储(例如磁盘)的完整操作集。
通过在将更改应用于例如内存中表示之前,先将预期的改变写入WAL来提供持久性。通过首先写入WAL,如果数据库之后崩溃,我们将能够恢复改变并在必要时重新应用。
原子性更加微妙。假设一个改变需要改变A,B而C发生,但是我们的应用没有办法一下应用所有的改变。我们可以先记日志
intending to apply A
intending to apply B
intending to apply C
复制代码
然后才开始制作实际的应用程序。如果服务器中途崩溃,我们可以查看日志并查看可能需要重做的操作。
在DDB中,WAL是记录 append-only 的文件:
record:
length: uint32 // length of data section
checksum: uint32 // CRC32 chec