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,一经查实,立即删除!

相关文章

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…

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 &…

谁能引领国内人工智能芯片产业突围?

来源:国金证券摘要:我们认为中国在处理器/芯片领域的投资有加速的迹象,AI芯片的创业企业目前已达到40家左右。未来因人工智能边缘运算推理端和云端推理(Inferencing)芯片及设备成本,性能,耗电,效率的考量,以及各种处理器的特性不同…

OC语言知识12

本文目录 一、添加一个简单的图层二、添加一个显示图片的图层三、为什么CALayer中使用CGColorRef和CGImageRef这2种数据类型,而不用UIColor和UIImage?四、UIView和CALayer的选择五、UIView和CALayer的其他关系* 上一讲已经说过,UIView内部默认…

计算机视觉介绍

1.为什么要学习图像处理和计算机视觉 计算机视觉市场需求大,其是人工智能的重要分支。 计算机视觉岗位占所有AI岗位的40%。 但是,中国高校目前尚未设置计算机视觉学科己专业;学习者众多,学习分散,缺少统一教学体系&a…

认识工业互联网

来源:智汇工业摘要:工业互联网是实现智能制造的抓手,推动工业互联网是长期的工作。工业互联网分为广义的工业互联网和狭义的工业互联网。广义的工业互联网就是第四次工业革命的代名词。和德国工业4.0以及中国制造2025类同,都是工业…

模式识别:绪论

模式识别(pattern recognition):输入原始数据并根据其类别采取相应行为的能力。 具体实例:人脸识别、语音识别、文字识别、指纹识别、DNA序列分析。 要区分不同类别的个体,需要利用其一些物理特性上的差异,成为模式分类的特征。…

A16Z内部万字报告:人类与AI结合的最佳形态

来源:36Kr摘要:人工智能技术正在快速发展,将会给我们什么样的变化?人们应该如何与人工智能相处?近日,A16Z博客上放出了一篇内部报告,介绍了人工智能将会给我们的社会带来的变化,以及…

照明与图像

光通量: 人眼所能感受到的辐射功率,等于单位时间内某一波段的辐射能量和该波段的相对视见率的乘积。单位是lm(流明)1流明 0.00146瓦 辐照度 投射到一平表面上的辐射通量密度。指到达一表面上,单位时间,单位面积上的辐射能。以…