ZooKeeper-9.6 本地存储- 高飞网

9.6 本地存储

2018-06-12 18:37:37.0

    之前提过事务日志和快照,SyncRequestProcessor处理器就是用于在处理提议时写入这些日志和快照。

9.6.1 日志和磁盘的使用

    服务器通过事务日志来持久化事务。在接收一个提议时,一个服务器(追随者或群首服务器)就会将提议的事务持久化到事务日志中,该日志保存在服务器的本地磁盘中,而事务将会按照顺序追加其后。服务器会时不时的滚动日志。

    写日志是写请求的关键一步,因此ZooKeeper必须有效(快速)地处理写日志问题。可以通过组提交和补白来提高效率。组提交是指在一次磁盘操作写入多个事务,这将合持久化多个事务只需要一次磁道寻址的开销。

    注意:磁盘写缓存   

    服务器只有在强制将事务写入事务日志之后才确认对应的提议。更准确一点,服务器调用ZKDatabase的commit方法,这个方法最终会调用FileChannel.force。这样,服务器保证在确认事务之前已经将它持久化到磁盘中。不过注意一点,现代的磁盘一般有一个缓存用于保存将要写到磁盘的数据。如果写缓存开启了,force调用在返回后并不能保证数据已经写入介质中。实际上,它可能还在写缓存中。为了保证在FileChannel.force()方法返回后,写入的数据已经在介质上,磁盘写缓存必须关闭。不同的操作系统有不同的关闭方式。

    补白(padding)是指在文件中预分配磁盘存储块。这样做,对于涉及存储块分配的文件系统元数据的更新,就不会显著影响文件的顺序写入操作。假如需要高速向日志中追回事务,而文件中并没有原先分配存储块,那么无论何时写入操作达到文件的结尾,文件系统都需要分配一个新存储块。而通过补白至少可以减少两次额外的磁盘寻址开销:一次更新元数据;另一次是返回文件。

    为避免受到系统其他进程写操作的干扰,强烈建议将事务日志写入到一个独立磁盘,将第二块磁盘调于操作系统文件和快照文件。

9.6.2 快照

    快照是ZooKeeper数据树的拷贝副本,每一个服务器会经常以序列化整个数据树的方式来提取快照,并将这个提取的快照保存到文件中。服务器在进行快照时不需要进行协作,也不需要暂停处理请求。因为服务器在进行快照时还会继续处理请求,所以当快照完成时,数据树可能又发生了变化,这样的快照称为模糊的(fuzzy),因为它们不能反映出在任意给定时间点的数据树的准确状态。

    那服务器如何通过快照来恢复数据呢?其实这并不是问题,因为服务器会重播(repaly)事务。每一个快照文件会以快照开始时最后一个被提交的事务作为标记(tag),这个时间戳记为TS,如果服务器最后加载快照,它会重播TS之后的所有事务日志中的事务。达到一个最合理的状态。