11

我被要求重新开发一个旧的 php Web 应用程序,该应用程序当前使用 mysql_query 函数来访问复制的数据库(4 个从属,1 个主控)。

这种重新开发的一部分将把一些数据库移动到一个 mysql 集群中。这些天我通常使用 PDO 来访问数据库,并且我试图找出 PDO 是否可以很好地与集群配合使用,但是我在网络上找不到太多有用的信息。

有人对这个有经验么?我以前从未使用过集群...

4

3 回答 3

3

我已经通过不同的成功程度以几种不同的方式做到了这一点。简短的回答是您的 PDO 连接应该可以正常工作。我看到的选项如下:

如果您正在使用复制,那么要么编写一个处理与各种服务器的连接的类,要么使用代理。代理可以是硬件或软件。MySQL Proxy (http://docs.oracle.com/cd/E17952_01/refman-5.5-en/mysql-proxy.html) 是我曾经使用的软件负载平衡器,并且在大多数情况下它起到了作用。它会自动在您的读者和作者之间路由流量,并像冠军一样处理故障转移。时不时地我们会编写一个查询,它会抛出它并且必须调整一些东西,但那是几年前的事了。它现在可能处于更好的状态。

另一种选择是使用标准负载平衡器并创建两个连接 - 一个用于写入器,另一个用于读取器。您的应用可以根据它尝试执行的功能来决定使用哪个连接。

最后,您可以考虑使用 MySQL 提供的 max db cluster。在此设置中,MySQL 服务器都是读取器和写入器。您只需要一个连接,但您需要一个负载均衡器来路由所有流量。如果索引不同步,Max db cluster 可能会很棘手,因此如果您使用此选项,请谨慎行事。

澄清:当我提到连接时,我的意思是连接到 MySQL 的地址和端口——不要与在同一端口上运行的并发连接混淆。

祝你好运!

于 2012-09-05T14:37:27.603 回答
3

您是否考虑过将集群隐藏在硬件或软件负载平衡器(例如 HAProxy)之后?这样,客户端代码根本不需要处理集群,它将集群视为一个虚拟服务器。

您仍然需要区分写入的应用程序和读取的应用程序。在我们的系统中,我们把从服务器放在负载均衡器后面,只读应用程序使用这个集群,而写应用程序直接访问主服务器。我们不会试图让这一切自动发生;需要更新数据库的应用程序只需使用不同的服务器主机名和用户名。

于 2012-09-03T14:51:02.073 回答
-1

为其中包含连接和查询功能的数据库编写一个包装类...

查询功能需要查看第一个单词以检测它是否是 SELECT 并使用从数据库连接,其他任何内容(INSERT、UPDATE、RENAME、CREATE 等)都需要进入 MASTER 服务器。

connect() 函数将查看从属数组并随机选择一个来使用。

你应该只在需要更新时连接到主从(大多数网页不应该更新数据库,只读取数据......确保你不会浪费时间连接到主数据库)用它)

你也可以在你的类中使用一个静态变量来保存你的数据库连接,这样连接就可以在你的数据库类的实例之间共享(即你只需要打开一次数据库连接,而不是每次调用 '$db = new DB( )')

将数据库函数抽象成这样的类也可以更容易地调试或添加特性

于 2012-08-28T18:30:40.457 回答