目录

  • 1, 环境
  • 2, Redis简介
  • 3, Gearman简介
  • 4, MySQL - Redis配合使用方案
  • 4, 软件安装
  • 5, MySQL UDF + Trigger同步数据到Gearman
  • 6, 参考资料

1, 环境

CentOS, MySQL, Redis, Nodejs

2, Redis简介

Redis是一个开源的K-V内存数据库,它的key可以是string/set/hash/list/...,因为是基于内存的,所在访问速度相当快。

3, Gearman简介

Gearman是一个开源的Map/Reduce分布式计算框架,具有丰富的client sdk,而且它支持MySQL UDF。

Gearman工作图

Gearman调用流程

Gearman集群

从图中可以看出貌似Gearman的集群功能比较弱,Job Server之间没啥关系好像。

4, MySQL - Redis配合使用方案

首先我们以MySQL数据为主,将insert/update/delete交给MySQL,而select交给redis;
当有数据发生变化时,通过MySQL Trigger实时异步调用Gearman的UDF提交一个job给Job Server,当job执行的时候会去更新redis;从而保证redis与MySQL中的数据是同步的。

4, 软件安装

安装gearman

//安装依赖
$ yum install -y boost-devel gperf libevent-devel libuuid-devel//下载gearman
$ wget https://launchpad.net/gearmand/1.2/1.1.12/+download/gearmand-1.1.12.tar.gz
$ tar zxvf gearmand-1.1.12.tar.gz//编译安装,指定mysqlclient的链接路径
$ ./configure LDFLAGS=-L/usr/lib64/mysql/
$ make
$ make install//启动gearmand服务端
$ /usr/local/sbin/gearmand -l /var/log/gearmand.log -d//查看是否安装成功,查看gearman版本
$ /usr/local/sbin/gearmand -V

gearman client

gearman client有很多种:PHP, Perl, Python, Ruby, Nodejs, Go, Java, C#...,我们选择GearmaNode(Nodejs库)作为实验用的gearman client

Nodejs的安装省略

GearmaNode的安装及测试

安装GearmaNode

//安装GearmaNode
$ npm install gearmanode

启动Gearman Job Server

//确保gearman的job server已经启动, job server默认监听4730端口
$ netstat -nplt | grep 4730//如果没有,则启动job server(-d表示启动, -l指定log的位置)
$ /usr/local/sbin/gearmand -l /var/log/gearmand.log -d

worker.js (Gearman Job Worker)

var gearmanode = require('gearmanode');
var worker = gearmanode.worker();
//对job client传递过来的字符串执行reverse倒序操作
worker.addFunction('reverse', function (job) {job.sendWorkData(job.payload); // mirror input as partial resultjob.workComplete(job.payload.toString().split("").reverse().join(""));
});
//启动job worker
$ node worker.js

client.js (Gearman Job Client)

var gearmanode = require('gearmanode');
var client = gearmanode.client();
//提交job
var job = client.submitJob('reverse', 'hello world!');
job.on('workData', function(data) {console.log('WORK_DATA >>> ' + data);
});
//结果回调函数
job.on('complete', function() {console.log('RESULT >>> ' + job.response);client.close();
});
//执行client.js
$ node client.js
//查看控制台打印输出

WORK_DATA >>> hello world!
RESULT >>> !dlrow olleh

可以看到gearman安装成功,运行正常。

5, MySQL UDF + Trigger同步数据到Gearman

安装lib_mysqludf_json

lib_mysqludf_json可以把MySQL表的数据以json数据格式输出

//下载lib_mysqludf_json
$ git clone https://github.com/mysqludf/lib_mysqludf_json.git
$ cd lib_mysqludf_json//编译
$ gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c//拷贝lib_mysqludf_json.so到MySQL的plugin目录
//可以登陆MySQL,输入命令"show variables like '%plugin%'"查看plugin位置
$ cp lib_mysqludf_json.so /usr/lib64/mysql/plugin///演示lib_mysqludf_json功能
$ mysql -uname -hhost -ppwd
//首先注册UDF函数
mysql> CREATE FUNCTION json_object RETURNS STRING SONAME "lib_mysqludf_json.so";
//json_array|json_members|json_values函数注册方式与json_object一样.
mysql> use test;
mysql> select * from user_list;
+------+----------+
| NAME | PASSWORD |
+------+----------+
| troy | pwd      |
+------+----------+
mysql> select json_object(name,password) as user from user_list;
+----------------------------------+
| user                             |
+----------------------------------+
| {"name":"troy","password":"pwd"} |
+----------------------------------+

