memcache mysql 同步,Mysql 官方Memcached 插件使用体验

Mysql官方发布过一个Memcached 的插件。以前,曾经也有MemcacheDB 做过相同的事情,不过似乎它现在没啥声音了,而非官方、非Memcached 协议的HandlerSocket 最近反响挺强烈的。这些都有一个共同点:基于Mysql 的storage engine,然后在其上构建一层自有API。

一、安装

安装这个挺简单的,因为此插件需要Mysql 5.6 以上版本支持,所以最好的办法就是去http://labs.mysql.com/ 网站上下载一个包,选择mysql-5.6-labs-innodb-memcached 这个包下载,里面包含了mysql5.6 和mysql memcached 插件。

下载完成后解压缩至/usr/local/mysql 目录,然后按正常顺序安装mysql

SQL代码shell> groupadd mysql

shell> useradd -r -g mysql mysql

shell> cd /usr/local/mysql

shell> chown -R mysql .

shell> chgrp -R mysql .

shell> scripts/mysql_install_db --user=mysql

shell> chown -R root .

shell> chown -R mysql data

shell> cp support-files/mysql.server /etc/init.d/mysql

之后,就可以service mysql start 启动mysql 了。启动Mysql 后,进行Mysql Memcached 插件安装:

1、安装sql 脚本

SQL代码mysql 

2、进入mysql 客户端,安装插件

SQL代码mysql> install plugin daemon_memcached soname"libmemcached.so";

完成上面两步之后,mysql memcached 就安装完成了。下面可以进行一点测试:

SQL代码telnet localhost 11211

settest 0 0 2

11

STORED

get test

VALUE test 0 2

11

END

说明set 和 get 已经能够正常使用了。

二、说明

进入mysql 客户端,show databases; 后,你会发现多了一个库innodb_memcache

SQL代码mysql> use innodb_memcache;

Databasechanged

mysql> show tables;

+---------------------------+

| Tables_in_innodb_memcache |

+---------------------------+

| cache_policies            |

| config_options            |

| containers                |

+---------------------------+

3 rowsinset(0.00 sec)

上述三张表都为memcached 的配置信息,分别存放cache 策略、配置和容器信息。先看containers 表

SQL代码mysql>select*fromcontainers;

+------+-----------+-----------+-------------+---------------+-------+------------+--------------------+------------------------+

| name| db_schema | db_table  | key_columns | value_columns | flags | cas_column | expire_time_column | unique_idx_name_on_key |

+------+-----------+-----------+-------------+---------------+-------+------------+--------------------+------------------------+

| aaa  | test      | demo_test | c1          | c2            | c3    | c4         | c5                 | idx                    |

+------+-----------+-----------+-------------+---------------+-------+------------+--------------------+------------------------+

1 row inset(0.00 sec)

说明,通过memcached set 的数据,放在test 库中的demo_test 表中,同时key 存放在表的c1 字段里,value 存放在c2 字段里。然后我们去test 库看看

SQL代码mysql> use test;

Databasechanged

mysql> select*fromdemo_test;

+------+------+------+------+--------------+------+------+------+------+------+------+

| cx   | cy   | c1   | cz   | c2           | ca   | CB   | c3   | cu   | c4   | C5   |

+------+------+------+------+--------------+------+------+------+------+------+------+

| 9    |    3 | AA   |    2 | HELLO, HELLO |    8 |    8 |    0 |    1 |    3 |    0 |

+------+------+------+------+--------------+------+------+------+------+------+------+

1 row inset(0.00 sec)

没有发现我们刚才set 的test?这里,需要设置一下数据库的transaction 级别,才能同步显示,否则,在64 位系统上,是设有batch size 的,超过32 个才会往数据库中同步

SQL代码sql>SETSESSIONTRANSACTIONISOLATIONLEVELREADUNCOMMITTED;

然后再去看看,刚才我们通过memcached 协议set 的值,出现了吧。

注意:在有memcached client 连接的情况下,此表是锁定的,无法采用sql 进行修改

同时,似乎memcached 协议里设置有效时间,在这里无法生效,会一直保留?

在配置里,还有一张表我们需要注意的,cache_policies。看看它的创建语句

