为高流量生产数据库服务器运行带有 MySQL 的 Ubuntu 服务器。除了 MySQL 实例之外,机器上没有其他任何东西在运行。
我们将每日数据库备份存储在数据库服务器上,是否有任何性能影响或我们应该保持硬盘相对空闲的原因?如果磁盘被数据库和所有备份填满 86% 以上,是否会影响性能?
那么,以 86-90%+ 的满容量运行的数据库服务器在任何方面的性能都会比仅以 10% 的满磁盘运行的服务器好吗?
服务器上的总磁盘大小超过 1 TB,因此即使是 10% 的磁盘也足以进行基本的 O/S 交换等。
首先,您不想将数据库备份保存在与数据库相同的物理驱动器或 RAID 组中。原因是磁盘故障(如果您在没有任何 RAID 保护的情况下运行)或灾难性的 RAID 故障(如果您使用 RAID-1 或 RAID-5)将导致您丢失数据库和数据库备份。
您关于磁盘性能的问题与磁盘驱动器的满载程度有关,这取决于磁盘上数据的访问方式。对于旋转磁盘,有两个物理因素会影响 I/O 性能。他们是:
寻道时间——磁盘驱动器将磁头从当前磁道位置移动到包含请求数据的磁道所花费的时间
旋转延迟 - 这是驱动器旋转时所需数据到达读头所需的平均时间 - 对于 15K RPM 驱动器,这是 2 ms(毫秒)
您的驱动器有多满会影响您服务器的 I/O 所经历的平均寻道时间。例如,如果您的驱动器已满,并且您的数据库表物理上位于磁盘盘片两端的驱动器上,那么当您执行 I/O 从这些表访问数据时,这些 I/O 将经历驱动器的最大寻道时间。
尽管如此,如果您的驱动器已满并且您的应用程序仅访问存储在驱动器上的一小部分数据并且所有这些数据都连续位于驱动器上,那么这些 I/O 将受寻道时间的影响最小.
不幸的是,这个问题的答案是“你的里程会有所不同”,这意味着你的应用程序如何访问数据以及数据所在的位置将决定你的 I/O 性能。
此外,正如@gravyface 所提到的,将操作系统存储需求与数据库分开是“最佳实践”。同样,这将有助于最大程度地减少磁盘表面上的磁头移动,因为在同一驱动器上同时使用这两个驱动器可能会导致操作系统和驱动器的数据库区域之间不断寻找,因为操作系统和数据库软件都会发出 I/O 请求。
这里有两个角度需要考虑:性能和稳健性。
在性能方面,通常建议使用单独的磁盘轴(或 RAID 组/驱动器组)用于:
这背后的原因非常简单:您不希望数据库性能受到需要磁盘的“其他东西”的影响(例如,如果机器开始大量交换并且交换分区位于磁盘的另一侧,您可以使用数据库数据)有长盘寻求抗衡)。
从稳健性的角度来看,您想要相同类型的故障,但出于不同的原因:正如其他人指出的那样,您不希望出现故障的磁盘同时删除您的数据库及其备份(尽管实际上您应该复制备份服务器无论如何在发生灾难性故障的情况下)。
/
您还希望避免使用包含所有内容的单一分区的任何配置——这是 Linux 世界中一个不幸的、悲惨的和令人震惊的常见错误,其他类 Unix 系统不存在这种错误。正如 Gravyface 在他的评论中提到的,如果你以某种方式设法填满你的系统几乎肯定会崩溃,如果系统只有一个分区而不是一个结构良好的挂载点层次结构
/
,清理/恢复可能会耗时且成本高昂。/
我建议将数据库和临时(见下文)备份移动到与根目录 (/) 不同的分区。
此外,为您的(假设的)压缩数据库转储备份提出一个合理的轮换/保留方案。(通常)没有理由在本地磁盘上保留那么多备份副本。对灾难恢复没有任何作用,当移动到异地时,应该从磁盘上删除。
这几乎是标准的操作程序。
这让我想起了 NetApp 上的一个错误,其中接近满的文件系统的性能会显着下降(比如一半)。(诚然,那是几年前的事了)。
每个人都说答案是视情况而定,但值得仔细考虑。
完整文件系统的主要缺点是空闲 inode 列表可能是碎片化的并且到处都是。
数据库的硬盘上有三种类型的数据。
(1) 只有在为文件集分配更多空间时才需要可用空间。如果您的数据库没有增长,它应该不会受到磁盘空间不足文件系统的影响。如果它正在分配,它可能会要求一个非常大的块,该块不适合任何空闲列表,您会立即碎片化您的数据库,并在需要数据准备到内存时导致查找。
(2) 天真的日志实现使用操作系统来管理分配空间和删除它会受到影响。假设您的数据库不是只读的,将会有源源不断的日志流,它们会经常在低硬盘空间上碎片化。最终这会损害您的写入性能。
(3) tempDB,如果数据库需要它来处理伪劣的写入查询,或者内存不足,那么你会遇到比磁盘空间不足导致性能问题更大的问题,因为那时你的读取性能可能会受磁盘限制。如果 MySql 需要为 tempDB 分配磁盘空间并且硬盘用完了,您还会面临中断的风险。
关于备份...
简而言之,我会说只要您的数据库不重写,您就可以生存。如果是,则磁盘空间不足是个问题。但如果我是你,我会尽快进行以下工作。
如果可以,请使用单独的主轴和控制器 1。
其次是独立的主轴
其次是一个穷人的单独分区。
最近,当我用完其中一台复制服务器上的所有磁盘空间时,我遇到了类似的问题。直接影响是复制崩溃,然后我无法登录 MySQL,因为无法打开 mysqld.sock 文件。