实现mysql和redis之间的触发数据同步——mysql 触发器+gearman+php.worker
2017-04-07 21:20
651 查看
上回一次我们已经实现了 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 数据库的更新。
查看gearman模块是否添加成功.
查看mysql redis gearman 模块是否都添加成功...
vim worker.php
注册 UDF 函数
生成lib_mysqludf_json.so模块lib_mysqludf_json UDF 库函数将关系数据映射为 JSON 格式。通常,数据库中的数据映
射为 JSON 格式,是通过程序来转换的.
注册 json 函数
查看触发器
指定 gearman 的服务信息
详细配置移步:
基于redis缓存数据库实现lnmp架构高速访问
更新mysql数据库的值,也能实时同步到redis中,并被客户端获取
客户端:浏览器访问 http://172.25.88.12/ href="https://s5.51cto.com/wyfs02/M01/8F/A8/wKioL1jni_zzXoNcAABLzhMEbOo974.png" target=_blank>
中仍然会有对应的 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.php
1 <?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/ href="https://s5.51cto.com/wyfs02/M01/8F/A8/wKioL1jni_zzXoNcAABLzhMEbOo974.png" target=_blank>
相关文章推荐
- JAVA通过Gearman实现MySQL到Redis的数据同步(异步复制)
- 通过Gearman实现MySQL到Redis的数据同步
- 通过Gearman实现MySQL到Redis的数据同步
- 通过Gearman实现MySQL到Redis的数据同步,继而实现读写分离
- 通过Gearman实现MySQL到Redis的数据同步
- 通过Gearman实现MySQL到Redis的数据同步
- centos7 下安装canal,并实现将mysql数据同步到redis
- 通过Gearman实现MySQL到Redis的数据同步
- Redis配置主从数据,实现主从库之间数据同步
- JAVA通过Gearman实现MySQL到Redis的数据同步(异步复制)
- 通过Gearman实现MySQL到Redis的数据同步(异步复制)
- 通过Gearman实现MySQL到Redis的数据同步
- redis作为mysql的缓存服务器(读写分离,通过mysql触发器实现数据同步)
- 通过Gearman实现MySQL到Redis的数据同步
- 通过Gearman实现MySQL到Redis的数据同步
- 使用databus实现oracle和内存数据库redis之间的数据同步
- JAVA通过Gearman实现MySQL到Redis的数据同步(异步复制)
- 通过Gearman实现MySQL到Redis的数据同步(异步复制)
- Gearman + Nodejs + MySQL UDF异步实现 MySQL 到 Redis 的数据同步
- redis与mysql数据同步