现在的位置: 首页Mysql>正文
初探mysqlnd与mysqlnd_ms读写分离
2013年12月09日 Mysql 暂无评论 ⁄ 被围观 10,252 view+

mysqlnd不能做什么

虽然mysqlnd是一个PHP扩展,但它却没有提供任何的php函数(或者说是API)给码农们使用。
码农们仍然使用mysql 扩展函数(mysql_connect, mysql_query…),或者mysqli,或者PDO MYSQL来操作数据库。 这些函数都可以通过mysqlnd来与mysql数据库通信。

它是数据库与php函数的中间层。

为什么要使用mysqlnd

原来的libmysql用的好好的,为什么还要搞一个mysqlnd出来呢?

原因一: license问题

libmysql是MYSQL AB公司开发的,现在已经是Oracle集团所属的了,它使用MYSQL license发布。
This ultimately led to MySQL support being disabled by default in PHP

mysqlnd 是php的一部分,使用PHP license发布。
从此 licensing 的问题就算是解决了。

原因二:编译问题

使用libmysql的时候,如果要正常编译php,必须首先安装好mysql。
如果是单纯的一台WEB服务器,装个mysql似乎有点浪费了。

mysqlnd的话,就不必安装mysql,直接可用。

原因三:性能问题

由于mysqlnd是一个php扩展,使用了php memory management system,在内存使用方面效率相当高。
举个例子:
使用libmysql的时候,mysql结果集中的每一行都在内存中储存了二次 !
使用mysqlnd,结果集只会储存一次。

而且它还服从于php.ini中memory_limit的设置。

Using MySQL Native Driver leads to comparable or better performance than using MySQL Client Library。

mysqlnd_ms测试

看了pecl/mysqlnd_ms 插件介绍,决定试一下,这是一款mysql读写分离/负载 均衡 插件

1.下载 mysqlnd_ms 插件

http://pecl.php.net/package/mysqlnd_ms

2.安装

tar -zxf mysqlnd_ms-1.4.2.tgz
cd mysqlnd_ms-1.4.2/
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --enable-mysqlnd-ms

3.配置

php.ini:
extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/"
extension = "mysqlnd_ms.so"

[mysqlnd]
mysqlnd_ms.enable=1
mysqlnd_ms.config_file="/usr/local/php/etc/mysql_ms.ini"

mysql_ms.ini:

{
    "cloud": {
        "master": {
            "master_0": {
                "host": "localhost",
                "socket": "\/tmp\/mysql.sock",
                "user" : "root",
                "password" : "123456",
                "connect_flags": 0
            }
        },
        "slave": {
            "slave_0": {
                "host": "192.168.1.200",
                "port": "3305",
                "user": "reader",
                "password" : "reader",
                "connect_flags": 1
            }
        }
    }
}

配置完成后,可通过 echo phpinfo(); 查看mysqlnd_ms 属性 ,如下图:

php端使连接使用:

if($mysql = mysql_connect("cloud", "user", "password")){
     $sql = "select * from test";
     mysql_select_db('test_slave',$mysql);
     mysql_query($sql,$mysql);

}else{
   echo "connect wrong";
}

验证:

通过 strace /usr/local/php/bin/php test.php
可以跟踪代码连接的数据库,范例里是select 语句,所以mysqlnd_ms 自动选择了 192.168.1.200 这台机器
connect(3, {sa_family=AF_INET, sin_port=htons(3305), sin_addr=inet_addr("192.168.1.200")}, 16) = -1 EINPROGRESS (Operation now in progress)

如果是insert语句,strace跟踪结果是
connect(3, {sa_family=AF_FILE, path="/tmp/mysql.sock"}, 17) = 0

来源:blog.youyou13.com、blog.csdn.net/dragon8299

给我留言

留言无头像?


×
腾讯微博