Ubuntu 安装 Mysql2redis 及错误日记
mysql2redis 是 Mysql 的一个 UDF(user-defined function) 函数,它提供了 mysql 与 redis 之间的数据交互.当 mysql 的数据进行了更新,它就会调用相应 的 trigger 调用 mysql2redis 里面的函数对 redis 的数据进行更新.
安装前提
安装 mysql2redis 前,先在系统里安装 mysql, redis 并安装相关依赖:
1 | jemalloc |
安装过程–Ubuntu
安装jemalloc 安装命令如下:
1 | sudo apt-get install libjemalloc1 libjemalloc-dev -y |
安装 apr 和 apr-util
apr 和 apr-util 是两个依赖包,它们最新版本的下载地址请点击,下载 好的以后,它的安装过程如下(配制,编译,安装):
- 首先安装 apr
apr-1.4.6(http://apr.apache.org/download.cgi)
1 | sudo wget http://apache.claz.org/apr/apr-1.5.2.tar.gz |
完成编译后将会创建 /usr/local/apr 目录下
- 再次安装 apr-util
apr-util-1.5.2(http://apr.apache.org/download.cgi)
1 | sudo wget http://ftp.wayne.edu/apache//apr/apr-util-1.5.4.tar.gz |
完成编译后将会将 apr-util 添加至 /usr/local/apr/lib 目录下
- 安装 lib_mysqludf_json
lib_mysqludf_json(https://github.com/mysqludf/lib_mysqludf_json)
lib_mysqludf_json 是一个支持json数据格式的UDF函数,它提供给 mysql 与 redis 进行数据交互.它的下载安装过程如下:
1 | sudo git clone https://github.com/mysqludf/lib_mysqludf_json.git |
- 安装 hiredis
hiredis(https://github.com/redis/hiredis)
hiredis 是redis的一个调用接口,它提供了一些简单的redis的操作,它 的安装和下载过程如下:
1 | sudo git clone https://github.com/redis/hiredis.git |
完成编译后将会创建 /usr/local/include/hiredis/ 和 /usr/local/lib/libhiredis.so 文件
将生成的 /usr/local/lib/libhiredis.so.0.13 文件拷备到 /lib/libhiredis.so.0.13 下
//貌似不用将生成的 libhiredis.so 拷贝到 /usr/lib/mysql/plugins 下,
- 最后安装 mysql2redis
1 | sudo git clone https://github.com/dawnbreaks/mysql2redis.git |
最后 make install 会将当前目录下生成的 lib_mysqludf_redis_v2.so 文件复制到 mysqlplugin_dir 下
注:另有一个类似库 https://github.com/aborn/mysql2redis.git
下载完 mysql2redis 后,记住修改以下几步:
修改 Makefile 将默认 /usr/lib64/mysql/plugin 修改为当前系统的 /usr/lib/mysql/plugin (修改PLUGINDIR参数 添加mysql的include 如-I/usr/include/mysql)并重新编译安装
编译 make 的时候提示错误,貌似没有找到 my_global.h 文件
1 | /bin/sh: 1: /usr/bin/mysql_config: not found |
发现没有Makefile里指定的 /usr/include/mysql 文件,查看之前的服务器,发现存在并且里边包含有 my_global.h 文件,于是猜是这里出了问题,一番搜索之后,提示需要安装mysql开发包
1 | sudo apt-get install libmysqlclient-dev |
发现已创建此目录,重新编译没有提示上面的错误
- 错误 lib_mysqludf_redis.c:271:13: error: format not a string literaland no format arguments
将 lib_mysqludf_redis.c [Line:271]行的 fprintf(pFile, buf) 改为 fputs(buf, pFile),或注释掉 [Line:46] /debug_print(buf);/
MYSQL 的配制
- 对于 lib_mysqludf_json 在 mysql 中执行以下sql命令:
1 | DROP FUNCTION IF EXISTS json_members; |
- json_array json_object
1 | mysql> CREATE FUNCTION json_array RETURNS STRING SONAME 'lib_mysqludf_json.so'; |
注:自Mysql5.7开始已有内建 json_array json_object 方法,虽然用法不一样,但是可以稍作调整替换这里的同名方法–所以 lib_mysqludf_json 该库可以不用了
- 对于 mysql2redis 在 mysql 中执行以下 sql 命令:
1 | DROP FUNCTION IF EXISTS redis_servers_set_v2; |
在安装过程中遇到的问题,请参照 mysql2redis.md
- 创建 redis_servers_set_v2 FUNCTION 出现如下错误 ‘lib_mysqludf_redis_v2.so’ (errno: 2 libapr-1.so.0: cannot open shared object file
1 | mysql> CREATE FUNCTION redis_servers_set_v2 RETURNS int SONAME "lib_mysqludf_redis_v2.so"; |
查看 libapr-1.so.0 和 libaprutil-1.so.0 均在 /usr/local/apr/lib/ 下
查看已安装好的 Ali 服务器
1 | Thu May 19 10:54:21 yzhang@coam:/usr/lib/x86_64-linux-gnu$ sudo find / -name libapr-1.so.0 |
可以看到 libapr-1.so.0 和 libaprutil-1.so.0 都已复制到系统的 /usr/lib/x86_64-linux-gnu/ 路径下,可能是当前服务器 Vultr 系统安装有差异,于是手动复制这两个文件,问题解决
1 | cp /usr/local/apr/lib/libapr-1.so.0 /usr/lib/x86_64-linux-gnu/libapr-1.so.0 |
- 最后登陆 Mysql 命令行测试 redis udf
1 | # 设定连接 Redis 数据库 |
错误记录
- 错误 lib_mysqludf_json.so: wrong ELF class: ELFCLASS32) 产生原因是: lib_mysqludf_json.so 是32位的文件-解决方法:重新编译
1 | cd /RunSoft/lib_mysqludf_json |
注意:-I 为 mysql 的 include 目录
- 错误 libhiredis.so.0.10: cannot open shared object file 执行以下命令:
1 | sudo cp /usr/local/lib/libhiredis.so.0.10 /lib |
- Mysql SQL 创建 json_members 方法的时候,提示如下错误:
1 | mysql> CREATE FUNCTION json_members RETURNS STRING SONAME 'lib_mysqludf_json.so'; |
检查发现 /usr/lib/mysql/plugin/lib_mysqludf_json.so 文件存在,可能是安装 Mysql 配置的 plugin-dir 有问题 /usr/local/mysql/
1 | Sat May 14 18:02:00 yzhang@coam:~/RunSoft/mysql2redis$ sudo ps -ef | grep mysql |
可以看见 –plugin-dir=/usr/local/mysql//usr/lib/mysql/plugin 这里配置有问题
- 我是 Mysql 源码编译安装,并且在 cmake 中设定参数 -DINSTALL_PLUGINDIR=/usr/lib/mysql/plugin \ 也没有问题.修改 /etc/mysql/my.cnf 添加以下内容
1 | [mysqld] |
重启 mysql 发现问题已修正
参考列表
怎样安装 mysql2redis
疑难杂症
https://github.com/dawnbreaks/mysql2redis
https://github.com/jackeylu/mysql2redis
http://www.mysqludf.org/
通过Gearman实现MySQL到Redis的数据复制
使用MySQL触发器同步数据到Memcached