Press "Enter" to skip to content

mysqlnd插件mysqlnd_ms的介绍

从PHP5.3开始, MySQL team专为PHP开发的MySQL连接库mysqlnd(MySQL native driver for PHP)终于和PHP一起发布了. mysqlnd的主要目的是为了解决长久以来mysql和php的license的问题. 它将作为PHP的源代码的一部分和PHP一起发布.
今天, 我要为大家介绍一个mysqlnd的插件:mysqlnd_ms, 这个插件是由mysqlnd的开发者Andrey Hristov,Ulf Wendeljohannes一起开发的, 目前发布在PECL: mysqlnd_ms
在这个扩展的介绍页面我们可以看到它的功能描述:

The replication and load balancing plugin is a plugin for the mysqlnd library. It can be used with PHP MySQL extensions (ext/mysql, ext/mysqli, PDO_MySQL). if they are compiled to use mysqlnd. The plugin inspects queries to do read-write splitting. Read-only queries are send to configured MySQL replication slave servers all other queries are redirected to the MySQL replication master server. Very little, if any, application changes required, dependent on the usage scenario required.

这个扩展, 主要实现了, 连接保持和切换, 负载均衡和读写分离等, 也就是说, 这个扩展会去分别PHP发给MySQL的query, 如果是"读"的query, 就会把query发送给从库(配置中指明), 并且支持负载均衡; 而如果是"写"的query, 就会把query发送给主库.
不过这个扩展需要搭配mysqlnd一起使用(从PHP5.4 beta1开始, 我们已经把mysqlnd作为mysql, mysqli, pdo的默认链接目标, 当然, 你也可以通过--with-mysql=***来制定你想要链接到libmysql).
这个扩展使用的方法也很简单, 首先在php.ini中定义配置:

mysqlnd_ms.enable=1
mysqlnd_ms.ini_file=/path/to/mysqlnd_ms_plugin.ini

之后, 在你指明的mysqlnd_ms_plugin.ini中配置好MySQL的主从库就好了:

[myapp]
master[]=localhost:/tmp/mysql.sock
slave[]=192.168.2.27:3306

博文发出以后, Ulf提醒我, 从1.1.0开始, 配置文件改为JSON格式:

Ulf_Wendel: @laruence >Thx for the blog. Please note, mysqlnd_ms config format was changed in 1.1.0. Now JSON based

所以新的配置应该类似于如下格式:

{
    "myapp": {
        "master": {
            "master_0": {
                "host": "localhost",
                "socket": "\/tmp\/mysql.sock"
            }
        },
        "slave": {
            "slave_0": {
                "host": "192.168.2.27",
                "port": "3306"
            }
        }
    }
}

链接方式修改如下:

<?php
/* Load balanced following "myapp" section rules from the plugins config file */
$mysqli = new mysqli("myapp", "username", "password", "database");
$pdo = new PDO('mysql:host=myapp;dbname=database', 'username', 'password');
$mysql = mysql_connect("myapp", "username", "password");
?>

然后就和你之前一样的来开发了.
如果希望获得更多信息, 可以参看: http://php.net/mysqlnd_ms

16 Comments

  1. andy.zhou
    andy.zhou January 27, 2021

    有谁知道mysqlnd_ms为什么官方不更新了?

  2. anyany
    anyany February 23, 2016

    mysqlnd_ms好像很久不更新啦?

  3. 找名网
    找名网 December 31, 2013

    很好的知识

  4. […] 今天刚写完这篇学习笔记后,回家玩游戏时,想起鸟哥曾提到过mysqlnd,再次回去看看,看鸟哥如何讲解mysqlnd的,我理解的是否有误,才发现鸟哥这里已经有了个Ulf Wendel博客的链接,末学却在网络搜索N久才找到那篇文章,同时,发现其blog上有大量mysqlnd的文章,还暗自偷笑,以为自己发现了大金矿,现在才发现….哎,惭愧惭愧…[2012/12/15 23:58更新] […]

  5. […] 知耻而后勇? 今天刚写完这篇学习笔记后,回家玩游戏时,想起鸟哥曾提到过mysqlnd,再次回去看看,看鸟哥如何讲解mysqlnd的,我理解的是否有误,才发现鸟哥这里已经有了个Ulf Wendel博客的链接,末学却在网络搜索N久才找到那篇文章,同时,发现其blog上有大量mysqlnd的文章,还暗自偷笑,以为自己发现了大金矿,现在才发现….哎,惭愧惭愧…[2012/12/15 23:58更新] […]

  6. CFC4N
    CFC4N December 15, 2012

    今天刚写完学习笔记,回家时,想起鸟哥曾提到过,再次回来阅读,发现鸟哥这里已经有了个Ulf Wendel博客的链接,末学却在网络搜索N久才找到那篇文章,同时,发现其blog上有大量mysqlnd的文章,还暗自偷笑,以为自己发现了大金矿,现在才发现….哎,惭愧惭愧…

  7. dodo
    dodo August 29, 2012

    请教下有没有关于mysqlnd_pscache的安装与使用。网上没有找到相关的资料,svn下来的一直没装成功。是不是没这个插件了?

  8. […] 这里是将pdo_mysql作为一个拓展引入使用的。在php5.3中,PHP开发组把mysqlnd作为默认的连接MYSQL的数据库驱动来使用,据官方描述,节省内存40%,速度更快,当然或许是为了解决许可协议的问题。详情见:mysqlnd插件mysqlnd_ms的介绍。 两种方法都可以,运维同事都尝试了,由于时间关系,他们没做过多的尝试研究,就转向更紧急的项目了。 […]

  9. 深空
    深空 November 19, 2011

    不知道能否很好识别事务

  10. 风起
    风起 October 6, 2011

    不错, 读写分离这点很需要

Comments are closed.