MySQL与Redis数据库结合——配置gearmand服务实现redis自动同步mysql数据更新(nginx+php+redis+mysql+gearmand)

在上一篇文章当中,我们实现了简单的读写分离。赋链接:MySQL与Redis数据库结合——redis作为mysql的缓存服务器,实现读写分离(nginx+php+redis+mysql)
本实验是在上一个实验的基础上实现的

一、前言

客户端读的时候去找redis缓存;客户端写的时候去找mysql
但是存在一个问题:当mysql数据库中的数据有所变化的时候,redis缓存并不能实时同步
接下来我将配置gearmand服务实现redis缓存自动同步mysql数据更新,原理如下

在这里插入图片描述Gearman是一套用来把程式需求委派给机器,提供通用的程序框架来将任务分发在机器运算。

gearman 提供了一个 work 传递其他机器,或者调用其他机器功能的框架,通过 gearman 你可以实现并行的工作,负载均衡处理,调用其他语言的函数。它可以应用在多种场合,从高可用性的 web 服务到数据库复制,换句话说,它是分布式处理的中枢神经。gearman 这一框架只负责分发要做的工作,本身并不做任何实际的工作

二、配置gearmand服务实现redis自动同步mysql数据更新

在server1上
启动gearmand服务

systemctl start gearmand

在这里插入图片描述
在server3上
步骤一:下载lib_mysqludf_json-master.zip并解压

unzip lib_mysqludf_json-master.zip

在这里插入图片描述
步骤二:安装mariadb-devel

yum install -y mariadb-devel.x86_64

在这里插入图片描述
步骤三:下载gcc

yum install -y gcc

在这里插入图片描述
步骤四:编译模块

cd lib_mysqludf_json-master
gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c

在这里插入图片描述
步骤五:将模块放到mysql插件目录

cp lib_mysqludf_json-master/lib_mysqludf_json.so /usr/lib64/mysql/plugin/

在这里插入图片描述
步骤六:登陆数据库,查看插件目录

mysql -uroot -pwestos
MariaDB [(none)]> show global variables like 'plugin_dir';

在这里插入图片描述
步骤七:注册udf函数

MariaDB [(none)]> CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so';

在这里插入图片描述
步骤八:安装libgearman

yum install -y libevent-devel-2.0.21-4.el7.x86_64.rpm libgearman-*

在这里插入图片描述
步骤九:安装插件管理gearman的分布式队列

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

在这里插入图片描述
步骤十:编译安装gearman插件

cd gearman-mysql-udf-0.6
./configure --libdir=/usr/lib64/mysql/plugin/ --with-mysql

在这里插入图片描述
步骤十一:编译安装

make && make install

在这里插入图片描述
步骤十二:注册udf函数

MariaDB [(none)]> CREATE FUNCTION gman_do_background RETURNS STRING SONAME 'libgearman_mysql_udf.so';
MariaDB [(none)]> CREATE FUNCTION gman_servers_set RETURNS STRING SONAME 'libgearman_mysql_udf.so';

在这里插入图片描述
步骤十三:查看函数

MariaDB [(none)]> select * from mysql.func;

在这里插入图片描述
步骤十四:指定gman服务信息

MariaDB [(none)]> SELECT gman_servers_set('172.25.1.1:4730');

在这里插入图片描述
步骤十五:编写mysql触发器脚本test.sql

use test;
##注释掉创建表的两行
#CREATE TABLE `test` (`id` int(7) NOT NULL AUTO_INCREMENT, `name` char(8) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
#INSERT INTO `test` VALUES (1,'test1'),(2,'test2'),(3,'test3'),(4,'test4'),(5,'test5'),(6,'test6'),(7,'test7'),(8,'test8'),(9,'test9');

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 ;

在这里插入图片描述
步骤十六:导入数据库

mysql -pwestos < test.sql

在这里插入图片描述
步骤十七:查看触发器

MariaDB [(none)]> SHOW TRIGGERS FROM test;

在这里插入图片描述
在server1上
编写gman的worker端
步骤一:编写worker.php脚本,并放到/usr/local目录下,

cp worker.php /usr/local/

在这里插入图片描述
脚本worker.php内容如下:

<?php
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction('syncToRedis', 'syncToRedis');
 
$redis = new Redis();
$redis->connect('172.25.1.2', 6379);
 
while($worker->work());
function syncToRedis($job)
{
        global $redis;
        $workString = $job->workload();
        $work = json_decode($workString);
        if(!isset($work->id)){
                return false;
        }
        $redis->set($work->id, $work->name);
}


?>

步骤二:后台运行worker

nohup php /usr/local/worker.php &> /dev/null &

在这里插入图片描述

更新测试

在server3上:
修改数据库内容

MariaDB [test]> update test set name='westos' where id=2;

在这里插入图片描述
在server2上
在redis上查看

127.0.0.1:6379> get 2
"westos"

在这里插入图片描述
此时数据已经实现同步

刷新web页面
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值