修改mysql触发redis_实现mysql和redis之间的触发数据同步——mysql 触发器+gearman+php.worker...

上回一次我们已经实现了 redis 作为 mysql 的缓存服务器,但是如果更新了 mysql,redis

中仍然会有对应的 KEY,数据就不会更新,此时就会出现 mysql 和 redis 数据不一致的情

况。

详情请见基于redis缓存数据库实现lnmp架构高速访问

所以接下来就要通过 mysql 触发器将改变的数据同步到 redis 中。

因为mysql和redis数据格式不同,不能实现直接同步,所以

将MySQL数据首先放入Gearman中,然后通过一个自己编写的PHP Gearman Worker,将数据同步到Redis。

Gearman 是一个支持分布式的任务分发框架:

Gearman Job Server: Gearman 核心程序,需要编译安装并以守护进程形式运行在后台。

Gearman Client:可以理解为任务的请求者。

Gearman Worker:任务的真正执行者,一般需要自己编写具体逻辑并通过守护进程方式运行.

Gearman Worker 接收到 Gearman Client 传递的任务内容后,会按顺序处理。

大致流程:

1)下面要编写的 mysql 触发器,就相当于 Gearman 的客户端。

2)修改表,插入表就相当于直接下发任务。

3)再通过 lib_mysqludf_json UDF 库函数将关系数据映射为 JSON 格式

4)再通过 gearman-mysql-udf 插件将任务加入到 Gearman 的任务队列中

5)最后通过redis_worker.php,也就是 Gearman 的 worker 端来完成 redis 数据库的更新。

详细配置见下文...

server12(lnmp)

php装载gearman插件//yum install rubygems-1.3.7-5.el6.noarch.rpm -y

cd /mnt/redis/

yum install libgearman-* lib* -y

yum install gearmand-1.1.8-2.el6.x86_64.rpm -y

tar zxf gearman-1.1.2.tgz

cd gearman-1.1.2

phpize     #进入预编译环境

./configure

make && make install

ls /usr/lib64/php/modules    #查看当前模块

cd /etc/php.d/

cp mysql.ini gearman.ini

vim gearman.ini

2 extension=gearman.so/etc/init.d/php-fpm restart

查看gearman模块是否添加成功.

查看mysql redis gearman 模块是否都添加成功...[root@server12 php.d]# php -m |grep gearman

gearman

[root@server12 php.d]# php -m |grep mysql

mysql

mysqli

pdo_mysql

[root@server12 php.d]# php -m |grep redis

redis

vim worker.php1 <?php

2 $worker = new GearmanWorker();

3 $worker->addServer();

4 $worker->addFunction(‘syncToRedis‘, ‘syncToRedis‘);

5

6 $redis = new Redis();

7 $redis->connect(‘172.25.88.13‘, 6379);    #redis数据库所在的主机IP

8

9 while($worker->work());

10 function syncToRedis($job)

11 {

12         global $redis;

13         $workString = $job->workload();

14         $work = json_decode($workString);

15         if(!isset($work->id)){

16                 return false;

17         }

18         $redis->set($work->id, $work->name);

19 }

20 ?>[root@server12 redis]# nohup php worker.php &>/dev/null &   #不间断地运行命令。

[root@server12 redis]# ps ax

1361 pts/0    S      0:00 php worker.php

[root@server12 php.d]# /etc/init.d/gearmand start

Starting gearmand:                                         [  OK  ]

[root@server12 php.d]# netstat -antlpue |grep 4730

tcp        0      0 0.0.0.0:4730                0.0.0.0:*                   LISTEN      495        17787      3594/gearmand

tcp        0      0 :::4730                     :::*                        LISTEN      495        17788      3594/gearmand

server11:数据库

生成libgearman_mysql_udf模块

这个插件是用来管理调用 Gearman 的分布式的队列。

yum install mysql-devel -y

tar zxf gearman-mysql-udf-0.6.tar.gz

yum install lib* -y

[root@server11 redis]# ll lib*

-rw-r--r-- 1 root root  67428 Apr  2 21:43 libevent-1.4.13-4.el6.x86_64.rpm

-rw-r--r-- 1 root root  75620 Apr  2 21:43 libevent-devel-1.4.13-4.el6.x86_64.rpm

-rw-r--r-- 1 root root 198408 Apr  2 21:43 libevent-doc-1.4.13-4.el6.noarch.rpm

