实现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 模块是否都添加成功...

[[email protected] php.d]# php -m |grep gearmangearman[[email protected] php.d]# php -m |grep mysqlmysqlmysqlipdo_mysql[[email protected] php.d]# php -m |grep redisredis

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 ?>
[[email protected] redis]# nohup php worker.php &>/dev/null &   #不间断地运行命令。

[[email protected] redis]# ps ax 1361 pts/0    S      0:00 php worker.php

[[email protected] php.d]# /etc/init.d/gearmand startStarting gearmand:                                         [  OK  ][[email protected] php.d]# netstat -antlpue |grep 4730tcp        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 -ytar zxf gearman-mysql-udf-0.6.tar.gzyum install lib* -y[[email protected] 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 格式,是通过程序来转换的.

[[email protected] lib_mysqludf_json-master]# gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c[[email protected] lib_mysqludf_json-master]# lslib_mysqludf_json.c     lib_mysqludf_json.so   README.mdlib_mysqludf_json.html  lib_mysqludf_json.sql[[email protected] 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.sql

DELIMITER $$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 ;

[[email protected] 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    |          | [email protected] | 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:

[[email protected] redis]# redis-cli

127.0.0.1:6379> get 3 "ddd"

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

客户端:

浏览器访问 http://172.25.88.12/

时间: 2024-12-24 06:30:17

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

使用MySQL Migration Toolkit快速将Oracle数据导入MySQL[转]

使用MySQL Migration Toolkit快速将Oracle数据导入MySQL上来先说点废话本人最近在学习一些数据库方面的知识,之前接触过Oracle和MySQL,最近又很流行MongoDB非关系型数据库,所以干脆一起研究一下,对比学习中找不同,首先说一下本人使用的数据库版本和可视化工具Oracle10G—PL/SQL Developer9MySQL5.5.29—MySQL Workbench6.0MongoDB2.4.9(32bit最大2G)—Robomongo0.8.4为了保持数据的

etcd安装部署及数据同步MySQL

一.etcd说明及原理 二.etcd安装部署说明 三.etcd操作说明 四.python安装etcd 五.python-etcd使用说明 六.通过脚本获取本地的信息上传到etcd 七.通过脚本将etc的数据同步到mysql 一.etcd 简介 etcd是用于共享配置和服务发现的分布式,一致的键值存储,重点是: 简单:定义明确,面向用户的API(gRPC) 安全:使用可选的客户端证书认证的自动TLS 快速:基准测试10,000写/秒 可靠:使用Raft协议来进行合理的分布式 etcd是在Go中编写

centos6,mysql 5.5 配置 master \ slave 数据同步备份

数据库A 做为主服务,数据库B做为同步库(注: 两边数据库库必须要一至,要不然会有不断的错误信息出来,改啊改,就是不成功) 1.配置 master vi /etc/my.cnf [mysqld] server-id=1 log-bin=log path binlog-do-db=xxxx //表示只备份xxxx这个库 ,可以配置多个库 binlog-ignore-db=yyy //表示忽略yyy库 注: 如果binlog-do-db,binlog-ignore-db不加会默认备份全部库 重启数据

MySQL函数转储存(当前月数据同步)

1 BEGIN 2 declare a1 int default 0;#第一次循环的循环变量 3 declare a2 int default 0; 4 declare b1 int default 0; 5 declare b2 int default 0; 6 declare c1 int default 0; 7 declare c2 int default 0; 8 declare d1 int default 0; 9 declare d2 int default 0; 10 decl

转载:MySQL和Redis 数据同步解决方案整理

from: http://blog.csdn.net/langzi7758521/article/details/52611910 最近在做一个Redis箱格信息数据同步到数据库Mysql的功能. 自己想了想,也有大概方案. 1.队列同步,变跟数据2份,使用消息队列,一份给Redis消费,一份给Mysql消费. 2.后台定时任务,定时刷新Redis中箱格信息到数据库. 网上也到处找了下解决方案,发现这么个问题,居然是天下一大抄,还抄的一字不差,我也抄吧. 方案一: 读: 读redis->没有,读

线上项目mysql、redis平滑迁移方案及步骤

1.清晰系统内网及公网可达,CVM配置 2.迁移完整数据,项目部署,测试网络环境. redis:复制rdb文件mysql:xtrabackup备份3.确保项目正常运行,网络正常访问.项目对外接口及账户中心访问可达.4.初始化redis,mysql.5.配置网络环境,同步mysql 1.主库创建同步账号,配置腾讯云mysql为从并可写.配置log-bin 2.主库xtrabackup备份,设置从库导入.获取同步点,启动从库(可写),校验状态.6.配置网络环境,同步redis 1.配置腾讯云redi

使用MySQLMigrationToolkit快速将Oracle数据导入MySQL

使用MySQL Migration Toolkit快速将Oracle数据导入MySQL 上来先说点废话 本人最近在学习一些数据库方面的知识,之前接触过Oracle和MySQL,最近又很流行MongoDB非关系型数据库,所以干脆一起研究一下,对比学习中找不同,首先说一下本人使用的数据库版本和可视化工具 Oracle10G—PL/SQL Developer9 MySQL5.5.29—MySQL Workbench6.0 MongoDB2.4.9(32bit最大2G)—Robomongo0.8.4 为

【转】mysql数据库读写分离数据同步

转载请注明来源:mysql数据库读写分离数据同步 mysql数据库读写分离数据同步 我是用了两个xp(一个主的,一个从的)的系统测试成功的,linux系统我也做测试了,没有成功,不过我想我所遇到的问题是同一个问题,xp下的可以成功,linux下的应该也可以成功,稍候会测试,然后更新结果! PS:刚测试了下linux 可以同步成功,主服务器是xp,从服务器是centos,可以成功. 例: A机器 192.168.0.2 B机器 192.168.0.3 两个机器可以ping通,互相访问 先配置主服务

Mysql 主从服务器数据同步

安装2台windows Server 服务器,分别安装Mysql,配置环境变量,完成安装确认在CMD窗口可以使用Mysql命令 在Master服务器上创建同步账号,确保Slave服务器能访问Master服务器数据库Master DB Server IP:10.10.0.144Slave DB Server IP:10.10.0.145Mysql > grant replication slave on *.* to [email protected] identified by 'Passwor