我在复制的 GlusterFS 卷之上设置了一个 NFS 服务器,该卷位于镜像 ZFS 池之上,为几个应用程序服务器提供文件服务。
我有两个应用程序服务器检索存储在 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