[文章作者:张宴 本文版本:v1.0 最后修改:2010.09.08 转载请注明原文链接:http://blog.zyan.cc/mysql-udf-http/]

  Mysql-udf-http 是一款简单的MySQL用户自定义函数(UDF, User-Defined Functions),具有http_get()、http_post()、http_put()、http_delete()四个函数,可以在MySQL数据库中利用HTTP协议进行REST相关操作。

  项目网址http://code.google.com/p/mysql-udf-http/
  中文说明http://blog.zyan.cc/mysql-udf-http/
  使用环境:Linux操作系统,支持的MySQL版本:5.1.x 和 5.5.x。5.0.x未经测试。
  软件作者:张宴



  一、REST架构风格:

  REST(Representational State Transfer)是一种轻量级的Web Service架构风格,其实现和操作明显比SOAP和XML-RPC更为简洁,可以完全通过HTTP协议实现,还可以利用缓存Cache来提高响应速度,性能、效率和易用性上都优于SOAP协议。REST最早是由 Roy Thomas Fielding 博士2000年在论文《Architectural Styles and the Design of Network-based Software Architectures》中提出的,中文译文全文PDF点此下载。另外,有篇译文对REST做了一个简化说明。

  目前,REST架构风格的常见实现是基于HTTP协议及其四种基本方法(如POST、GET、PUT和DELETE)的。有人将HTTP协议的四种方法与CRUD原则相对应,CRUD原则对于资源只需要四种行为:Create(创建)、Read(读取)、Update(更新)和Delete(删除)就可以完成对其操作和处理。

  点击在新窗口中浏览此图片

  点击在新窗口中浏览此图片

  在Mysql-udf-http中,四个函数http_post()、http_get()、http_put()、http_delete()分别对应HTTP协议的POST、GET、PUT、DELETE四种方法。

  REST是一种架构风格,而不是协议或标准。HTTP协议“POST、GET、PUT、DELET”四种方法与CRUD原则“Create、Read、Update、Delete”四种行为的一一对应关系只是一种架构设计习惯,而不是规范。因此,POST方法也可以用来更新资源,PUT方法也可以用来创建资源,这就要看具体应用程序作者的定义了。例如Tokyo Tyrant除了支持Memcached协议外,还支持REST方式存取,PUT代表创建和更新,GET代表读取,DELETE代表删除(关于Tokyo Tyrant的安装使用请点击这儿)。

  目前国内外流行的Web 2.0应用API接口中,很多都支持REST架构风格。例如:新浪微博开放平台人人网API、Google OpenID、Flickr、Twitter、eBay、Facebook、Last.fm、del.icio.us、Yahoo Search、Amazon S3、Amazon EC2、Digg、Microsoft Bing、FriendFeed、PayPal、Foursquare,更多...

  当记录数成百上千万条时,通常采用 MySQL 分表减低数据库压力。但是,全部数据按点击数、精华、积分排序显示等功能,在MySQL 分表中则无法实现。编写 Mysql-udf-http 的最初目的,是为了在项目开发中,将 MySQL 各分表的数据自动同步到我们的 TCSQL 高速列表数据库,用来做列表查询、显示,内容页则根据ID直接查询各 MySQL 分表的内容。由于HTTP协议的通用性,通过 Mysql-udf-http 可以做更多的事情。

  通过Mysql-udf-http,你可以在MySQL中利用触发器,将MySQL的数据同步到支持REST的应用上。例如你有一个独立博客,你可以在文章表创建MySQL触发器,这样,在发表文章时,就可以将文章标题、URL自动同步到新浪微博、Twitter。你想用 Tokyo Tyrant 做缓存,也可以利用MySQL触发器在发生增、删、改时,将数据自动同步到 Tokyo Tyrant。详细配置方法本文第4节中会有介绍。



  二、Mysql-udf-http的安装与使用:

  1. 在Linux系统上安装Mysql-udf-http

  注意:“/usr/local/webserver/mysql/”是你的MySQL安装路径,如果你的MySQL安装路径不同,请自行修改。

ulimit -SHn 65535
wget http://curl.haxx.se/download/curl-7.21.1.tar.gz
tar zxvf curl-7.21.1.tar.gz
cd curl-7.21.1/
./configure --prefix=/usr
make && make install
cd ../

echo "/usr/local/webserver/mysql/lib/mysql/" > /etc/ld.so.conf.d/mysql.conf
/sbin/ldconfig
wget http://mysql-udf-http.googlecode.com/files/mysql-udf-http-1.0.tar.gz
tar zxvf mysql-udf-http-1.0.tar.gz
cd mysql-udf-http-1.0/
./configure --prefix=/usr/local/webserver/mysql --with-mysql=/usr/local/webserver/mysql/bin/mysql_config
make && make install
cd ../




  2. 通过命令行登陆进入MySQL

/usr/local/webserver/mysql/bin/mysql -S /tmp/mysql.sock




  3. 创建MySQL自定义函数

  mysql>


  4. 使用方法

  I. 函数描述:

  mysql>
  II. 示例 A:

  mysql>
  III. 示例

  通过MySQL触发器,利用mysql-udf-http和第三方UDF函数lib_mysqludf_json,自动同步数据到 Tokyo Tyrant。

  (1). 下载安装 lib_mysqludf_json 修改版:

  以下安装包适合32位Linux操作系统:
wget http://mysql-udf-http.googlecode.com/files/lib_mysqludf_json-i386.tar.gz
tar zxvf lib_mysqludf_json-i386.tar.gz
cd lib_mysqludf_json-i386/
# 如果你的MySQL安装路径不是/usr/local/webserver/mysql/,请修改以下路径。
cp -f lib_mysqludf_json.so /usr/local/webserver/mysql/lib/mysql/plugin/lib_mysqludf_json.so
cd ../


  以下安装包适合64位Linux操作系统:
wget http://mysql-udf-http.googlecode.com/files/lib_mysqludf_json-x86_64.tar.gz
tar zxvf lib_mysqludf_json-x86_64.tar.gz
cd lib_mysqludf_json-x86_64/
# 如果你的MySQL安装路径不是/usr/local/webserver/mysql/,请修改以下路径。
cp -f lib_mysqludf_json.so /usr/local/webserver/mysql/lib/mysql/plugin/lib_mysqludf_json.so
cd ../


  通过命令行登陆进入MySQL:
/usr/local/webserver/mysql/bin/mysql -S /tmp/mysql.sock


  mysql>  lib_mysqludf_json的详细用法请访问:http://www.mysqludf.org/lib_mysqludf_json/

  (2). 创建测试表

  mysql>
  (3). 为测试表创建触发器:

  mysql>
  (4). 将 MySQL 表和 Tokyo Tyrant 关联进行查询:

  mysql>


  5. 如何删除mysql-udf-http UDF函数:

  mysql>


技术大类 » 数据库技术 | 评论(95) | 引用(0) | 阅读(105988)
shiny Homepage
2010-9-8 19:16
参观学习。
bqrm
2010-9-8 21:15
很赞!
伟伟
2010-9-8 22:43
思路挺好的,不知道数据同步的稳定性如何?毕竟是基于HTTP的
太阳里的雪 Homepage
2010-9-8 23:24
好象大量使用mysql触发器会出现性能问题,mysql的触发器对性能影响比较严重~~
张宴 回复于 2010-9-9 09:21
如果MySQL主库写入量较大,担心性能问题,也可以拿一台无查询操作的空闲MySQL从库,在上面建立触发器,用于同步。
怪物宝
2010-9-8 23:41
好东西,先试试
kth007
2010-9-9 09:07
好东西,,先占位!!
kimi
2010-9-9 12:28
Mr,张。
问一个与该文章无关的问题,如何异步从memcached中刷数据到mysql中?我crontab是一种解决方案,如果数据量太大了该如何呢?
johntech
2010-9-9 13:19
宴哥,威武!
starlight36 Homepage
2010-9-9 20:44
啊,终于抢到第一页了~~grin
GaoXiao Homepage
2010-9-9 21:48
Mr.Zhang又有新博文发布,先顶再研究文章
shadow Email Homepage
2010-9-12 08:51
不错,学习下。最近感觉mysql的服务端查询多了压力有点大
uohzoaix
2010-9-12 14:29
为什么我在创建自定义函数时出现mysql-udf-http.so:cannot open shared object file:no such file or directory.我在机器上已经找到了此文件所在的目录,并将目录都添加到了/etc/ld.so.conf文件中。怎么还是不行?
张宴 回复于 2010-9-13 09:43
检查 /usr/local/webserver/mysql/lib/mysql/plugin/ 下是否有mysql-udf-http.so文件。如果你的MySQL UDF plugin目录不是/usr/local/webserver/mysql/lib/mysql/plugin/,可以在MySQL中执行SQL:show variables like '%plug%'; 查看你的plugin目录是什么,将mysql-udf-http.so拷贝到该目录即可。
ass
2010-9-13 10:53
很奇怪,我的环境下,执行 create function lib_mysqludf_json_info returns string soname 'lib_mysqludf_json.so';  这步会让MYSQL崩溃,5.1.45及5.4.2版本均是此现象。
错误日志内容:
100913  9:30:59 - mysqld got signal 8 ;
This could be because you hit a bug. It is also possible that this binary
or one of the libraries it was linked against is corrupt, improperly built,
or misconfigured. This error can also be caused by malfunctioning hardware.
We will try our best to scrape up some info that will hopefully help diagnose
the problem, but since we have already crashed, something is definitely wrong
and this may fail.

key_buffer_size=16777216
read_buffer_size=262144
max_used_connections=1
max_threads=151
threads_connected=1
It is possible that mysqld could use up to
key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 133889 K
bytes of memory
Hope that's ok; if not, decrease some variables in the equation.

thd: 0x37cf3a0
Attempting backtrace. You can use the following information to find out
where mysqld died. If you see no messages after this, something went
terribly wrong...
stack_bottom = 0x4dc971a0 thread_stack 0x40000
/usr/local/mysql/bin/mysqld(my_print_stacktrace+0x2e)[0x89f80e]
/usr/local/mysql/bin/mysqld(handle_segfault+0x322)[0x5c4422]
/lib64/tls/libpthread.so.0[0x3977c0c430]
/lib64/ld-linux-x86-64.so.2[0x3976d074d7]
/lib64/ld-linux-x86-64.so.2[0x3976d0789e]
/lib64/ld-linux-x86-64.so.2[0x3976d08c70]
/lib64/tls/libc.so.6[0x39771f7ad8]
/lib64/ld-linux-x86-64.so.2[0x3976d0aab0]
/lib64/tls/libc.so.6(_dl_open+0xaa)[0x39771f846a]
/lib64/libdl.so.2[0x3976f01054]
/lib64/ld-linux-x86-64.so.2[0x3976d0aab0]
/lib64/libdl.so.2[0x3976f01552]
/lib64/libdl.so.2(dlopen+0x32)[0x3976f01092]
/usr/local/mysql/bin/mysqld(_Z21mysql_create_functionP3THDP11st_udf_func+0x231)[0x6e7661]
/usr/local/mysql/bin/mysqld(_Z21mysql_execute_commandP3THD+0x22c5)[0x5d69c5]
/usr/local/mysql/bin/mysqld(_Z11mysql_parseP3THDPKcjPS2_+0x357)[0x5da287]
/usr/local/mysql/bin/mysqld(_Z16dispatch_command19enum_server_commandP3THDPcj+0xe93)[0x5db123]
/usr/local/mysql/bin/mysqld(_Z10do_commandP3THD+0xe6)[0x5db9e6]
/usr/local/mysql/bin/mysqld(handle_one_connection+0x246)[0x5ce326]
/lib64/tls/libpthread.so.0[0x3977c0610a]
/lib64/tls/libc.so.6(__clone+0x73)[0x39771c68c3]
Trying to get some variables.
Some pointers may be invalid and cause the dump to abort...
thd->query at 0x3822ce0 = create function lib_mysqludf_json_info returns string soname 'lib_mysqludf_json.so'
thd->thread_id=2
thd->killed=NOT_KILLED
The manual page at http://dev.mysql.com/doc/mysql/en/crashing.html contains
information that should help you find out what is causing the crash.
100913 09:30:59 mysqld_safe Number of processes running now: 0
100913 09:30:59 mysqld_safe mysqld restarted
100913  9:30:59 [Note] Plugin 'FEDERATED' is disabled.
InnoDB: The InnoDB memory heap is disabled。。

反复尝试,错误依旧,不知在MYSQL版本及权限有何需要注意的没? 谢谢
行人
2010-9-13 22:29
很不错~
jstfnifypm
2010-9-14 17:38
宴哥  强大 顶下
niniwzw
2010-9-14 18:15
这种东西还是从应用层解决比较的好,感觉mysql 的功能还是纯粹点,不要太花哨。
arlon
2010-9-16 16:04
安装都好了,但是遇到下面的问题:

mysql> create function http_post returns string soname 'mysql-udf-http.so';
ERROR 1126 (HY000): Can't open shared library 'mysql-udf-http.so' (errno: 22 /usr/share/mysql/lib/mysql/plugin/mysql-udf-http.so: failed to map segment from shared object: Permission denied)

不知道如何解决。
arlon
2010-9-17 13:22
问题已经解决,我的系统时ubuntu,执行:/etc/init.d/apparmor stop
然后再执行create就好了

参考:http://forums.mysql.com/read.php?117,298997,299641#msg-299641
吕滔 Email Homepage
2010-9-20 09:49
呵呵。。、

这个东西还用不到,,现在还在研究你那个NGINX了。。。那书我都有点看不懂。。。
ugg boots Email Homepage
2010-9-21 17:22
路过进来学习下!祝博主中秋快乐!
分页: 1/5 第一页 1 2 3 4 5 下页 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]