ZFS + GlusterFS + NFS 堆栈向客户端返回错误文件(奇怪的行为)

ZFS + GlusterFS + NFS 堆栈向客户端返回错误文件(奇怪的行为)

我在复制的 GlusterFS 卷之上设置了一个 NFS 服务器,该卷位于镜像 ZFS 池之上,为几个应用程序服务器提供文件服务。

ZFS + GlusterFS + NFS 集群架构

我有两个应用程序服务器检索存储在 NFS 共享上的文件。工作量差不多写一次/有时读:文件被写入存储并且几乎从未被修改;有时它们被阅读来满足请求。

在将数据返回给请求客户端之前,应用程序会计算文件 SHA256 哈希值并将其与数据库中存储的哈希值进行比较。

即使应用程序使用文件的完整路径,有时一个节点也会获得完全不同(且错误)的文件内容,例如:应用程序请求 file/data/storage_archive/20220802/filename并从 file 获取数据/data/storage_archive/RANDOM_DATE_HERE/RANDOM_FILENAME

当这种情况发生时(幸运的是到目前为止只有几次),登录应用程序服务器,我可以将(错误的)文件从(正确的)路径复制到本地存储以进行进一步分析,但文件内容仍然是错误的。除了文件名之外,其他元数据(例如文件大小、文件创建日期等)都是正确的,并且反映了真实(错误)的文件。

错误的我的意思是完整且完整的文件(没有位腐烂或其他损坏),例如:完整的 XML 文件而不是 PDF 文件。

如果我尝试从安装同一 NFS 共享的其他应用程序服务器访问同一文件,我会得到正确的文件。

向下浏览我所做的各个层:

  • 检查两个 GlusterFS 节点上文件的 SHA256;哈希值是正确的
  • 检查 ZFS 数据集挂载点上文件的 SHA256;哈希值是正确的

在客户端卸载并重新挂载 NFS 共享可使情况恢复正常。

我想我在链中的某个地方遇到了一些缓存损坏,但我无法理解在哪里:NFS? GlusterFS?泽夫斯?考虑到所涉及的层,ZFS 看起来是罪魁祸首,因为它是第一个可以回复错误数据的参与者,但同时它应该是几乎防弹层。当我收到错误时,没有运行密集型任务(备份、rsync、大型目录遍历等)。

您可以在下面找到有关 ZFS 和 GlusterFS 配置的一些详细信息

 pool: testdata
 state: ONLINE
  scan: scrub repaired 0B in 19h4m with 0 errors on Sun Jul 10 19:28:54 2022
 config:

        NAME                                   STATE     READ WRITE CKSUM
        testdata                               ONLINE       0     0     0
          mirror-0                             ONLINE       0     0     0
            ata-ST16000NM001G-2KK103_ZL2JSCGA  ONLINE       0     0     0
            ata-ST16000NM001G-2KK103_ZL2JS4SB  ONLINE       0     0     0

errors: No known data errors

gluster 卷信息示例:

gluster volume info test_volume

Volume Name: test_volume
Type: Replicate
Volume ID: 2ca11c4a-442f-4887-b65f-f02a34b14b03
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: gluster01-10gbe:/data/testdata/test_volume/data
Brick2: gluster02-10gbe:/data/testdata/test_volume/data
Options Reconfigured:
server.event-threads: 2
performance.parallel-readdir: on
performance.readdir-ahead: off
network.inode-lru-limit: 50000
performance.client-io-threads: off
nfs.disable: on
transport.address-family: inet
storage.fips-mode-rchecksum: on
cluster.granular-entry-heal: on
cluster.enable-shared-storage: enable

GlusterFS 在集群上挂载:

gluster01-10gbe:/test_volume /mnt/testdata/test_volume/data/ glusterfs defaults 0 0

集群上的 NFS 导出:

/mnt/testdata/test_volume/data/    10.1.1.2(rw,fsid=1,sync,no_subtree_check,no_root_squash) 10.1.1.3(rw,fsid=1,sync,no_subtree_check,no_root_squash)

应用服务器上的NFS挂载:

10.1.1.1:/mnt/testdata/test_volume/data/        /data  nfs     proto=udp,nfsvers=3,rsize=8192,wsize=8192,timeo=14,intr,soft  0   0

IP地址、卷名、池名等已替换,避免敏感信息泄露风险

有关存储服务器的一些详细信息:

  • HP ProLiant DL380e Gen8 配备:
  • 双 Intel(R) Xeon(R) CPU E5-2450L @ 1.80GHz
  • 64GB内存
  • 戴尔 Perc H200(IT 模式)
  • 10GbE网络
  • Ubuntu 18.04.6 LTS
  • Linux 上的 OpenZFS 0.7.5-1ubuntu16.12

相关内容