Memcached与MySQL数据同步

MySQL的源码安装1. 安装依赖组件

Memcached与MySQL数据同步,memcachedmysql

# yum install gcc gcc-c++ ncurses-devel perl -y

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. 安装cmake

2、软件下载与安装

# wget http://www.cmake.org/files/v2.8/cmake-2.8.12.tar.gz# tar zxvf cmake-2.8.12.tar.gz# cd cmake-2.8.12# ./bootstrap # make && make install

  2.1、软件下载

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

  百度云下载链接: 密码:fks8

  网上找的下载网址:

3. 安装bison

  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

参考

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

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

注意:

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

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

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

 

# wget http://ftp.gnu.org/gnu/bison/bison-3.0.2.tar.gz# tar zxvf bison-3.0.2.tar.gz# cd bison-3.0.2# ./configure# make && make install

3、功能介绍

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

具体功能可参考文档:

简单测试一下这些函数:

#测试前当然要先将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');

太阳集团太阳娱乐登录 2

telnet 192.168.95.11 11211

太阳集团太阳娱乐登录 3

 

4. 创建用户的相应目录

4、实例测试

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

太阳集团太阳娱乐登录 4

太阳集团太阳娱乐登录 5

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 ;

太阳集团太阳娱乐登录 6

太阳集团太阳娱乐登录 7

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

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

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

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

太阳集团太阳娱乐登录 8

太阳集团太阳娱乐登录 9

telnet 192.168.95.11 11211

太阳集团太阳娱乐登录 10

2)、更改数据

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

太阳集团太阳娱乐登录 11

telnet 192.168.95.11 11211

太阳集团太阳娱乐登录 12

3)、删除数据

mysql> delete from tab1 where id=1;

太阳集团太阳娱乐登录 13

telnet 192.168.95.11 11211

太阳集团太阳娱乐登录 14

 

# groupadd mysql# useradd -g mysql mysql# mkdir -p /data/mysql/# mkdir -p /data/mysql/data/# mkdir -p /data/mysql/log/

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中使用过多的函数、以及触发器而影响性能。

 

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

作者:那一叶随风

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

 

1、介绍
在生产环境中,我们经常使用MySQL作为应用的数据库。但是随着用户的增多数据量的增大,我们…

5. 获取mysql安装包并安装

# wget http://downloads.mysql.com/archives/mysql-5.5/mysql-5.5.24.tar.gz# tar zxvf mysql-5.5.24.tar.gz# cd mysql-5.5.24# cmake -DCMAKE_INSTALL_PREFIX=/data/mysql -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DMYSQL_DATADIR=/data/mysql/data -DMYSQL_TCP_PORT=3306 -DENABLE_DOWNLOADS=1# make && make install

6. 修改目录权限

# chmod +w /data/mysql/# chown -R mysql:mysql /data/mysql/# ln -s /data/mysql/lib/libmysqlclient.so.18 /usr/lib/libmysqlclient.so.18# ln -s /data/mysql/mysql.sock /tmp/mysql.sock

7. 初始化数据库

# cp -rp /data/mysql/support-files/my-medium.cnf /etc/my.cnf# cp -rp /data/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld# /data/mysql/scripts/mysql_install_db --user=mysql --defaults-file=/etc/my.cnf --basedir=/data/mysql --datadir=/data/mysql/data

8. 启动mysql服务

# chmod +x /etc/init.d/mysqld# vi /etc/init.d/mysqld -->basedir=/data/mysqldatadir=/data/mysql/data# chkconfig --add mysqld# service mysqld start

9. 完成配置

# /data/mysql/bin/mysqladmin -uroot -p password 'PASSWD'# echo "export PATH=/data/mysql/bin:$PATH" >> ~/.bash_profile # source ~/.bash_profile

UDFs实现Memcached与Mysql的自动更新

UDFs是User Defined
Functions的缩写,表示MYSQL的用户定义函数,应用程序可以利用这些函数从MYSQL5.0以上版本的数据库中访问Memcached写入或者获取的数据。此外,MYSQL从5.1版本开始支持触发器,从而可以在触发器中使用UDFs直接更新Memcached的内容,这种方式降低了应用程序设计和编写的复杂性。1.安装

wget https://launchpad.net/libmemcached/1.0/0.34/+download/libmemcached-0.34.tar.gzyum install gcc44 gcc44-c++ libstdc++44-develexport CC=/usr/bin/gcc44export CXX=/usr/bin/g++44./configure --prefix=/soft/libmemcached -disable-64bit CFLAGS="-O3 -march=i686" --with-memcached=/root/libmemcached-1.0.7/memcachedmake && make install

wget https://launchpad.net/memcached-udfs/trunk/1.1/+download/memcached_functions_mysql-1.1.tar.gz./configure --prefix=/soft/UDFS/memcache_mysql --with-mysql=/soft/mysql/bin/mysql_config --libdir=/soft/mysql/lib/plugin --with-libmemcached=/soft/UDFS/libmemcached

make && make installmysql -uroot -pmysql < /sql/install_functions.sqlmysql -uroot -pmysql -se "select name,dl from mysql.func"

select memc_servers_set;//如果mysql restart,需要重新运行这句以建立与memcached之间的关系select memc_server_count();select memc_set;select memc_list_behaviors()G//修改memcached参数的行为select memc_servers_behavior_set('MEMCACHED_BEHAVIOR_NO_BLOCK','1');selectmemc_servers_behavior_set('MEMCACHED_BEHAVIOR_TCP_NODELAY','1'); 

设置MEMCACHED_BEHAVIOR_NO_BLOCK为打开状态,这样在memcached出现问题时数据继续插入到mysql中,报错提示,如果不设置此值,如果memcached失败,mysql需要等到timeout才可以插入到表中。

2.测试:

drop table if exists urls;create table urls  not null auto_increment, url varchar not null default '', primary key ;select memc_servers_set;select memc_set;DELIMITER |DROP TRIGGER IF EXISTS url_mem_insert |CREATE TRIGGER url_mem_insertBEFORE INSERT ON urlsFOR EACH ROW BEGIN SET NEW.id= memc_increment; SET @mm= memc_set;END |DROP TRIGGER IF EXISTS url_mem_update |CREATE TRIGGER url_mem_updateBEFORE UPDATE ON urlsFOR EACH ROW BEGIN SET @mm= memc_replace;END |DROP TRIGGER IF EXISTS url_mem_delete |CREATE TRIGGER url_mem_deleteBEFORE DELETE ON urlsFOR EACH ROW BEGIN SET @mm= memc_delete;END |DELIMITER ;insert into urls  value ;insert into urls  value ;insert into urls  value ;insert into urls  value ('http://microsoft.com/');insert into urls  value('http://slashdot.org');insert into urls  value ;select * from urls;select memc_get;select memc_get;select memc_get;select memc_get;select memc_get;select memc_get;update urls set url= 'http://mysql.com/sun' where url = 'http://mysql.com';select url from urls where url = 'http://mysql.com/sun';select memc_get;delete from urls where url = 'http://microsoft.com/';select * from urls where url='http://microsoft.com/';select memc_get;