在用到数据库的时候,很少有人怀疑数据的一致性,更多的是怀疑性能(为此经常在数据库上面加一层缓存)。对数据库的实现比较好奇,所以最近刷了本书:
看完后之前模糊的地方清晰了一些。
为了让数据持久化下来,需要将写操作落到磁盘,这样做到数据准确比较简单,但是性能会非常差:
写内存是最快的,但一断电就悲剧了(先忽略带电池的内存),那还得写磁盘。不过现在不是去更新数据,而是顺序地记日志,只要把信息记录下来就可以恢复数据:
+-------------+ | WRITE | +------+------+ | +-------------+--------------+ | | +------+------+ +------+------+ | CACHE | | LOG | +-------------+ +-------------+
断电重新开机之后,根据日志里面记录的操作再来一遍就可以把数据还原到内存,恢复完成后继续提供服务。刚才的问题解决了,但是缺点也很明显:
后台线程在脏页太多、关机、定时触发(等)时把CACHE中的脏页刷到磁盘上,刷完之后就形成一个版本(在InnoDB中有LSN来标记版本号),该版本之前的日志已经不再需要了,这就是checkpoint技术。