从长远来看(从现在起 10 年)管理不断增长的数据库

Adr*_*ase 1 mysql

我即将完成一个 WEB 应用程序(PHP + mysql 网站门户),它将开始缓慢,例如上传几张图片并在主数据库表中插入几行,但很快,几年后,我希望它能在某些时候稳定增长,甚至是对数增长。

根据我的 Excel 计算,在某些时候,数据库表数据 + 索引 (innoDB) 会使托管图片的大小过度增长 10 倍,但一开始情况正好相反。

所以基本上我的门户网站托管图片(比如中等大小的 jpegs)并使用 MySql InnoDB 数据库表。

我向所有管理员和专业人士提出的问题是关于我的 MySql 数据库。

我提前考虑,所以我不会措手不及:

当我的数据库增长更多甚至达到 1.2TB 或 2TB 或更多时......我该如何处理?我可以说将它拆分到 2 台或更多台专用机器上,这样搜索仍然会很快并从这个大数据库中获取数据吗?还是我应该做 1 个服务器并用大量便宜的 7200 rpm sata 来提升它?或者什么是不断增长的数据库的解决方案。

我对此网络应用程序的第一个配置是 VPS - SSD 托管,带有 4ghz 处理器、3GB 内存和 2x60 GB SSD raid 1。

谢谢你的回答,

小智 5

这里有一些通用的建议......

  • 不要将图像本身存储在数据库中(不清楚这是否是您的计划)。这会给你带来巨大的缩放问题。如果需要,将它们存储在文件系统或非关系数据库中。
  • 数据库应该是独立于应用程序的服务器。
  • 理想情况下,您应该有足够的 RAM 来保存您的工作数据集。确保提前调整数据库(innodb_buffer_pool_size、innodb_log_file_size 等)。
  • 将您的 mysql 数据放在您可以获得的最快磁盘上。SSD 或 10k+ SATA/SAS。确保 RAID 控制器有备用电池和写入缓存。
  • 用于 mysql 数据卷的 RAID-10。
  • 将 mysql 的二进制日志(可能还有中继日志和 innodb 事务日志)放在单独的 RAID 阵列上,RAID-1 应该没问题。
  • 有一个用于只读查询的从服务器,从主服务器接收一些负载。您的应用程序必须区分 RW 和 RO 查询。在该奴隶上设置 'read_only=1' 以防止不幸的事故。

  • 随着数据集的增长,您可能需要考虑跨多个服务器进行水平分片。MySQL 没有为此提供机制,因此您的应用程序将需要。

  • 没有理由不能拥有一个 2TB 的数据库,但是您可能会发现无法放入缓冲池的数据的性能无法接受。
  • 不要过度建立索引。主索引之外的其他索引会引入额外的开销(并不是说您应该没有)。可能有很好的机会使用复合索引(多列)而不是 2 个单独的索引。

希望这可以帮助,