简介

Mysql 主从复制和负载均衡插件 (mysqlnd_ms) 可以帮助我们很简单的支 持所有使用 mysqlnd 的 PHP MySQL 扩展。

自从 PHP 5.3.3 版本,MySQL native driver 以一个 C API 接口的方式存在。这个 C 插件, 可以通过 mysqlnd 完成对 MySQL 主从复制和负载均衡 的相关功能扩展。

从 PHP 5.3.0 以后,MySQL native driver 可以以 C 库的方式工作。它以插入的方式替代 MySQL Client 库 (libmysqlclient) 的作用。使用 mysqlnd 有几个好处: 不需要特别下载内容, 他已经被内置在 PHP 当中; 他基于 PHP 许可协议; 他会消耗更小的内存; 并且他包含很多新的 函数方法 (例如:异步查询).

Mysqlnd 插件 (例如 mysqlnd_ms) 都是从用户的使用要求中提炼出来. mysqlnd_ms 支持所有的 PHP 应用, 和所有的 MySQL PHP 扩展. 他并不改变现有的 APIs, 所以他可以很容易的在现有的 PHP 应用环境中使用.

Key Features

主要功能

  • 透明使用, 并且容易使用.

    • 支持所有的 PHP MySQL 扩展

    • 支持 SSL

    • 一致的 API 接口

    • 只需要很小的基于使用需要的方案设定

    • 被动连接,只有实际的 SQL 执行时,才会与 Master 和 Slaver 进行连接

    • 可选:从 Web request 的第一个写以后自动使用 Master, 降低可能的主从复制的延时影响

  • 可以在 MySQL Cluster 中使用

    • MySQL Replication: 实现读写分离, 插件主要为 MySQL Replication 编写

    • MySQL Cluster: 可以禁用读写分离, 可以使用多个 Master

    • 第三方解决方案: 插件为 MySQL Replication 定制开发, 但是也可以适用于其他的 MySQL Cluster 解决方案

  • 读写分离策略

    • 自动检测 SELECT 语句

    • Supports SQL hints to overrule automatism.

    • 用户自定义

    • 可以被禁用,例如在使用同步 Cluster 时

  • 负载均衡策略

    • Round Robin: 针对每一个 slave 查询,使用不同的 slave,轮循方式

    • Random: 随机选择 slave

    • Random once (sticky): 随机选取一个 slave, 在这个页面的请求过程中, 都是用这个 slave

    • User-defined: 应用可以在 mysqlnd_ms 中注册一个 callback

    • 从 PHP 5.4.0 以后版本,事务可以通过事务控制的 API 调用进行处理。

    • Weighted load balancing: Slave 可以被分配不同的优先级, 例如; 可以让更多的查询在一个更好的设备上执行, 或者在一个更近的设备查询以降低延时影响

  • Global transaction ID

    • Client-side emulation. Makes manual master server failover and slave promotion easier with asynchronous clusters, such as MySQL Replication.

    • 支持 MySQL 5.6.5 以上版本内置的 GTID.

    • 在 Session 一致性策略下,可以通过 GTID 完成异步 slave 读取最新的数据。

    • Throttling: optionally, the plugin can wait for a slave to become "synchronous" before continuing.

  • 服务和一致性级别

    • 应用可以在连接中选择:最终、session 和强一致性服务级别。最合适的通讯节点 将自动进行选择。

    • 最终一致性时,MySQL 主从同步的 slave 可以被本地 cache 替换,用于降低服务器负载。

  • 分区和共享

    • 数据库群组中的服务器,可以被定义到组中,利用 SQL hints 可以手动的指定在特定的组中进行查询。 组可以完成数据分区,或者完成数据热点的更新。

    • MySQL 主从同步过滤可以通过表过滤器支持。

限制

内置的读写分离机制非常基础, 任何一个以 SELECT 开头的查询, 都被认为是读操作, 从而发送给 slave 服务器. 所有其他的查询 (包括 SHOW) 都会被认为是写操作, 而被发送给 master 服务器. 内置的操作方法可以通过重写 SQL hints 改变, 或者使用一个用户定义的 callback 实现.

读写分离不能提供对于多查询的结构支持, 多查询结果会被认为是一个单一查询. 通过开头的字符串来决定如何执行这些查询. 例如, 如果使用 mysqli_multi_query() 执行多查询 SELECT id FROM test; INSERT INTO test(id) VALUES (1) 将会被认为是一个查询操作, 而被发送给 slave 服务器, 以为他开头使用了 SELECT. 其中的 INSERT 结构,将不会被发送给 master 服务器.

Note:

应用必须知道连接切换的重要性, 他是负载均衡的墓地. 可以查看相关说明: connection pooling and switching, transaction handling, failover load balancingread-write splitting.

On the name

The shortcut mysqlnd_ms stands for mysqlnd master slave plugin. The name was chosen for a quick-and-dirty proof-of-concept. In the beginning the developers did not expect to continue using the code base.