Gearman Server 使用 MySQL UDFs 来管理和保持队列
我们知道 Gearman 的任务是一个数组结构,只存在内存中,一断电怎么样这个信息就会不存在。所以新的 gearman 开发了一个功能,就是通过 mysql 来存储和调用 Gearman 任务信息。这样可以持久的保持任务的状态,因为可以直接对数据库的操作,上面建个触发器,就相当于 Gearman 的客户端。修改表,插入表就相当于直接下发任务。
UDF 的全名叫用户算定义函数,是使用 SQL 中一些功能来实现 SQL 本身没有的功能。
支持持久任务保持的 gearman 是 c 重写的,所以我们要先安装这个 c 重写的 gearman 的程序。
安装 gearman 的程序
先要安装一些 gearman 需要的软件
$ yum install libevent-devel boost boost-devel
boost 需要 1.39 以上的版本
下载地址
http://launchpad.net/gearmand/trunk/0.18/+download/gearmand-0.18.tar.gz
$ ./configure
$ make
$ make install
这个可能在后面加 UDF 时出错,如果找不到 so 文件的话,记的给 /usr/local/lib 加到 ldconfig 加载的路径中
测试 Gearman 的功能是否正常
先使用 earmand -u root 来启动服务,来接任务分发管理,在启动源码包中的 examples 内的 reverse_worker 和 reverse_client 来测试.
$ gearmand -u root [1] 11921 $ ./reverse_worker & Job=H:fk:81 Workload=this is a test Result=tset a si siht Job=H:fk:83 Workload=this is a test Result=tset a si siht Job=H:fk:85 Workload=this is a test Result=tset a si siht Job=H:fk:87 Workload=this is a test Result=tset a si siht Job=H:fk:89 Workload=this is a test Result=tset a si siht Job=H:fk:91 Workload=this is a test Result=tset a si siht Job=H:fk:92 Workload=this is a test Result=tset a si siht $ ./reverse_client "this is a test" Job=H:35B:1 Workload=this is a test Result=tset a si siht Result=tset a si siht
这样有正常的输出就行了。说明客户端,服务器,Worker 都运行正常。“Job=…”这行输出的信息是 reverse_worker 的。“Result=…” 这行输出的信息是 reverse_client 的.
启动 Gearman 直接推到后台
$ gearmand -u root -p 4730 -d
安装 Gearman-mysql-udf 的 MySQL 插件
http://launchpad.net/gearman-mysql-udf/trunk/0.5/+download/gearman-mysql-udf-0.5.tar.gz
在安装之前,需要安装 mysql 的开发包,因为 mysql-udf 需要使用到 mysql.h 之类的头文件
$ yum install mysql-devel
接下来配置,编译和安装
$ ./configure --with-mysql=/usr/bin/mysql_config --libdir=/usr/lib/mysql/ $ make $ make install
其中 with-mysql 是指配置程序到那找 mysql-config ,libdir 是指安装共享 udf 库到那个地方。centos5 默认使用我上面的这个就行了。
$ vim /etc/ld.so.conf.d/mysql.conf /usr/lib/mysql/ $ ldconfig
注册这些功能到 mysql 中,如果出错,就是 MySQL 不能找到 lib ,需要运行上面的步骤。
mysql -uroot -p
CREATE FUNCTION gman_do RETURNS STRING SONAME "libgearman_mysql_udf.so"; CREATE FUNCTION gman_do_high RETURNS STRING SONAME "libgearman_mysql_udf.so"; CREATE FUNCTION gman_do_low RETURNS STRING SONAME "libgearman_mysql_udf.so"; CREATE FUNCTION gman_do_background RETURNS STRING SONAME "libgearman_mysql_udf.so"; CREATE FUNCTION gman_do_high_background RETURNS STRING SONAME "libgearman_mysql_udf.so"; CREATE FUNCTION gman_do_low_background RETURNS STRING SONAME "libgearman_mysql_udf.so"; CREATE AGGREGATE FUNCTION gman_sum RETURNS INTEGER SONAME "libgearman_mysql_udf.so"; CREATE FUNCTION gman_servers_set RETURNS STRING SONAME "libgearman_mysql_udf.so";
我们可以使用下面的命令来查看加载的这些算定的功能
mysql> SELECT * FROM mysql.func;
加载这些 so 文件后,我们先设置 gearman 的服务器。
这需要使用到我们先前加载给 mysql 的一个功能 gman_server_set()。调用 Gearman MySQL UDF 之前必须调用这个,用来设备客户端用于 UDF 的服务器。
mysql> SELECT gman_servers_set("127.0.0.1"); +-------------------------------+ | gman_servers_set("127.0.0.1") | +-------------------------------+ | 127.0.0.1 | +-------------------------------+ 1 ROW IN SET (0.00 sec)
使用 Gearman-mysql-udf
设置完服务器,接下来我们可以直接对这个服务来进行任务的查询,运行操作之类,我们只要给上面加入的那几个功能,当能 MySQL 的内部函数来使用就行了。
gman_do() 将 UDF 的作业请求发送给 Gearman 的作业(worker)服务器,其中的 gman_do_high 是高优先权的作业,gman_do_background() 是指在后台作业以小优先权,只会返回主机和作业号( H:fk:23 ).
SELECT gman_do("reverse", INPUT) AS test FROM mysql.USER; SELECT gman_do_high("reverse", INPUT) AS test FROM mysql.USER; SELECT gman_do_background("reverse", INPUT) AS test FROM mysql.USER; SELECT gman_sum("wc", INPUT) AS test FROM mysql.USER;
这时 MySQL UDF 相当于标准的 Gearman 的客户端。可以直接使用 MySQL 命令进行管理,也可以用别的程序连接 MySQL 来进行操作.
我们来测试一下
SELECT gman_do("reverse",'fukai') AS test FROM mysql.USER; +-------+ | test | +-------+ | iakuf | | iakuf | | iakuf | | iakuf | | iakuf | | iakuf | +-------+ 6 ROWS IN SET (0.00 sec)
以后使用程序来操作这个就行了。
正常我们实际一环境中使用时,直接在 MySQL 中做调发器,来调用这些函数,就能实现自动使用队列了。所以当修改表中的一行时,我们完全可以使用一个 UDF 来建立一个能调用外部程序的触发器。
参考:
http://oddments.org/?p=30 New Gearman Server & Library in C, MySQL UDFs
http://oddments.org/?p=31 Gearman MySQL UDFs: URL Processing
建议继续学习:
- 无锁消息队列 (阅读:12820)
- 多线程队列的算法优化 (阅读:6515)
- TSQ 的原理 (阅读:5951)
- 各消息队列软件产品大比拼 (阅读:5155)
- 进程运行于不同的 CPU 核 (阅读:4412)
- 利用开源的Gearman框架构建分布式图片处理平台[原创] (阅读:4259)
- Gearman分布式远程过程处理框架 (阅读:3330)
- 一些队列理论 吞吐量、延迟和带宽 (阅读:3259)
- 无锁消息队列 (阅读:3202)
- 实现多线程对队列的读写操作(封装类) (阅读:3063)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:扶凯 来源: 扶凯
- 标签: Gearman UDFs 队列
- 发布时间:2011-09-07 23:17:36
- [55] Oracle MTS模式下 进程地址与会话信
- [55] IOS安全–浅谈关于IOS加固的几种方法
- [54] 如何拿下简短的域名
- [53] 图书馆的世界纪录
- [53] android 开发入门
- [52] Go Reflect 性能
- [49] 读书笔记-壹百度:百度十年千倍的29条法则
- [49] 【社会化设计】自我(self)部分――欢迎区
- [38] 程序员技术练级攻略
- [33] 视觉调整-设计师 vs. 逻辑