Redis分布式集群(5)——gearmand服务实现redis自动同步mysql数据更新(lnmp)

一、前言

客户端读的时候去找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

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页面:

在这里插入图片描述

发布了99 篇原创文章 · 获赞 3 · 访问量 1593

猜你喜欢

转载自blog.csdn.net/weixin_45784367/article/details/105267281