SQL代码CREATETABLE`cache_policies` (

`policy_name` varchar(40)NOTNULL,

`get_policy` enum('innodb_only','cache_only','caching','disabled')NOTNULL,

`set_policy` enum('innodb_only','cache_only','caching','disabled')NOTNULL,

`delete_policy` enum('innodb_only','cache_only','caching','disabled')NOTNULL,

`flush_policy` enum('innodb_only','cache_only','caching','disabled')NOTNULL,

PRIMARYKEY(`policy_name`)

ENGINE=InnoDB DEFAULTCHARSET=latin1

这些策略里,都有四个选项:innodb_only, cache_only, caching 和disabled。

innodb_only: 数据直接存入innodb engine 中

cache_only: 如同传统的memcache server,数据只存在memory 中

caching: memory 中缓存,如果找不到,再向innodb engine 中搜索

三、测试

不管如何,我们还是需要看看它的性能如何,因时间有限,我只进行了一点简单测试,采用memslap 来进行,同时部署了一个官方的memcached server 来进行对比。

首先是官方memcached server 数据:

Get Statistics

Type     Time(s)  Ops          TPS(ops/s)   Net(M/s)   Get_miss   Min(us)  Max(us)    Avg(us)    Std_dev    Geo_dist

Global   85       3226683      37960        39.6       0          25       41149      374        233.02     295.70

Set Statistics

Type     Time(s)  Ops          TPS(ops/s)   Net(M/s)   Get_miss   Min(us)  Max(us)    Avg(us)    Std_dev    Geo_dist

Global   85       358528       4217         4.4        0          29       41313      406        233.22     335.51

Total Statistics

Type     Time(s)  Ops          TPS(ops/s)   Net(M/s)   Get_miss   Min(us)  Max(us)    Avg(us)    Std_dev    Geo_dist

Global   85       3585210      42178        44.0       0          25       41313      377        233.56     299.46

然后是采用Innodb_only 策略的mysql memcached:

Get Statistics

Type     Time(s)  Ops          TPS(ops/s)   Net(M/s)   Get_miss   Min(us)  Max(us)    Avg(us)    Std_dev    Geo_dist

Global   85       1043059      12271        10.9       0          46       395949     1026       4794.93    424.72

Set Statistics

Type     Time(s)  Ops          TPS(ops/s)   Net(M/s)   Get_miss   Min(us)  Max(us)    Avg(us)    Std_dev    Geo_dist

Global   85       115903       1363         1.2        0          76       395981     2482       9260.01    651.46

Total Statistics

Type     Time(s)  Ops          TPS(ops/s)   Net(M/s)   Get_miss   Min(us)  Max(us)    Avg(us)    Std_dev    Geo_dist

Global   85       1158962      13634        12.1       0          46       395981     1172       5427.44    443.28

采用Caching 策略后的结果:

Get Statistics

Type     Time(s)  Ops          TPS(ops/s)   Net(M/s)   Get_miss   Min(us)  Max(us)    Avg(us)    Std_dev    Geo_dist

Global   85       1101521      12959        10.7       0          46       126892     987        3506.08    450.86

Set Statistics

Type     Time(s)  Ops          TPS(ops/s)   Net(M/s)   Get_miss   Min(us)  Max(us)    Avg(us)    Std_dev    Geo_dist

Global   85       122398       1439         1.2        0          74       126725     2211       6591.01    683.18

Total Statistics

Type     Time(s)  Ops          TPS(ops/s)   Net(M/s)   Get_miss   Min(us)  Max(us)    Avg(us)    Std_dev    Geo_dist

Global   85       1223919      14399        11.9       0          46       126892     1109       3942.50    469.99

最后,是cache_only 策略的结果:

Get Statistics

Type     Time(s)  Ops          TPS(ops/s)   Net(M/s)   Get_miss   Min(us)  Max(us)    Avg(us)    Std_dev    Geo_dist

Global   85       1043059      12271        10.9       0          46       395949     1026       4794.93    424.72

Set Statistics

Type     Time(s)  Ops          TPS(ops/s)   Net(M/s)   Get_miss   Min(us)  Max(us)    Avg(us)    Std_dev    Geo_dist

Global   85       115903       1363         1.2        0          76       395981     2482       9260.01    651.46

Total Statistics

Type     Time(s)  Ops          TPS(ops/s)   Net(M/s)   Get_miss   Min(us)  Max(us)    Avg(us)    Std_dev    Geo_dist

Global   85       1158962      13634        12.1       0          46       395981     1172       5427.44    443.28

四、结论

从上述测试结果中可以看出,mysql 官方的解决方案,现在还是一个不怎么成熟的产品,尤其表现在不论读写,都不是太稳定,std_dev 和geo_dist 数值都非常大。性能方面,和memcached server 比起来,差了三倍以上,不过,在特殊场合,这种性能消耗还是可以接受的。由于时间有限,也没法再拿HandlerSocket 和这个比较一下了,感兴趣的同学可以帮忙做个比较。

不过,不管怎样,mysql 社区至少看到了nosql 方面的强烈需求,并且有意愿在这上面有些表现,至少来说是个可喜的迹象。

五、进阶、参考

除了初步的使用外,在labs 里,还有mysql-cluster 解决方案,能够和此共同使用,构建稳固的storage system。

另外,有关这个的各种说明、设计思路等,直接去其官网看吧,这里就不一一搬运了,地址:

除非特别注明,鸡啄米文章均为原创

2016年6月13日

作者:鸡啄米

浏览:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值