可以将 SQL DB 放在 NAS 上吗?

Ced*_*tin 2 performance disk-structures network

可以将 SQL DB 放在 NAS 驱动器上吗?例如,我可以将 PostgreSQL DB“文件”放在 Sinology NAS 上,还是最好将所有内容放在“真正的”PC 上?(例如,运行 Linux 的常规 PC 服务器)

我问这个问题是因为发生了一些奇怪的事情:一些用 WinDev 编写的会计应用程序(一种在某些国家/地区很有名的 RAD 工具,例如许多法语国家),使用存储在 NAS 上的 HyperfileSQL 数据库,结果搞砸了。

维基百科 HyperFileSQL(法语)

维基百科 WinDev(法语)

整个数据库被损坏,许多文件的大小为零,应用程序的开发人员告诉我的客户:“这是你的错,你不应该将 HyperfileSQL 数据库文件放在 NAS 上,NAS 没有强大的 CPU足够了,所以腐败就会发生”

我不明白:HyperfileSQL 应该是 ACID。我可以理解延误和/或糟糕的表现,但完全腐败?

哎呀,我什至应该能够从 NAS 上拔掉“UPS 线”(我的意思是:“电源线”,但所有东西都在 UPS 上),而真正的 SQL DB 应该没问题吧?

那么我可以将 SQL DB 放在 NAS 上吗?

我应该期待表现不佳吗?(它适用于小型数据库,我从未注意到任何性能问题)

数据库会完全损坏吗?

Tho*_*ser 5

数据库需要其运行的存储提供某些保证才能实现 ACID。不幸的是,数据库并不总是能够确定是否满足这些保证。

以下是存储(无论是 NAS、直连还是 SAN)必须满足的一些要求:

Write Ordering:按照操作系统确认的顺序写入我的事件。例如,如果数据库向 LUN 提交块 A 和 B 的写入请求,则不能出现 B 比 A 更确认,但写入顺序相反的情况。

直写:当存储表明某些内容已写入时,它必须位于永久存储上,可以在断电时幸存。不幸的是,除非您小心,否则许多操作系统和存储系统会将写入内容缓存在 DRAM 中。这意味着如果您失去与 NAS 的连接,您可能会丢失数据。

无撕裂 I/O当您提交一个 I/O 块并且 I/O 系统确认收到该块时,整个块必须位于稳定介质上(例如,不允许将 8K 页拆分为在写入两个 4K 块之前确认 2 x 4K 和 8K 写入)。

原子写入:根据介质的不同,原子写入需要有最小写入大小(通常为 512B 或 4K)。这种大小的写入要么发生,要么不发生。没有可以在媒体上表示的中间状态。请注意,这与破损页面保护(完全)不同。例如,对于损坏的页面,您可能会遇到这样的情况:8K 中的 4K 已写入,但 8K 尚未确认,然后崩溃并损坏(这是可以检测到的,通常可以在数据库重新启动后修复)。对于原子,写入要么发生,要么不发生。

设计适合数据库的存储并不是一件简单的事情。人们常常会犯错——尤其是如果他们在部署之前没有测试存储的话。这有点令人安慰,但您的情况并不少见,NAS 可能与此无关(人们在直连存储和 SAN 上也犯了这个错误)。

如果存储设计正确并且NAS有正确的保证,数据库通常可以在NAS上良好运行。

说NAS的CPU不够强大,与本次讨论完全无关。所以我认为你可以放心地忽略该开发人员的意见。