Architecture

mysqlnd 作为一个 PHP 扩展完成主从同步和负载均衡。他使用 C 语言编写, 从底层嵌入 PHP。伴随 PHP 解释器的启动,他以模块的方式嵌入 PHP 引擎。 他使用 mysqlnd 名称注册在引擎中, 并且使用 mysqlnd 自己的 C 方法替换系统默认操作。

在 PHP 脚本运行期间,他检查所有通过 mysqlnd 发送给 MySQL 服务器的指令。 如果指令时只读的,那么将会发送给排至的 slave 服务器。通过判断语句 是否以 SELECT 开头,决定他是否是只读指令。或者通过 SQL hints /*ms=slave*/ 指定 slave 运行,或者通过 SQL hints /*ms=last_used*/ 指定通过上一条查询的连接运行。 其他情况下,指令会被发送到 MySQL 主从同步的 master 服务器执行。

为了更好的移植性,应用应该使用 MYSQLND_MS_MASTER_SWITCH, MYSQLND_MS_SLAVE_SWITCH, 和 MYSQLND_MS_LAST_USED_SWITCH mysqlnd_ms 预定义常量, 替代 SQL hints 的使用,例如:/*ms=slave*/

插件控制所有到 master 和 slave 的链接。对于应用来说,只需要控制一个连接。 然而这个应用控制的链接,其实是插件管理的连接池中的一个。插件代理了这些 到 master 的链接,并且管理很多的到达 slave 的链接。

数据库连接的状态,由事务、状态、事务设定、字符集设定、临时表等内容组成。 插件在事务执行的过程中和自动提交指令执行中,维护同样的链接状态。有效维护这些 状态并不容易,当运行 BEGIN TRANSACTION 指令后,插件将 控制权移交给用户。