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

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

文章目录

    • 一、前言
    • 二、配置gearmand服务实现redis自动同步mysql数据更新
        • 更新测试

一、前言

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

MySQL与Redis数据库结合——配置gearmand服务实现redis自动同步mysql数据更新(nginx+php+redis+mysql+gearmand)_第1张图片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

MySQL与Redis数据库结合——配置gearmand服务实现redis自动同步mysql数据更新(nginx+php+redis+mysql+gearmand)_第2张图片
步骤二:安装mariadb-devel

yum install -y mariadb-devel.x86_64

MySQL与Redis数据库结合——配置gearmand服务实现redis自动同步mysql数据更新(nginx+php+redis+mysql+gearmand)_第3张图片
步骤三:下载gcc

yum install -y gcc

MySQL与Redis数据库结合——配置gearmand服务实现redis自动同步mysql数据更新(nginx+php+redis+mysql+gearmand)_第4张图片
步骤四:编译模块

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';

MySQL与Redis数据库结合——配置gearmand服务实现redis自动同步mysql数据更新(nginx+php+redis+mysql+gearmand)_第5张图片
步骤七:注册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-*

MySQL与Redis数据库结合——配置gearmand服务实现redis自动同步mysql数据更新(nginx+php+redis+mysql+gearmand)_第6张图片
步骤九:安装插件管理gearman的分布式队列

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

MySQL与Redis数据库结合——配置gearmand服务实现redis自动同步mysql数据更新(nginx+php+redis+mysql+gearmand)_第7张图片
步骤十:编译安装gearman插件

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

MySQL与Redis数据库结合——配置gearmand服务实现redis自动同步mysql数据更新(nginx+php+redis+mysql+gearmand)_第8张图片
步骤十一:编译安装

make && make install

MySQL与Redis数据库结合——配置gearmand服务实现redis自动同步mysql数据更新(nginx+php+redis+mysql+gearmand)_第9张图片
步骤十二:注册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;

MySQL与Redis数据库结合——配置gearmand服务实现redis自动同步mysql数据更新(nginx+php+redis+mysql+gearmand)_第10张图片
步骤十四:指定gman服务信息

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

MySQL与Redis数据库结合——配置gearmand服务实现redis自动同步mysql数据更新(nginx+php+redis+mysql+gearmand)_第11张图片
步骤十五:编写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与Redis数据库结合——配置gearmand服务实现redis自动同步mysql数据更新(nginx+php+redis+mysql+gearmand)_第12张图片
步骤十六:导入数据库

mysql -pwestos < test.sql

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

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

MySQL与Redis数据库结合——配置gearmand服务实现redis自动同步mysql数据更新(nginx+php+redis+mysql+gearmand)_第13张图片
在server1上
编写gman的worker端
步骤一:编写worker.php脚本,并放到/usr/local目录下,

cp worker.php /usr/local/

MySQL与Redis数据库结合——配置gearmand服务实现redis自动同步mysql数据更新(nginx+php+redis+mysql+gearmand)_第14张图片
脚本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;

MySQL与Redis数据库结合——配置gearmand服务实现redis自动同步mysql数据更新(nginx+php+redis+mysql+gearmand)_第15张图片
在server2上
在redis上查看

127.0.0.1:6379> get 2
"westos"

MySQL与Redis数据库结合——配置gearmand服务实现redis自动同步mysql数据更新(nginx+php+redis+mysql+gearmand)_第16张图片
此时数据已经实现同步

刷新web页面
MySQL与Redis数据库结合——配置gearmand服务实现redis自动同步mysql数据更新(nginx+php+redis+mysql+gearmand)_第17张图片

你可能感兴趣的:(Linux企业实战)