数据库服务器中的 btrfs 中是否应使用 nodatacow 挂载选项?它是否禁用位损坏校验和?

数据库服务器中的 btrfs 中是否应使用 nodatacow 挂载选项?它是否禁用位损坏校验和?

我正在考虑在数据库服务器的 raid 10 配置中实现 btrfs,但我对 nodatacow 选项感到困惑。

根据https://btrfs.wiki.kernel.org/index.php/Gotchas

具有大量随机写入的文件可能会变得非常碎片化(超过 10000 个区),从而导致硬盘驱动器损坏,并在具有 SSD 或大量 RAM 的系统上出现多秒的 CPU 负载峰值。在服务器和工作站上,这会影响数据库和虚拟机映像。nodatacow 挂载选项可能在这里有用,但存在相关问题。

然后文件指出无数据牛选项是:

不要对新创建的文件进行写时复制数据,现有文件不受影响。这也会关闭校验和!换句话说,nodatacow 意味着 nodatasum。datacow 用于确保用户既可以访问文件的旧版本,也可以访问文件的较新版本。datacow 确保我们永远不会将部分更新的文件写入磁盘。nodatacow 通过直接覆盖数据(如 ext[234])略微提高性能,但代价是系统故障时可能会获取部分更新的文件。性能增益通常 < 5%,除非工作负载是随机写入大型数据库文件,在这种情况下差异可能会变得非常大。注意:关闭压缩!

这是否意味着应该为数据库服务器中的磁盘选择此选项,并且使用此选项将禁用损坏校验和?

答案1

这是否意味着应该为数据库服务器中的磁盘选择此选项?
有可能。数据库对文件系统的更改量将通过写时复制和校验和过程放大。[1][2] 即使是正常的文件系统操作也会明显减慢活动数据库的速度,这就是为什么许多高性能 DBMS 支持使用原始磁盘进行存储的原因。[3][4][5]

使用此选项是否会禁用损坏校验和?
不幸的是,确实如此。[6]

[1]https://en.wikipedia.org/wiki/Copy-on-write#Copy-on-write_in_computer_storage
[2]https://btrfs.wiki.kernel.org/index.php/Gotchas#Fragmentation
[3]https://lists.fedoraproject.org/pipermail/devel/2011-July/154251.html
[4]https://blog.pgaddict.com/posts/friends-dont-let-friends-use-btrfs-for-oltp
[5]https://www.google.com/search?q=btrfs+virtual+machine
[6]https://btrfs.wiki.kernel.org/index.php/FAQ#Can_data_checksumming_be_turned_off.3F

答案2

您绝对应该在数据库目录上使用 nodatacow 选项。如果您的数据库有大量写入操作,它将首先减慢速度,然后在几个月内破坏您的 btrfs 文件系统!我遇到过多次这种情况;btrfs 文件系统变为只读并失败,因为有大量碎片(以及一个又一个现在可能已修复的错误,也可能没有)。

自从使用 nodatacow 选项后,问题就消失了。在数据库上使用 COW 是没有意义的,因为数据库正在执行它们自己的、更高级的 COW 逻辑。是的,您将丢失数据校验和,但是使用 COW 对于数据库来说仍然不是有效的选择。

您不需要在整个文件系统上禁用 cow(根据安装选项),只需在数据库目录中禁用它就足够了。为此,请停止数据库,创建一个新目录,使用“chattr +C”禁用该目录上的 COW,然后复制(而不是移动!)所有数据库文件。检查文件系统权限,然后将新的数据库目录移动到位并启动数据库。在目录中设置 chattr +C 会禁用所有新创建的子目录和文件上的 COW。

相关内容