安装gearman-mysql-udf

//下载
$ wget https://launchpad.net/gearman-mysql-udf/trunk/0.6/+download/gearman-mysql-udf-0.6.tar.gz
$ tar zxvf gearman-mysql-udf-0.6.tar.gz
$ cd gearman-mysql-udf-0.6//安装libgearman-devel
$ yum install libgearman-devel//编译安装
$ ./configure --with-mysql=/usr/bin/mysql_config --libdir=/usr/lib64/mysql/plugin/
$ make && make install//登录MySQL注册UDF函数
mysql> CREATE FUNCTION gman_do_background RETURNS STRINGSONAME "libgearman_mysql_udf.so";
mysql> CREATE FUNCTION gman_servers_set RETURNS STRINGSONAME "libgearman_mysql_udf.so";
//函数gman_do|gman_do_high|gman_do_low|gman_do_high_background|gman_do_low_background|gman_sum注册方式类似,请参考gearman-mysql-udf-0.6/README//指定gearman job server地址
mysql> SELECT gman_servers_set('127.0.0.1:4730');

如果出现异常信息:
ERROR 1126 (HY000): Can't open shared library 'libgearman_mysql_udf.so' (errno: 11 libgearman.so.8: cannot open shared object file: No such file or directory)
表示系统找不到 libgearman.so 文件,一般so都在/usr/local/lib目录下,修改配置文件/etc/ld.so.conf,将/usr/local/lib目录加入进去即可:

$ cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/local/lib
$ /sbin/ldconfig -v | grep gearman*

MySQL Trigger调用Gearman UDF实现同步

DELIMITER $$
CREATE TRIGGER user_list_data_to_redis AFTER UPDATE ON user_listFOR EACH ROW BEGINSET @ret=gman_do_background('syncToRedis', json_object(NEW.name as 'name', NEW.password as 'password')); END$$
DELIMITER ;

Gearman Nodejs Worker将数据异步复制到redis

redis的安装步骤省略
启动redis-server

$ redis-server

安装redis的Nodejs client:

npm install hiredis redis

redis-worker.js (Gearman Nodejs worker)

var redis = require("redis");
var gearmanode = require('gearmanode');
var worker = gearmanode.worker();//添加gearman函数syncToRedis
//当MySQL表记录更改时,此函数会被调用
worker.addFunction('syncToRedis', function (job) {job.sendWorkData(job.payload);console.log("-------job.payload: " + job.payload.toString());//将字符串转换成json object, 然后调用更新redisupdateRedis(eval('(' + job.payload.toString() + ')'));job.workComplete("Successed!");
});//些函数只是简单的将MySQL表中的一行的记录按单个字段更新到redis中。可根据实际情况自行扩展
function updateRedis(json)
{var client = redis.createClient();client.on("error", function (err) {console.log("Error " + err);});for(var key in json){client.set(key, json[key], redis.print);}client.quit();
}

启动worder:

node redis-worker.js

更新MySQL

mysql> select * from user_list;
+------+----------+
| NAME | PASSWORD |
+------+----------+
| troy | jane     |
+------+----------+
mysql> update user_list set name='hello', password='world';

redis-worker控制台输出:

-------job.payload: {"name":"hello","password":"world"}

查看redis数据

$ redis-cli
127.0.0.1:6379> keys *
1) "password"
2) "name"
127.0.0.1:6379> get name
"hello"
127.0.0.1:6379> get password
"world"

可以看到只要MySQL中user_list表的数据被update了,redis中的数据也会被更新。

6, 参考资料

Gearman+PHP+MySQL UDF的组合异步实现MySQL到Redis的数据复制

转载于:https://www.cnblogs.com/java-koma/p/4280769.html

