设为首页 收藏本站
查看: 438|回复: 0

[经验分享] 实现mysql和redis之间的触发数据同步——mysql 触发器+gearman+php.worker

[复制链接]

尚未签到

发表于 2018-9-30 12:03:58 | 显示全部楼层 |阅读模式

  上回一次我们已经实现了 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.php
  1
[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.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 ;
  [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>server12:
  [root@server13 redis]# redis-cli
  127.0.0.1:6379> get 3 "ddd"
  更新mysql数据库的值,也能实时同步到redis中,并被客户端获取
  客户端:
  浏览器访问 http://172.25.88.12/
DSC0000.png




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-606713-1-1.html 上篇帖子: 【mysql基础】06、mysql连接相关 下篇帖子: Linux上mysql修改密码的几种方法和mysql忘记密码的修改方式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表