-rw-r--r-- 1 root root  30460 Apr  2 21:43 libevent-headers-1.4.13-4.el6.noarch.rpm

-rw-r--r-- 1 root root  71272 Apr  2 21:43 libgearman-1.1.8-2.el6.x86_64.rpm

-rw-r--r-- 1 root root 219472 Apr  2 21:43 libgearman-devel-1.1.8-2.el6.x86_64.rpm

./configure --with-mysql=/usr/bin/mysql_config --libdir=/usr/lib64/mysql/plugin/

make && make install

注册 UDF 函数mysql> CREATE FUNCTION gman_do_background RETURNS STRING SONAME

-> ‘libgearman_mysql_udf.so‘;

Query OK, 0 rows affected (0.00 sec)

mysql> CREATE FUNCTION gman_servers_set RETURNS STRING SONAME

-> ‘libgearman_mysql_udf.so‘;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from mysql.func;

+--------------------+-----+-------------------------+----------+

| name               | ret | dl                      | type     |

+--------------------+-----+-------------------------+----------+

| gman_do_background |   0 | libgearman_mysql_udf.so | function |

| gman_servers_set   |   0 | libgearman_mysql_udf.so | function |

+--------------------+-----+-------------------------+----------+

2 rows in set (0.00 sec)

生成lib_mysqludf_json.so模块

lib_mysqludf_json UDF 库函数将关系数据映射为 JSON 格式。通常,数据库中的数据映

射为 JSON 格式,是通过程序来转换的.

[root@server11 lib_mysqludf_json-master]# gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c

[root@server11 lib_mysqludf_json-master]# ls

lib_mysqludf_json.c     lib_mysqludf_json.so   README.md

lib_mysqludf_json.html  lib_mysqludf_json.sql

[root@server11 lib_mysqludf_json-master]# cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/

注册 json 函数mysql> CREATE FUNCTION json_object RETURNS STRING SONAME

-> ‘lib_mysqludf_json.so‘;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from mysql.func;

+--------------------+-----+-------------------------+----------+

| name               | ret | dl                      | type     |

+--------------------+-----+-------------------------+----------+

| gman_do_background |   0 | libgearman_mysql_udf.so | function |

| gman_servers_set   |   0 | libgearman_mysql_udf.so | function |

| json_object        |   0 | lib_mysqludf_json.so    | function |

+--------------------+-----+-------------------------+----------+

3 rows in set (0.00 sec)

编写 mysql 触发器

vim test.sqlDELIMITER $$

CREATE TRIGGER datatoredis AFTER UPDATE ON test FOR EACH ROW BEGIN

SET @RECV=gman_do_background(‘syncToRedis‘, json_object(NEW.id as `id`, NEW.name as `name`));

END$$

DELIMITER ;

[root@server11 redis]# mysql < test.sql

查看触发器mysql> SHOW TRIGGERS FROM test;

| datatoredis | UPDATE | test  | BEGIN

SET @RECV=gman_do_background(‘syncToRedis‘, json_object(NEW.id as `id`, NEW.name as `name`));

END | AFTER  | NULL    |          | root@localhost | latin1               | latin1_swedish_ci    | latin1_swedish_ci  |

+-------------+--------+-------+--------------------------------------------------

指定 gearman 的服务信息mysql> select gman_servers_set(‘172.25.88.12:4730‘);    #gearman所在的主机

+---------------------------------------+

| gman_servers_set(‘172.25.88.12:4730‘) |

+---------------------------------------+

| 172.25.88.12:4730                     |

+---------------------------------------+

1 row in set (0.00 sec)

server13(redis):

简单配置保证redis服务开启即可.

详细配置移步:

基于redis缓存数据库实现lnmp架构高速访问

检验

server11:

mysql> update test.test set name =‘ddd‘ where id =3;

server12:

[root@server13 redis]# redis-cli

127.0.0.1:6379> get 3 "ddd"

更新mysql数据库的值,也能实时同步到redis中,并被客户端获取

客户端:

浏览器访问 http://172.25.88.12/

223ac92e847deb316656c92650393068.png

本文出自 “12049878” 博客,谢绝转载!

实现mysql和redis之间的触发数据同步——mysql 触发器+gearman+php.worker

标签:mysql   json   数据同步   redis   gearman

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:http://12059878.blog.51cto.com/12049878/1913989

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值