gpt4 book ai didi

php - 使用 Zend_Db 进行读/写拆分

转载 作者:行者123 更新时间:2023-11-29 01:32:50 24 4
gpt4 key购买 nike

我有一个 PHP 应用程序,它的大小不断增加。数据库曾经位于单个主服务器上,但我们打算通过相当标准的主/从复制来改变它,以提高性能和 HA。

因为这个应用程序是读取密集型的,所以我希望将读取委托(delegate)给从属副本,并将写入委托(delegate)给主副本。

该应用程序基于 Zend Framework 1.1.10 并使用 Zend_Db。

要让这个应用程序在不重构太多代码的情况下拆分对数据库的读取和写入,我的最佳策略是什么? (我意识到这里可能会涉及一些重构)。

附言:

我看过MySQL Proxy并且它似乎可以通过坐在数据库服务器和应用程序之间透明地拆分读取和写入,但我不确定在生产环境中使用它的性能问题。有没有人有这方面的经验?

最佳答案

正如您所说,MySQlProxy 可以作为一种解决方案,但我个人从未在生产环境中对其进行过测试。

我在代码中使用 2 个 Db 连接来拆分写入和读取请求。 80% 的日常任务都是通过读取连接完成的。你可以使用 Zend_Application_Resource_Multidb来处理这个问题(对我来说,我很久以前就完成了这部分,我只是在注册表中存储了第二个 Db 连接)。

  • 首先将您的用户权限限制在读取操作并创建另一个数据库具有写入权限的用户。
  • 然后跟踪每个写入请求你的代码(“更新”,“插入”,“删除”是一个好的开始)并尝试用专门的电话调用所有这些电话 helper 。
  • 运行您的应用并观察它崩溃,然后解决问题:-)

当你一开始就想到这个问题时,会更容易。例如:

  • 我通常有一个 Zend_Db_Table 工厂,接受一个“读”或“写”参数,并给我一个正确的 Zend_Db_Table 的单例(一个双单例,我可以有一个读实例和一个写实例)。然后我只需要确保在使用写访问查询/操作时使用正确的初始化 Zend_Db_Table。请注意,当使用 Zend_Db_Table 作为单例时,内存使用要好得多。
  • 我尝试在 TransactionHandler 中获取所有写操作。我在那里我可以检查我只使用与正确连接链接的对象。然后在 Controller 上管理事务,我从不尝试在数据库层管理事务,所有开始/提交/回滚的想法都是在 Controller (或另一个概念层,但不是 DAO 层)上完成的。

最后一点,交易,很重要。如果您想管理交易,请务必使用支持写入的连接,在交易中发出READ 请求。由于在事务之前完成的所有读取都应被视为已过时,并且如果您的数据库后端正在执行隐式锁,则您必须发出读取请求才能获得锁。如果您的数据库后端没有进行隐式读取,那么您还必须在事务中执行行锁。 这意味着您不应依赖 SELECT 关键字将请求推送到只读连接。

如果您的应用程序中有很好的数据库层使用,那么更改并不难。如果你用你的数据库/DAO 层做了一些困惑的事情,那么......它可能会更难。

关于php - 使用 Zend_Db 进行读/写拆分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6175645/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com