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 应用环境中使用.
主要功能
透明使用, 并且容易使用.
支持所有的 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 balancing 和 read-write splitting.
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.