Gearman + Nodejs + MySQL UDF异步实现 MySQL 到 Redis 的数据同步

目录

  • 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调用流程

Gearman集群

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

4, MySQL - Redis配合使用方案

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/492547.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python函数实现求非负实数平方根,在shell里调用

编写python函数实现求非负实数平方根,在shell里调用算法牛顿迭代法描述如下函数代码调用函数算法 牛顿迭代法 利用切线逼近曲线,求曲线零点,对于曲线 yf(x)y f(x)yf(x),采用迭代的方法求其零点,在点(xn,f(xn)&#…

5G风起,四大IoT迎风爆发!智能家居与电表高速增长

来源:智东西摘要:深度剖析智能家居、智能城市、车联网、网联无人机四大领域新机遇。2018年,我国物联网(IoT)连接数从2017年的15.4亿飙升至30.63亿,几近增长了100%,增速喜人。而在这组数据背后&a…

机器学习基石笔记5——为什么机器可以学习(1)

转载请注明出处:http://www.cnblogs.com/ymingjingr/p/4271742.html 目录 机器学习基石笔记1——在何时可以使用机器学习(1) 机器学习基石笔记2——在何时可以使用机器学习(2) 机器学习基石笔记3——在何时可以使用机器学习(3)(修改版) 机器学习基石笔记4——在何时…

PPT|工业互联网关键技术专利态势

来源:中国信通院CAICT摘要:《工业互联网关键技术专利态势分析(2019)》对工业互联网的三个重要体系进行深入知识产权分析。以下PPT资料是工业互联网产业联盟和中国信通院团队对《工业互联网关键技术专利态势分析(2019&a…

由二分查找算法学习算法的时间复杂度

文章目录二分查找数据算法函数代码调用函数大OOO表示法表示算法运行速度一些常见的大 OOO 运行时间启示:二分查找 二分查找是一种算法,其输入是一个有序的元素列表和要查找的元素。如果要查找的元素包含在列表中,二分查找返回其位置&#xf…

生命简史——跨越地球40亿年

来源:新原理研究所摘要:你一定也曾好奇过,地球上的生命究竟是如何起源和演化的?它又是如何从简单的原核细胞不断地演化成复杂的多细胞?如此多元化的物种是如何进化而成的?每一次变化都历经了怎样的挑战与压…

图论解决复杂路口红绿灯安排,python语言实现

文章目录问题描述说明性描述操作性描述图着色问题图着色算法算法精化和python描述算法细节处理:python实现讨论问题描述 说明性描述 说明性描述说明了需要解决的问题是什么,针对什么样的问题,期望什么样的解 这是一个5条路的交叉口&#x…

从算法到硬件,一文读懂2019年 AI如何演进

来源:图灵TOPIA翻译:黄姗,杨鹏岳在刚刚过去的2018年,人工智能领域的大事件、新发现和新进展层出不穷。BERT重磅发布,刷新了很多NLP的任务的最好性能;GAN相关研究论文持续增长,生成的照片达到了以…

apache2.2 虚拟主机配置

一、改动httpd.conf 打开appserv的安装文件夹,找到httpd.conf文件,分别去掉以下两行文字前面的#号。 #LoadModule vhost_alias_module modules/mod_vhost_alias.so去掉#意思是启用apache的虚拟主机功能。 #Include conf/extra/httpd-vhosts.conf去掉这…

Python Cookbook 3rd Edition Documentation

Python Cookbook 3rd Edition Documentation 文章目录第一章:数据结构和算法1.1 解压序列赋值给多个变量问题解决方案讨论1.2 解压可迭代对象赋值给多个变量问题解决方案讨论第一章:数据结构和算法 Python 提供了大量的内置数据结构,包括列表…

《阿丽塔》脑机接口正从科幻走向现实

来源:zhongcap摘要:《流浪地球》和《阿丽塔》前后脚上映,难免不让人比较一番。科幻片的魅力,在于它试验和想象未来的可能性。昨天晚上小编去看了卡梅隆的新作《阿丽塔:战斗天使》。《流浪地球》和《阿丽塔》前后脚上映…

2015年2月12日——不懂点

CNBLOG项目不懂知识点:1. local:[...]的写法 这样声明可使用。 1    xmlns:local"using:CNBlogs" 2 xmlns:ControlHelper"using:CNBlogs.ControlHelper" 2. 书写格式上 - 把所有的繁杂的 style template 等等都放到了具体类似于 .css …

全球首个AI女主播上岗了!太惊艳了!

来源:水木然摘要:前不久,全球首个AI女主播诞生的消息走红网络!刚刚,这位AI女主播今天正式上岗了!是不是非常惊艳?如果不是专门解释,她极有可能被为是真人!这位全球首个AI…

有原创保护能力的公众帐号可申请页面模版功能和图文消息正文插入历史群发链接...

之前微信公众平台仅针对开通了微信支付的公众号支持插入图文消息链接,现在微信团队对有原创保护能力的公众帐号开放页面模版功能、开放图文消息正文插入历史图文链接。(怎样申请成为有原创保护能力的公众帐号?也许有人会把页面模版和模板消息…

重磅!华为宣布起诉美国政府

来源:网易智能摘要:今天,华为在深圳总部召开发布会,宣布决定起诉美国政府。01指责美国政府窃取华为服务器华为宣布针对美国《2019财年国防授权法》第889条的合宪性向美国联邦法院提起诉讼,请求法院判定这一针对华为的销…

递归和快速排序

文章目录递归问题描述基线条件和递归条件栈调用栈递归调用栈小结快速排序示例1问题描述欧几里得算法使用D&C解决问题的两个步骤:示例2快速排序工作原理代码小结递归 问题描述 假设你在祖母的阁楼中翻箱倒柜,发现了一个上锁的神秘手提箱。祖母告诉你…

Spire.Pdf 的各种操作总结

Spire.Pdf 的各种操作总结简介 试验新产品总是给我带来许多挑战,当然这也是一个引进创新技术的好方法。在这里我要跟大家分享的是使用Spire.Pdf的过程,它是来自E-iceblue公司的轻便PDF程序库。 设计情节我以前经常没事就搞搞PDF。Spire.Pdf是用C# 写的PD…

从观望到行动:全球工业物联网市场生态全景观察

来源:资本实验室在当前,诸如5G,物联网、边缘计算、人工智能、机器人、区块链、增材制造和虚拟现实/增强现实等技术正在加速融合到工业物联网(Industrial Internet of Things,IIoT)的肥沃土壤中,…

OC语言知识6

本文目录 一、异步POST请求二、NSURLConnection的其他请求方法上一讲介绍了iOS中的异步GET请求,这讲来看看异步POST请求。 回到顶部一、异步POST请求 假如请求路径是http://192.168.1.102:8080/MJServer/login,请求参数有2个: username &…

散列表(字典)

文章目录问题散列函数应用案例将散列表用于查找防止重复将散列表用作缓存冲突性能装填因子良好的散列函数小结问题 你在一家杂货店上班。有顾客来买东西时,你得在一个本子中查找价格。 如果本子的内容不是按字母顺序排列的,你可能为查找苹果&#xff0…