zoukankan      html  css  js  c++  java
  • Memcached与MySQL数据同步

    1、介绍

      在生产环境中,我们经常使用MySQL作为应用的数据库。但是随着用户的增多数据量的增大,我们将会自然而然的选择Memcached作为缓存数据库,从而减小MySQL的压力。但是memcached在用户、应用与MySQL三者中保持着数据同步也是一个不小的工程。

      例如用户从memcached缓存中换取某数据,并且执行删除命令。它需要到MySQL中删除,之后还须要设计一个程序将Memcached与之对应的数据也删除掉。

      假若我们能够做到在MySQL中增删改时都能够自动触发删除memcached中相应的数据,那岂不美滋滋呀。这当然能够做到啦,我们将采用采用MySQL Memcached UDF(User Defined Functions)方法。

      mysql memcached UDF 其实就是通过libmemcached来使用memcache的一系列函数,通过这些函数,你能 对memcache进行get, set, cas, append, prepend, delete, increment, decrement objects操作,如果我们通过mysql trigger来使用这些函数,那么就能通过mysql更好的,更自动的管理memcache!

    2、软件下载与安装

      2.1、软件下载

      需要使用的软件又两个,libmemcached以及memcached_functions_mysql

      百度云下载链接:http://pan.baidu.com/s/1pKCKjwB 密码:fks8

      网上找的下载网址:http://download.tangent.org(当时找软件的时候,网上多篇文章都说这里可以下载那两个软件。可我进去就是找不到呀,23333)

      2.2、软件安装

      简介:

      这两个软件的安装比较蛋疼,毕竟是开源软件,哪个版本依赖哪个版本,哪个版本不与哪版本个兼容。当时我安装这两个软件用了一个上午时间。因为之前我在安装PHP中memcached扩展模块需要依赖这个软件库,所以安装了一个最新版本libmemcached-1.0.18,因而能够使用PHP的memcached扩展模块中的所有功能。、

      但是在安装memcached_functions_mysql时,就显得很蛋疼了。

      一开始我直接安装memcached_functions_mysql-1.1,到make的时候就出现下面的错误。

    servers.c:122: error: 'memcached_st' has no member named 'hosts'
    servers.c:123: error: 'memcached_st' has no member named 'hosts'
    servers.c:124: error: 'memcached_st' has no member named 'hosts'
    servers.c:126: error: 'memcached_st' has no member named 'hosts'

    ……

    这是什么原因呢?

      这就是上面所提到软件兼容问题。

      后来在网上看到说是memcached_functions_mysql-1.1这个版本配对libmemcached-0.37版本以上都会出现这种问题。

      接着我就进行一次又一次测试:

      Libmemcached(1.0.2、1.0.3、1.0.18、0.34、0.36版本)+ memcached_functions_mysql-1.1进行安装。结果成功的只有0.34、0.36版本。

      因为我想要保证相对较高版本的libmemcached,因为低版本的不支持PHP的memcached扩展模块的一些新功能。

      既然memcached_functions_mysql-1.1版本不能对应libmemcached的高版本,那么我就退而求其次,使用memcached_functions_mysql-0.9咯。

      百度了好久好久没找着,最后在国外的网站github中找到。

      接着进行memcached_functions_mysql-0.9的安装测试,结果还是不理想。

      突然灵光一闪,那我就安装两个libmemcached咯,一个1.0.18版本,一个0.34版本。最终成功安装。libmemcached-0.34与memcached_functions_mysql-1.1配对进行安装)

    1):安装libmemcached-0.34

    参考

    http://www.cnblogs.com/phpstudy2015-6/p/6670103.html#_label2

    2):安装memcached_functions_mysql-1.1

    #tar zxvf memcached_functions_mysql-1.1.tar.gz
    #cd memcached_functions_mysql-1.1
    #./configure --with-mysql=/usr/local/mysql/bin/mysql_config --with-libmemcached=/usr/local/libmemcached
    #make
    #make install

    3):拷贝lib文件到mysql的plugin下面

    # cp /usr/local/lib/libmemcached_functions_mysql.* /usr/local/mysql/lib/plugin/

    4)往MySQL添加memcache UDF函数

    一共有两种方法:

    1、在MySQL里执行 source install_functions.sql

    mysql>source /home/username/(memcached_functions_mysql-1.1源码路径)/sql/ install_functions.sql

    2、在linux主机执行mysql <sql/install_functions.sql

    #/usr/local/mysql/bin/mysql < /home/username/(memcached_functions_mysql-1.1源码路径)/sql/ install_functions.sql

    5):检查添加函数是否成功

    mysql>select * from mysql.func;

    结果显示有很多函数,表示添加函数成功

    注意:

    1、必须要带有--with-libmemcached,否则就会显示找不到libmemcached

    2、有个小细节,就是经常进行安装卸载libmemcached时(即--prefix有设置相同的名字),即使有--with-libmemcached正确的路径,也有可能会显示找不到libmemcached。

    解决:可以使用不同的名字(--prefix);或者重启linux

    3、功能介绍

      从select * from mysql.func;的结果中我们可以看到很多关于memcached的函数。熟悉memcached指令的同学一眼看过去就能够知道这个函数的大概功能。memc_set、memc_get这不就是相当set与get命令嘛。

    具体功能可参考文档:

    http://dev.mysql.com/doc/refman/5.1/en/ha-memcached-interfaces-mysqludf.html

    简单测试一下这些函数:

    #测试前当然要先将MySQL与memcached建立连接啦!
    mysql> select memc_servers_set('192.168.95.11:11211');
    mysql> select memc_server_count();
    mysql> select memc_set('m','llppppp');
    mysql> select memc_get('m');

    telnet 192.168.95.11 11211

    4、实例测试

    1、新建一个数据库test233以及表tab1

    2、建立三个触发器

    插入数据:
    mysql>delimiter $
    mysql>create trigger tab1_insert_memc
        -> before insert on tab1
        -> for each row begin
        -> set @m=memc_set(NEW.id,NEW.name);   
        -> end$
    更新数据:
    mysql> create trigger tab1_update_memc
        ->before update on tab1
        -> for each row begin
        -> set @m=memc_replace(OLD.id,NEW.name);   
        -> end$
    删除数据:
    mysql> create trigger tab1_delete_memc
        -> before delete on tab1 
        -> for each row begin
        -> set @m=memc_delete(OLD.id);
        -> end$
    mysql>delimiter ;

    3、连接memcached服务器进行数据测试

    mysql> select memc_servers_set('192.168.95.11:11211');

    1)、向tab1插入几条数据,并查看结果

    mysql> insert into tab1 value('1','1111aaaaff');
    .......

    telnet 192.168.95.11 11211

    2)、更改数据

    mysql> update tab1 set name='ooooooooooooooo' where id=1;

    telnet 192.168.95.11 11211

    3)、删除数据

    mysql> delete from tab1 where id=1;

    telnet 192.168.95.11 11211

    5、总结建议

    1、如果出现mysql服务重启,需要重新连接memcached服务器select memc_servers_set('192.168.95.11:11211)

    2、使用命令查看可以设置的参数,根据具体项目设置最合适参数select memc_list_behaviors()/G

    3、设置MEMCACHED_BEHAVIOR_NO_BLOCK为打开状态,表示在memcached出现问题时可以继续将数据插入到MySQL中。否则将会等到timeout执行插入操作。

    4、在MySQL中使用这个功能时,不要一味地将所有表的数据都布置成这种形式,避免MySQL中使用过多的函数、以及触发器而影响性能。

    (以上是自己的一些见解与总结,若有不足或者错误的地方请各位指出)

    作者:那一叶随风

    声明:以上只代表本人在工作学习中某一时间内总结的观点或结论。转载时请在文章页面明显位置给出原文链接

  • 相关阅读:
    JavaEE基础(十九)/异常和File
    JavaEE基础(十八)/集合
    JavaEE基础(十七)/集合
    JavaEE基础(十六)/集合
    快排、插入、冒泡排序
    函数技巧总结
    读书笔记-你不知道的JS中-函数生成器
    读书笔记-你不知道的JS中-promise(3)
    异步API
    读书笔记-你不知道的JS中-promise(2)
  • 原文地址:https://www.cnblogs.com/phpstudy2015-6/p/6683170.html
Copyright © 2011-2022 走看看