我正在尝试设置 MySQL 主从网络。应用程序已准备就绪,而不是大量写入。如何配置master只做写操作,slave只做读操作。
2 回答
您不能使用 MySQL 自动执行此操作,您必须在每个查询的基础上执行此操作。一种方法是创建 2 个数据库连接,一个用于读取,一个用于写入,并确保为每个查询使用正确的一个。
我编写了一个 PHP DB 抽象类(在 github 上可用)来自动处理这个问题。您实例化该类,告诉它哪个服务器是主服务器,哪个服务器是从服务器(任意数量的从服务器)。然后它会自动通过主连接发送 INSERT、UPDATE 和 DELETE,并通过从连接发送 SELECT。它通过为每种类型的查询提供一个函数来实现这一点,并支持覆盖默认行为(即从 master 中选择)。
它是Basecoat框架的一部分,但它不以任何方式依赖于框架,因此如果您使用 PHP,您可以独立使用它。它还处理转义、按需连接、连接恢复、分析、多插入等。虽然它不是 ORM。
不久前,我通过在每个 SQL 语句上运行正则表达式来做到这一点。如果是 SELECT,则数据库库将连接到从站,否则连接到主站。如果有写操作(INSERT、UPDATE 等),同一命中中的所有后续 SELECT 也会转到主服务器,因为主从之间可能存在延迟。(检测给定的 SQL 命令是读还是写有一些微妙之处,例如 SELECT INTO 或存储过程,但您不需要精确。当有疑问时使用主控。)
这不是很复杂,但在我的场景中,它工作得很好,而且很容易设置,无需额外的硬件或软件。