首页 > 数据库相关 > 把MySQL数据库自动同步memcached缓存

把MySQL数据库自动同步memcached缓存

编译安装

首先确定你安装的mysql是5.1以上的版本,同时需要安装 mysql-devel
安装memcached

首先得安装libevent,这个就不介绍了。

首先下载memcached-1.4.5-2.el5.remi.x86_64.rpm和memcached-devel-1.4.5-2.el5.remi.x86_64.rpm(这个安装libmemcached要用到)

安装执行

rpm -Uvh memcached-1.4.5-2.el5.remi.x86_64.rpm
memcached-devel-1.4.5-2.el5.remi.x86_64.rpm

如果自己编译记得设置好安装目录,让接下来的依赖它的库的安装都能够找得到。
编译安装libmemcached

这个就比较纠结了,因为要选择好版本,而且可能还要去翻墙。下载地址:https://launchpad.net/libmemcached/+download

选择版本0.34,不然会报“ servers.c:263:28: error: ‘memcached_st’ has no member named ‘hosts’ ”或者“ ERROR 1126 (HY000) at line 38: Can’t open shared library ‘libmemcached_functions_mysql.so’ (errno: 0 /usr/local/mysql/lib/plugin/libmemcached_functions_mysql.so: undefined symbol: memcached_string_append) ”的错误,后一个错误是在mysql执行sql的时候报的。

解压编译,过程如下

./configure –prefix=/usr/local

make && make install

因为安装路径是在/usr/local下,所以需要修改/etc/ld.so.conf,将/usr/local/lib加入,并且执行/sbin/ldconfig

而且需要设置pkg-confg(如果没有需要安装),不然会在编译memcached_functions_mysql的时候,会报“No package ‘libmemcached’ found”的错误

执行

whereis pkgconfig

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$
PKG_CONFIG_PATH
编译安装 memcached_functions_mysql

这个同样要选择好合适的版本,我这里选择了1.0版本,刚刚开始我用了1.1版本,编译就会了一些问题。这个版本在官方有下的,其他版本可能有问题哦。

编译过程如下

./configure –prefix=/usr/local
–with-mysql=/usr/bin/mysql_config

make && make install

接下来将/usr/local/lib/libmemcached_functions_mysql*的系列文件拷贝到/usr/lib64/mysql/plugin下,直接cp过去,可能会丢掉软连接关系,需要再到 /usr/lib64/mysql/plugin 目录下建立好软连接关系。

最后进入 memcached_functions_mysql的源码目录,先进入mysql终端“mysql -u root -p”

然后执行“source sql/install_functions.sql ;”

成功后查询表mysql.func,可以看到很多 memc为前缀的函数。
启动配置 memcached启动

启动命令和参数如下

memcached -d -m 256 -p 11211

-p 指定端口号(默认11211)

-U UDP监听端口 (默认: 11211, 0 时关闭)

-s 用于监听的UNIX套接字路径(禁用网络支持)

-a UNIX套接字访问掩码,八进制数字(默认:0700)

-m 指定最大使用内存大小(默认64MB)

-t 线程数(默认4)

-l 绑定地址
(默认:所有都允许,无论内外网或者本机更换IP,有安全隐患,若设置为127.0.0.1就只能本机访问)

-d start 启动memcached服务

-d restart 重起memcached服务

-d stop|shutdown 关闭正在运行的memcached服务

-u 绑定使用指定用于运行进程
(只有root用户可以使用这个参数)

-P 将PID写入文件,这样可以使得后边进行快速进程终止, 需要与 -d
一起使用

-m 最大内存使用,单位MB。默认64MB

-M 内存耗尽时返回错误,而不是删除项

-c 最大同时连接数,默认是1024

-f 块大小增长因子,默认是1.25

-n 最小分配空间,key+value+flags默认是48

-k锁定所有内存页。注意你可以锁定的内存上限。
mysql配置

mysql去自动同步memcached,主要是采用触发器来实现的。

首先在每次mysql启动后要进行配置(以下都是在mysql终端里执行)。

select memc_servers_set(’127.0.0.1:11211′);

select
memc_servers_behavior_set(‘MEMCACHED_BEHAVIOR_NO_BLOCK’,’1′);

select
memc_servers_behavior_set(‘MEMCACHED_BEHAVIOR_TCP_NODELAY’,’1′);

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

开始创建一个例子

use test;

create table xxd (id int, value varchar(100));

create trigger xxdmmci after insert on xxd for each row set @tmp
= memc_set(NEW.id, NEW.value);

create trigger xxdmmcu after update on xxd for each row set @tmp
= memc_set(NEW.id, NEW.value);

create trigger xxdmmcd before delete on xxd for each row set
@tmp = memc_delete(OLD.id);

至此,全部配置ok了。

然后可以用telnet连接上memcached去看下,执行“get xx”看是否生效。

这就完了吗,可能没有哦。

当你按照这样去操作时,你可能会发现,其实根本没有写入到memcached中。

怎么办呢,网上也没有响应的解决方法,笔者通过写简单的socket通讯测试,发现在mysql UDF中写socket会连接时会报“Permission denied”。所以你根本连接不上任何的服务器,当然memcached也在内。

问题找到了,就好办了,一劳永逸的解决办法

修改/etc/sysconfig/selinux,加入SELINUX=disabled,然后执行“setenforce 0”

当然,出现这样的问题的原因是,你的库是一个用户生成的,而你的mysqld的执行用户是另外一个。如果用root来启动mysql可能就不会有这样的问题了。

上一篇: memcached如何与mysql并肩作战?

下一篇: 30个php操作redis常用方法代码例子