Gearman + Nodejs + MySQL UDF异步实现 MySQL 到 Redis 的数据同步相关推荐

  1. nodejs mysql 异步_Gearman + Nodejs + MySQL UDF异步实现 MySQL 到 Redis 的数据同步

    1, 环境 CentOS, MySQL, Redis, Nodejs Redis是一个开源的K-V内存数据库,它的key可以是string/set/hash/list/...,因为是基于内存的,所在访 ...

  2. php resque gearman,通过Gearman实现MySQL到Redis的数据同步

    对于变化频率非常快的数据来说,如果还选择传统的静态缓存方式(Memocached.File System等)展示数据,可能在缓存的存取上会有很大的开销,并不能很好的满足需要,而Redis这样基于内存的 ...

  3. mysql 1286错误_通过navicat做myslq数据同步时报[Err] [Dtf] 1286 - Unknown storage engine InnoDB错误...

    一.问题描述 通过navicat进行mysql数据库数据迁移和导出sql脚本时,报出"[Err] [Dtf] 1286 - Unknown storage engine 'InnoDB'.. ...

  4. MySQL 到 DM DB 达梦数据库实时数据同步实操分享

  5. 通过Gearman实现MySQL到Redis的数据复制

    通过Gearman实现MySQL到Redis的数据复制 日志未经声明,均为AlloVince原创.版权采用『 知识共享署名-非商业性使用 2.5 许可协议』进行许可. 对于变化频率非常快的数据来说,如 ...

  6. mysql udf 执行命令_mylab_sys_exec UDF调用mysql外部系统命令(For linux)

    有时候为了方便,利用event/trigger调用系统外部命令,可因为安全问题,mysql自身并没有提供相关命令,这里提供个调用系统命令的自定义函数mylab_sys_exec so文件下载:myla ...

  7. elasticsearch 数据类型_基于 MySQL Binlog 的 Elasticsearch 数据同步实践

    来源;马蜂窝 一.背景 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品.订单等数据的多维度检索. 使用 Elasticsearch 存 ...

  8. 基于 MySQL Binlog 的 Elasticsearch 数据同步实践

    一.为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品.订单等数据的多维度检索. 使用 Elasticsearch 存储业务数 ...

  9. 基于 MySQL Binlog 的 Elasticsearch 数据同步实践 原

    一.背景 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品.订单等数据的多维度检索. 使用 Elasticsearch 存储业务数据可以 ...

最新文章

  1. NDuiker项目第2天总结
  2. vba查找数据并返回单元格地址_VBA积木代码中实现反向多值查找、LIKE模糊查找...
  3. 分布式mysql保持数据一致性_一种分布式跨数据库保持事务一致性的方法及系统与流程...
  4. Android MapView简单使用
  5. vSphere 计算vMotion的迁移原理
  6. pxe装机dhcp获取不到_关于PXE服务器环境搭建流程中遇到的问题及解决方法
  7. 核心期刊 计算机应用与软件,计算机应用与软件 统计源期刊北大核心期刊
  8. eigen3.3.4安装笔记
  9. Netty之大名鼎鼎的EventLoop
  10. 智能点餐mysql框架图_SpringBoot微信点餐系统--P3数据库设计
  11. 利用python提取企查查企业的工商基本信息
  12. java常见的异种类_JCA - 自然 - BlogJava
  13. 解决react项目启动报错:error Couldn't find a package.json
  14. servlet3.1规范翻译:第13章 安全
  15. 25. Green Living 绿色生活
  16. python实现erp系统后端_python开发erp教程《PYTHON编一套完整ERP系统,15万元能下来吗》...
  17. 2020.9.10丨Pacbio技术三代建库、测序原理
  18. 技术宅教你如何煎一个特别牛逼且装逼的牛排
  19. 实验10 人机交互的质量与测评
  20. 疫情风险地区查询数据库

热门文章

  1. 一、Web服务器——Tomcat Servlet学习笔记
  2. LeetCode 2148. 元素计数
  3. 使用LSTM建立seq2seq模型进行语言翻译
  4. 02.改善深层神经网络:超参数调试、正则化以及优化 W2.优化算法
  5. [Hands On ML] 6. 决策树
  6. LeetCode 1011. 在 D 天内送达包裹的能力(二分查找)
  7. LintCode解题目录
  8. LeetCode 92. 反转链表 II(双指针)
  9. 数据结构--堆 Heap
  10. 写接口是什么意思啊_科普贴:果汁包装上写NFC到底是什么意思?