从mysql的角度看zfs
由于数据库系统的目的是存储数据,因此与文件系统有着密切的关系。 作为MySQL顾问,我们总是关注文件系统的性能调整机会。 就文件系统而言,最常见的选择是XFS和EXT4在Linux上,遇到另一个文件系统是非常罕见的。 XFS和EXT4都有优点和缺点,但他们的行为是众所周知的,他们表现良好。 他们表现出色,但也不是没有缺点。
多年来,我们开发了一系列工具和技术来克服这些缺点。 例如,由于它们不允许文件系统的一致视图,我们编写了像Xtrabackup这样的工具来备份一个活动的MySQL数据库。 另一个例子是InnoDB双写缓冲器。 InnoDB双写缓冲区是必需的,因为XFS和EXT4都不是事务性的。 有一个文件系统提供了几乎所有我们需要的功能,ZFS。 ZFS可以说是Linux上最先进的文件系统。 也许是时候重新考虑ZFS和MySQL的使用了。
Linux上的ZFS,或者ZLo(来自OpenZFS项目),已经存在了相当长的时间。 我第一次使用ZoL是在2012年,当时还没有正式上市,为了解决一个几乎不可能的挑战,那就是使用InnoDB和MyISAM表来备份一个大型数据库(约400 GB)。 是的,ZFS很容易做到,只需几秒钟。 截至2017年,ZoL已正式上市3年多,早期影响它的大多数问题都已解决。 ZFS也是FreeBSD、illumos、OmniOS和许多其他游戏的玩家。
这篇文章有望成为第一篇专门讨论ZFS和MySQL的使用的文章。 这里的目标不是盲目地推动ZFS,而是看看ZFS何时能帮助解决真正的问题。 我们将首先考察ZFS,并尝试与MySQL的架构进行比较。 这将有助于我们更好地理解ZFS的工作和行为。 未来的文章将致力于更具体的主题,如性能,PXC,备份,压缩,数据库操作,坏的和差的用例,以及示例配置。
ZFS是一个由太阳微系统公司开发的文件系统,2005年首次在OpenSolaris中引入。 ZFS在许多方面都是独一无二的;让我们首先看看它的代码库 sloccount 工具,它提供了对开发工作的评估。
- EXT4: 8。5个人年
- XFS: 17个人年
- ZFS: 77人年
就代码库的复杂性而言,它接近EXT4的10倍;上图显示了比例。 客观地说,Percona-Server 5的缓慢开发工作。7,它基于MySQL社区5。7,估计为680人年。 ZoL的开发由劳伦斯利弗莫尔国家实验室赞助,该项目非常活跃。
为什么ZFS需要这么大的代码库? 在Linux中,它在功能上取代了MD(软件raid)、LVM(卷管理器)和文件系统。 ZFS实际上是一个事务数据库,旨在支持文件系统操作。 让我们回顾一下ZFS的主要特点。
那是巨大的! 根据杰夫·邦威克的说法,这种储存装置的剩余能量足以让海洋沸腾。 我们需要一个更大的文件系统似乎是不可思议的。
当ZFS需要更新记录时,它不会覆盖它。 相反,它写一个新记录,改变指针,然后释放旧记录,如果它不再被引用的话。 这种设计是ZFS的核心。 它支持免费快照和交易等功能。
ZFS支持快照,由于它的COW架构,拍摄快照仅仅是记录一个事务号,并告诉ZFS保护引用的记录不受垃圾收集器的影响。 这与MVCC创新银行非常相似。 如果读视图保持打开状态,InnoDB会保留撤消日志中更改的每一行的副本,并且这些行在事务提交之前不会被清除。
ZFS快照也可以克隆然后写入。 此时,克隆就像是原始数据的分叉。 MySQL/InnoDB中没有等效的特性。
所有的ZFS记录都有校验和。 这与InnoDB的页面校验和完全一样。 如果发现一条记录的校验和无效,它会自动被一个副本替换,前提是有一个副本可用。 定义具有多个数据集副本的ZFS产品是正常的。 有了ZFS,我们可以安全地禁用InnoDB校验和。
ZFS记录可以透明地压缩。 最常见的算法是gzip和lz4。 数据是按记录压缩的,记录大小是一个可调属性。 其原理类似于透明InnoDB页面压缩,但不需要打孔。 在我工作过的几乎所有ZFS设置中,支持压缩有助于提高性能。
ZoL还不支持记录的透明加密,但加密代码目前正在审查中。 如果一切顺利,加密应该会在几个月内可用。 一旦实现,它将为MySQL提供另一个静态加密选项。 该特性与InnoDB表空间加密相比非常好。
ZFS的自由同步是事务性的。 这主要是因为ZFS使用了COW。 当用O_SYNC或O_DSYNC打开一个文件时,数据库实时同步 ZFS的行为就像一个数据库,其中fsync调用代表提交。 写入是原子的。 一旦ZFS将数据写入ZIL (ZFS意向日志),fsync呼叫就会返回。 稍后,后台进程会将ZIL中累积的数据刷新到实际的数据存储中。 这个刷新过程在txg_timeout的时间间隔内调用。 默认情况下,txg_timeout设置为5s。 这个过程与InnoDB刷新页面的方式极其相似。 MySQL的一个直接好处是可以禁用InnoDB双写缓冲区。 尽管最新的Percona服务器版本具有并行双写缓冲区,可以缓解大部分问题,但InnoDB双写缓冲区通常是重写环境中的一个争用源。
ZFS的事务支持在延迟方面付出了巨大的代价,因为同步写入和同步同步涉及许多随机写入输入输出操作。 由于ZFS是事务性的,它需要一份事务性的杂志《ZIL》。 ZIL代表ZFS意向日志。 总有一个ZIL。 ZIL服务的目的与InnoDB日志文件非常相似。 ZIL是按顺序写入的,经常同步,只有在崩溃后才能恢复。 目标是通过向设备顺序写入挂起的更改来延迟随机写输入输出操作。 默认情况下,ZIL仅将实际写入延迟5s (zfs_txg_timeout),但这仍然非常重要。 为了提高同步写入性能,ZFS有可能在单独的意图日志(SLOG)中找到ZIL。
SLOG设备不需要很大,几个GB就足够了,但是对于顺序写入必须很快,对于fsyncs必须很快。 一个快速闪存设备具有良好的写入耐久性或旋转器后面的raid控制器与受保护的写缓存是伟大的SLOG设备。 通常,SLOG是在一个像镜子一样的冗余设备上,因为失去ZIL可能是戏剧性的。 对于MySQL来说,快速SLOG的出现对于性能来说是极其重要的。
ARC是ZFS文件缓存。 从逻辑上讲,它分为两个部分,即ARC和L2ARC。 ARC是内存中的文件缓存,而L2ARC是可选的磁盘缓存,用于存储从ARC中逐出的项目。 L2ARC对MySQL特别感兴趣,因为它允许使用一个小型闪存设备作为大型慢速存储设备的缓存。 在功能上,ARC类似于InnoDB缓冲池,而L2ARC类似于flashcache/bcache/dm-cache等工具。
ZFS有自己处理磁盘的方式。 在最低级别,ZFS可以单独使用裸磁盘,没有冗余,有点像LVM使用的JBOD设备。 冗余可以通过镜像来增加,镜像本质上是一个软件RAID-1设备。 然后,可以将这些镜像条带化在一起,形成一个等效的RAID-10阵列。 此外,还有RAID-1、RAID-2和RAID-3,它们分别相当于RAID-5、RAID-6和RAID。 一个有三个奇偶校验的数组还没有标准的名字。 当您使用Linux MD构建一个RAID阵列时,如果您没有写日志,可能会出现RAID-5+写漏洞问题。 写日志选项仅在最近的内核和最新的mdadm包中可用。 ZFS不受RAID-5写入漏洞的影响。
当我谈到校验和时,我已经谈到了这个特性。 如果一个记录有多个副本,并且其中一个副本被发现损坏,ZFS将只返回一个有效的副本,并且将 修理 受损的记录。 您可以使用命令触发完全检查。
ZFS不仅可以管理文件系统,还可以提供块设备。 块设备称为ZVOLs,可以进行快照和克隆。 当我想要创建类似虚拟机的集群时,这是一个非常方便的功能。 我创建一个基本映像,然后为所有虚拟机创建快照和克隆。 整个映像只存储一次,每个克隆只包含自创建原始克隆以来修改过的记录。
ZFS允许您发送和接收快照。 此功能对于在服务器之间发送数据非常有用。 如果远程服务器上已经有数据的副本,您也可以只发送增量更改。
ZFS可以自动将内容相同的文件(或记录)硬链接在一起。 尽管有趣,但如果您有大量冗余数据,重复数据消除功能会非常密集。 除了备份服务器之外,我没有看到数据库重复数据消除的实际使用案例。
这是第一篇关于ZFS的帖子。敬请期待更多!