我想设置一个易于扩展的 MySQL 数据库。传统的云外扩展意味着 (1) 升级硬件、(2) 分片或 (3) 复制。
选项 1 简单但有局限性。选项 2(我听说)非常复杂,我不想在维护/管理上浪费有限的人力。选项 3 似乎仅适用于高读取、低写入的情况,这不适合我的用例,并且还存在一致性问题。
我正在考虑设置一个私有 OpenStack 云并部署一个托管数据库的 VM。垂直扩展会很容易(只需分配更多 vCPU、vRAM、HDD),并且可以根据需要向云中添加更多物理节点。然后,我将在云上拥有一个单一的、巨大的 MySQL 实例。
我的问题:
1) 这是否具有实际意义?我不介意少量的开销(我宁愿在硬件上多花点钱,而不是在维护/管理上),但如果开销太大,可能就不合理了。
2) 这个解决方案的可扩展性如何?我是否可以继续向云中添加物理节点,并将 vCPU、vRAM 扩展到任意高的数量?
应用程序对延迟的要求不是很高。我只需要一个易于扩展的解决方案。
答案1
不,“云”无法神奇地向单个虚拟机添加更多物理节点。
虚拟化是一种将一台实体硬件机器划分为多台虚拟机的技术。“云”设置只是一种管理架构,可让您在无需太多工作的情况下管理多台实体机器上的多台虚拟机。但最终,每台虚拟机都在一台实体机器上运行。
一个完全不同的设置,(稍微)更接近你想要的是一个簇。这是一组机器,运行一些设计为在整组机器上运行的软件,使用所有机器的资源(CPU、RAM、存储)。从某种意义上说,集群变成了一台机器。但这台“大机器”与普通服务器不同,只是更大;它完全不同,任何应用程序都必须从一开始就设计为在集群上运行。
有一个“MySQL Cluster”设置,但它并不像你想象的那样,因为它将所有内容存储在 RAM 中。它确实很快且可扩展,但是非常管理成本高并且复杂。
既然你说“应用程序对延迟要求不高”,我猜你说的“易于扩展”是指大量存储空间。如今,向一台机器添加几百 TB 并不难,因此扩展实际上是一种简单且(相对)便宜的方法。
真正的挑战不是将所有硬件连接在一起,而是真正地使用它。MySQL 当然可以配置为这样做,但 MyISAM 表上的全表锁定将是一场灾难。即使是 InnoDB 也会遇到真正的麻烦和漫长的处理时间。在这方面,PostgreSQL 正在更多的和更多的用例,因此如果您没有被 MySQL 所困扰,这是一个值得考虑的真正选择。
比这更大的情况,有一个完全不同的场景,要么使用单元架构(可以看作是分片的极端情况),要么使用一些 NoSQL 解决方案,如 Hadoop 或 Riak
答案2
根据您的安全性和连接要求,您可以选择托管解决方案或云中的 DBaaS。
当然,亚马逊也提供他们的 RDShttp://aws.amazon.com/rds/。这实际上是点击操作,他们会为您管理集群、硬件和维护。每小时只需几美分,如果您可以选择高弹性多可用区选项,价格则是原来的两倍。
Rackspace也这样做(这是英国云的链接)和许多其他人。
抱歉,如果这不适合您,但在您自己的服务器上托管,或者更糟的是,从头开始创建私有云可能不值得您花费金钱或精力。