我怎样才能有2个数据库服务器为我的网站?

我有一个网站stream量很大,我的数据库服务器(MySQL)在偷看时间stream量很大。 我没有升级到更好的服务器,而是考虑让2个数据库服务器一起工作,这样繁重的stream量就可以“分离”。

我的问题是如何发生这种情况? 如何1个数据库可以由2个不同的机器处理? 实现这样的事情的常见做法是什么?你build议我做什么?

我的networking服务器将如何与数据库服务器通信? Web服务器应该只与其中一个或两个人沟通?

有几个选项可以考虑提高数据库性能,而不仅仅是扩展。

  • 优化MySQL设置 – 有几十个configuration参数可能会严重影响MySQL的性能。 确定你先调查这个选项,然后再决定是否真的需要扩展。
  • 优化应用程序 – 就像保罗提到的一样,确保你的应用程序的行为是合理的。 如果不使用正确的索引和查询,则无论服务器的数量多less,都会导致性能下降,并且浪费金钱/时间。
  • 扩大规模 – 根据您目前所处的硬件级别,获取更大的机器可能是一个更简单的解决scheme。 不过,对于每个应用程序来说,有一点可以更好地开始扩展(复制/分片)。
  • 复制 – 通常的configuration是有一个主服务器和多个从服务器。 主服务器获取所有写请求,任何从服务器都可以提供读请求。 这适用于您期望读取次数多于写入次数的情况。
  • 分片 – 有多个MySQL服务器,每个处理整个数据库的一部分。 例如,用户ad在db1上,在db2上是ei等….我相信这是在应用层处理的,而不是MySQL本身。

上面的项目是我要调查他们的顺序,虽然这取决于应用程序和您的要求。 例如,如果您也希望为高可用性设置添加冗余,那么复制可能是明显的select。

有人发布了一个livejournal mysql安装程序的链接。 他们说,最好是坚持一个大的服务器,而不是聚集在一起。

分析一个livejournal家伙在这里的幻灯片: http ://www.danga.com/words/2004_mysqlcon/

我的build议是开始优化您的查询和索引。 这将我的负载从平均4降低到了0.5。 令人惊叹的,嗯? 通过只增加额外的索引。

HTH

将它们聚类 。

你通常想要在这里发生的是你所有的操作总是一样的(主),并且你使用某种forms的复制来同步从主服务器到从服务器的新数据。 然后,您可以使用负载平衡器在可用的各种物理服务器之间分配读取查询,但是对于某些情况,这些服务器可能稍微过时。 负载平衡器也需要足够聪明,以便知道某些种类的查询需要从主服务器完成,所以例如当我把这个post添加到堆栈溢出时,我不必等待复制赶上我的新post,如果我最终负载平衡到辅助服务器。 简而言之,应用程序也需要编写以便了解这一点。 你不能只是在数据库中打开一个选项,让它们都能正常工作。

如果你只是升级服务器,底线可能会更好看。 运行两个实时数据库增加了很多复杂性,并且不值得相对较小的硬件成本。 真正的大型系统使用诸如Oracle RAC之类的东西来在多台机器上运行相同的数据库,但是在百万美元的服务器集群区域中听起来并不像你所说的那样。 有一个温暖的待机总是一个好主意,你可以使用复制,以保持准备去。

  1. 您可以在应用程序级别拆分读取和写入SQL。 使用应用程序中的两台服务器(我假设您正在使用一个类来处理读取,写入,连接到数据库服务器)的任何地方,您有写入,删除,replace,更新SQL使他们连接到您的主服务器和所有你读SQL连接到从服务器。 这是你可以把你的主服务器的读取负载。
  2. 通过应用复制结构,您还需要优化您的表(索引,..)以及您的查询,以获得最佳性能。 另外不要忘了调整你的复制参数和监视服务器的stream量,如果你看到更多的读取SQLs进来比写未来,你可以添加第二个从属服务器到你的架构师。
  3. 如果您正在使用复制解决scheme,请不要忘记您的从属MySQL版本应与主版本或更高版本相同,否则复制将在某个时候中断。
  4. 复制是一个很好的和常见的结构,但是也带来了挑战,比如如果复制中断,那么你应该知道如何从中断点启动从服务器,这样两个服务器就可以相互同步。
  5. 如果是我,我会尝试优化我的SQL和查询和表首先,监视我的stream量,看看我有更多的读取或写入的SQL和基础,我会采取巢步骤。