MySQL与Redis数据库结合(二)——基于lnmp配置gearmand实现Redis和MySQL数据同步(lnmp+redis+mysql+gearmand)

一、基于lnmp配置gearmand实现Redis和MySQL数据同步

我们本篇博客解决的就是:如何将mysql端修改的数据及时更新到rdis端,实现数据同步。

1.什么是Gearmand?

Gearmand是一个用来把工作委派给其它机器、分布式的调用更适合做某项工作的机器、并发的做某项工作在多个调用间做负载均衡、或用来调用其它语言的函数的系统。简单来讲,就是客户端程序把请求提交给gearmand,gearmand会把请求转发给合适的worker来处理这个请求,最后还通过gearmand返回结果。

运行流程:
Client --> Job --> Worker

  • Client 请求发起者,客户端程序可以是任何一种语言:C 、PHP 、Perl 、Python等。
  • Job 请求调度者,负载协调把 Client 发出的请求转发给合适的Worker。
  • Worker 请求处理者,处理 Job 分发来的请求,可以是任何一种语言

2.部署过程

在server1中启动gearmand:

systemctl start gearmand
systemctl status gearmand

在这里插入图片描述
在server3中:

yum install unzip -y
unzip lib_mysqludf_json-master.zip 

安装 mariadb-devel:

yum install -y mariadb-devel.x86_64

编译模块:

yum install gcc -y
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/

登陆数据库,在数据库中查看:

[root@server3 lib_mysqludf_json-master]# mysql -uroot -predhat
MariaDB [(none)]> show global variables like 'plugin_dir';

在这里插入图片描述
注册udf函数,并查看。

MariaDB [(none)]> CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so';
MariaDB [(none)]> select * from mysql.func;

在这里插入图片描述
安装libgearman安装包,并安装管理gearman的分布式队列插件,进行编译和安装

[root@server3 ~]# yum install libgearman-* libevent-devel-2.0.21-4.el7.x86_64.rpm  -y
[root@server3 ~]# tar zxf gearman-mysql-udf-0.6.tar.gz 
[root@server3 ~]# cd gearman-mysql-udf-0.6
[root@server3 gearman-mysql-udf-0.6]# ls
[root@server3 gearman-mysql-udf-0.6]# ./configure -libdir=/usr/lib64/mysql/plugin/ --with-mysql
[root@server3 gearman-mysql-udf-0.6]# 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;

在这里插入图片描述
指定german服务信息:

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

在这里插入图片描述
编写mysql触发器脚本test.sql,并导入test数据库

[root@server3 ~]# vim 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 ;

[root@server3 ~]# mysql -predhat < test.sql 
[root@server3 ~]# mysql -uroot -predhat 

在这里插入图片描述
在这里插入图片描述
查看触发器

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

在这里插入图片描述
在server1中:
编写gman的worker端:开启gearmand服务并查看其端口号4730是否开启

[root@server1 ~]# systemctl start gearmand
[root@server1 ~]# netstat -antlpe
cd /usr/local
vim worker.php 

<?php
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction('syncToRedis', 'syncToRedis');
 
$redis = new Redis();
$redis->connect('172.25.254.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 &

在这里插入图片描述

3.测试

修改数据库内容:

MariaDB [(none)]> use test;
MariaDB [test]> update test set name='westos' where id=2;
MariaDB [test]> select * from test;

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

redis-cli
127.0.0.1:6379> get 2
"westos"

在这里插入图片描述
在页面查看,数据同步:
在这里插入图片描述
此时,就实现了Redis和MySQL数据同步了。

发布了184 篇原创文章 · 获赞 7 · 访问量 3600

猜你喜欢

转载自blog.csdn.net/weixin_43936969/article/details/105076254