日期:2014-05-16  浏览次数:20899 次

Mysql 官方Memcached 插件初步试用感受
话说,4月11号,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
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 脚本
mysql < scripts/innodb_memcached_config.sql


2、进入mysql 客户端,安装插件
mysql> install plugin daemon_memcached soname "libmemcached.so";


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

telnet localhost 11211

set test 0 0 2
11
STORED
get test
VALUE test 0 2
11
END


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

二、说明


进入mysql 客户端,show databases; 后,你会发现多了一个库innodb_memcache
mysql> use innodb_memcache;
Database changed
mysql> show tables;
+---------------------------+
| Tables_in_innodb_memcache |
+---------------------------+
| cache_policies            |
| config_options            |
| containers                |
+---------------------------+
3 rows in set (0.00 sec)


上述三张表都为memcached 的配置信息,分别存放cache 策略、配置和容器信息。先看containers 表
mysql> select * from containers;
+------+-----------+-----------+-------------+---------------+-------+------------+--------------------+------------------------+
| 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 in set (0.00 sec)


说明,通过memcached set 的数据,放在test 库中的demo_test 表中,同时key 存放在表的c1 字段里,value 存放在c2 字段里。然后我们去test 库看看
mysql> use test;
Database changed
mysql> select * from demo_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 in set (0.00 sec)


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


然后再去看看,刚才我们通过memcached 协议set 的值,出现了吧。
注意:在有memcached client 连接的情况下,此表是锁定的,无法采用sql 进行修改
同时,似乎memcached 协议里设置有效时间,在这里无法生效,会一直保留?

在配置里,还有一张表我们需要注意的,cache_policies。看看它的创建语句
 CREATE TABLE `cache_policies` (
  `policy_name` varchar(40) NOT NULL,
  `get_policy` enum('innodb_only','cache_only','caching','disabled') NOT NULL,
  `set_policy` enum('