编译安装
首先确定你安装的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
这个就比较纠结了,因为要选择好版本,而且可能还要去XX。下载地址: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可能就不会有这样的问题了。