Redis集群,利用Gearman做MySQL的缓存服务器(lnmp架构)

  • 基本概念
    Redis 集群是一个提供在多个Redis间节点间共享数据的程序集。Redis集群并不支持处理多个keys的命令,因为这需要
    在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误.
    Redis 集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下继续处理命令.
    Redis 集群的优势:
    自动分割数据到不同的节点上。
    整个集群的部分节点失败或者不可达的情况下能够继续处理命令。

一、redis集群

1.server1将之前的redis关闭

[root@server1 ~]# /etc/init.d/redis_6379 stop

在这里插入图片描述
2.切换到/usr/local目录,创建一个rediscluster目录

[root@server1 ~]# cd /usr/local
[root@server1 local]# mkdir rediscluster
[root@server1 local]# ls

在这里插入图片描述
切换到新建目录rediscluster,再这个目录下创建6个子目录

[root@server1 local]# cd rediscluster/
[root@server1 rediscluster]# ls
[root@server1 rediscluster]# mkdir 700{1..6}
[root@server1 rediscluster]# ls
7001  7002  7003  7004  7005  7006

在这里插入图片描述
3.创建配置文件,让配置文件生效

[root@server1 rediscluster]# cd 7001
[root@server1 7001]# ls
[root@server1 7001]# vim redis.conf
[root@server1 7001]# 
[root@server1 7001]# redis-server redis.conf

  1 port 7001
  2 cluster-enabled yes
  3 cluster-config-file nodes.conf
  4 cluster-node-timeout 5000
  5 appendonly yes
  6 pidfile "/usr/local/rediscluster/7001/redis.pid"
  7 logfile "/usr/local/rediscluster/7001/redis.log"
  8 daemonize yes
  9 dir "/usr/local/rediscluster/7001"

在这里插入图片描述
在这里插入图片描述
查看进程可以看到,进程已经开启

[root@server1 7001]# ps ax

在这里插入图片描述
在这里插入图片描述
端口号也已经打开

[root@server1 7001]# netstat -tnlp

在这里插入图片描述
4.将7001编辑好的配置文件复制给每个目录中,修改相应的端口号和文件名

[root@server1 7001]# cp redis.conf  ../7002/
[root@server1 7001]# cp redis.conf  ../7003/
[root@server1 7001]# cp redis.conf  ../7004/
[root@server1 7001]# cp redis.conf  ../7005/
[root@server1 7001]# cp redis.conf  ../7006/

在这里插入图片描述
每一个目录编辑完之后再当前目录生效配置文件

 1 port 7002
  2 cluster-enabled yes
  3 cluster-config-file nodes.conf
  4 cluster-node-timeout 5000
  5 appendonly yes
  6 pidfile "/usr/local/rediscluster/7002/redis.pid"
  7 logfile "/usr/local/rediscluster/7002/redis.log"
  8 daemonize yes
  9 dir "/usr/local/rediscluster/7002"

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
5.查看进程

[root@server1 7006]# ps ax

在这里插入图片描述
在这里插入图片描述
6.切换到redis安装目录下,将src/redis-trib.rb文件复制到/usr/local/bin目录下,复制之后

redis命令可以自动补齐
[root@server1 ~]# cd redis-5.0.3
[root@server1 redis-5.0.3]# cd src/
[root@server1 src]# ls
[root@server1 src]# cp redis-trib.rb /usr/local/bin

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
7.创建集群

[root@server1 ~]# redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7001 127.0.0.1:7002 
127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006

在这里插入图片描述
在这里插入图片描述
可以看到server1,server2和server3是master,对应的slave分别是server5,server6,server4

  • 测试:

1.查看集群节点间对应关系

[root@server1 ~]# redis-cli --cluster info 127.0.0.1:7001
[root@server1 ~]# redis-cli --cluster info 127.0.0.1:7002
[root@server1 ~]# redis-cli --cluster info 127.0.0.1:7003

在这里插入图片描述
2.查看节点状态信息

[root@server1 ~]# redis-cli -c -p 7001
127.0.0.1:7001> info

在这里插入图片描述
在这里插入图片描述
上传信息之后自动转到7002

# Keyspace
127.0.0.1:7001> set name yan
-> Redirected to slot [5798] located at 127.0.0.1:7002
OK
127.0.0.1:7002> get name
"yan"
127.0.0.1:7002> quit

在这里插入图片描述
2.无中心检测

[root@server1 ~]# redis-cli -c -p 7005
127.0.0.1:7005> info

在这里插入图片描述
在这里插入图片描述
查看数据后又转到7002

# Keyspace
127.0.0.1:7005> get name
-> Redirected to slot [5798] located at 127.0.0.1:7002
"yan"
127.0.0.1:7002> quit

在这里插入图片描述

3.将7002宕掉,对应的slave7006会接替

[root@server1 ~]# redis-cli -c -p 7002
127.0.0.1:7002> shutdown
not connected> 
[root@server1 ~]# redis-cli --cluster info 127.0.0.1:7001

在这里插入图片描述
再将这个接替的master宕掉,集群会崩溃

[root@server1 ~]# redis-cli -c -p 7006
127.0.0.1:7006> shutdown
not connected> 
[root@server1 ~]# redis-cli --cluster info 127.0.0.1:7001

[root@server1 ~]# redis-cli -c -p 7001
127.0.0.1:7001> get name
(error) CLUSTERDOWN The cluster is down

在这里插入图片描述

  • 恢复集群:

重新加载7002和7006的配置文件即可

[root@server1 ~]# cd /usr/local/rediscluster/7002
[root@server1 7002]# ls
appendonly.aof  dump.rdb  nodes.conf  redis.conf  redis.log
[root@server1 7002]# redis-server redis.conf 
[root@server1 7002]# cd ../7006
[root@server1 7006]# redis-server redis.conf 

在这里插入图片描述
在这里插入图片描述
再次查看集群,已经恢复

[root@server1 7006]# redis-cli --cluster info 127.0.0.1:7001

在这里插入图片描述
查看节点信息状态,查看数据可以查看,查看后自动转到7006

[root@server1 7006]# redis-cli -c -p 7001

在这里插入图片描述
二、向已经存在的集群中添加节点

1.切换到/usr/local/rediscluster目录

[root@server1 ~]# cd /usr/local/rediscluster/
[root@server1 rediscluster]# ls
7001  7002  7003  7004  7005  7006

在这里插入图片描述
2.创建两个新的节点目录 7007 和7008

[root@server1 rediscluster]# mkdir 7007
[root@server1 rediscluster]# mkdir 7008
[root@server1 rediscluster]# ls
7001  7002  7003  7004  7005  7006  7007  7008

在这里插入图片描述
3.将7001的配置文件复制给两个新建的节点,编辑配置文件,拉起节点

[root@server1 rediscluster]# cp 7001/redis.conf 7007/
[root@server1 rediscluster]# cp 7001/redis.conf 7008/

[root@server1 rediscluster]# cd 7007
[root@server1 7007]# vim redis.conf 
[root@server1 7007]# redis-server redis.conf 

[root@server1 7007]# cd ../7008/
[root@server1 7008]# vim redis.conf 
[root@server1 7008]# redis-server redis.conf 

在这里插入图片描述
在这里插入图片描述
4.查看进程可以看到两个节点已经起来

[root@server1 7008]# ps ax

在这里插入图片描述
5.将节点添加进集群

[root@server1 7008]# redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001

在这里插入图片描述
检查集群:显示7007已经在集群中,但是没有slave

[root@server1 7008]# redis-cli --cluster check 127.0.0.1:7001

在这里插入图片描述
6.将7008作为7007的slave端加入进集群

[root@server1 7008]# redis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7007 
--cluster-slave --cluster-master-id cd59a5af9ac7fbd0674e1e9e3306e5a75ad5eda5

在这里插入图片描述
在这里插入图片描述
再次检查集群:7007和7008都加入到集群中,7007是master,7008是slave

[root@server1 7008]# redis-cli --cluster check 127.0.0.1:7001

在这里插入图片描述
7.查看集群信息,可以看到有四个master,每一个master都有一个slave,但是7007的哈希槽是0

[root@server1 7008]# redis-cli --cluster info 127.0.0.1:7001

在这里插入图片描述

  • 给新添加的节点分配哈希槽

1.手动分配,想分配多少个就分配多少个,但由于集群节点中的哈希槽不相同可能会导致数据不一致,存储出问题

[root@server1 7008]# redis-cli  --cluster reshard --cluster-from all --cluster-to 
cd59a5af9ac7fbd0674e1e9e3306e5a75ad5eda5 --cluster-slots 300 --cluster-yes 127.0.0.1:7001

在这里插入图片描述
在这里插入图片描述

  • 参数解释:
reshard表示手动分配
–cluster-from all表示从所有的节点中截取哈希槽
–cluster-to表示截取的节点要分配到那里,这里写的是集诶但的id
  • 检查:

7007有300个哈希槽

[root@server1 7008]# redis-cli --cluster check 127.0.0.1:7001

在这里插入图片描述
2.平均分配,系统自动重新平均分配,分配后每一个master的哈希槽数量是一样的

[root@server1 7008]# redis-cli --cluster rebalance  --cluster-threshold 1
 --cluster-use-empty-masters 127.0.0.1:7001

在这里插入图片描述
在这里插入图片描述
检查:

[root@server1 7008]# redis-cli --cluster check 127.0.0.1:7001

在这里插入图片描述
测试:

查看7008结点的信息和状态
可以看到他是一个slave,他的master是7007

[root@server1 7008]# redis-cli -c -p 7008
127.0.0.1:7008> info

在这里插入图片描述
在这里插入图片描述
获取数据,可以查看到,查看完之后会自动跳转到7007

# Keyspace
db0:keys=1,expires=0,avg_ttl=0
127.0.0.1:7008> get name
-> Redirected to slot [5798] located at 127.0.0.1:7007
"yan"

在这里插入图片描述
三、redis结合lnmp架构做mysql的缓存服务器
工作流程:client -> app -> redis -> mysql(如果在redis找不到数据在访问mysql) -> redis -> client

主机名IP服务
server1172.25.19.1nginx,php
server2172.25.19.2redis
server3172.25.19.3mysql
  • 将之前的集群中所有的节点都关掉

1.将server1替换掉,因为之前安装过nginx,mysql和redis,之前安装的openssl的库版本较低,我们接下来要做的饰演需要更高版本的openssl库,而之前的nginx已经将第版本的ssl编译进去,这会导致ssl升级不了,所以为了方便实验我们重新创建一个server1的快照,覆盖之前的server1

[root@foundation19 ~]# cd /var/lib/libvirt/images/
[root@foundation19 images]# ls
[root@foundation19 images]# qemu-img create -f qcow2 -b base7.3.qcow2 server1

在这里插入图片描述
创建好快照之后直接打开就可以使用

2.server1安装nginx
(1)解压安装包

[root@server1 ~]# ls
nginx-1.16.0.tar.gz
[root@server1 ~]# tar zxf nginx-1.16.0.tar.gz 
[root@server1 ~]# ls
nginx-1.16.0  nginx-1.16.0.tar.gz

[root@server1 ~]# cd nginx-1.16.0
[root@server1 nginx-1.16.0]# 

在这里插入图片描述
(2)安装依赖性

[root@server1 nginx-1.16.0]# yum install -y gcc zlib-devel pcre-devel

在这里插入图片描述
(3)关闭debug日志

[root@server1 nginx-1.16.0]# vim auto/cc/gcc 

在这里插入图片描述
(4)编译安装

[root@server1 nginx-1.16.0]# ./configure --prefix=/usr/local/nginx
[root@server1 nginx-1.16.0]# make && make install

在这里插入图片描述
在这里插入图片描述
(5)编辑配置文件,打开php,添加默认测试页index.php

[root@server1 ~]# cd /usr/local/nginx
[root@server1 nginx]# ls
conf  html  logs  sbin
[root@server1 nginx]# vim conf/nginx.conf
[root@server1 nginx]# 
[root@server1 nginx]# sbin/nginx -t

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(6)打开服务,可以看到80端口打开

[root@server1 nginx]# sbin/nginx
[root@server1 nginx]# netstat -tnlp

在这里插入图片描述

3.安装php
(1)下载php以及需要的依赖性

[root@server1 ~]# ls
nginx-1.16.0  nginx-1.16.0.tar.gz  rhel7
[root@server1 ~]# 

在这里插入图片描述
(2)安装所有的包

[root@server1 ~]# cd rhel7/
[root@server1 rhel7]# ls
[root@server1 rhel7]# yum install -y *

在这里插入图片描述
(3)开启php服务,查看端口号9000已经打开

[root@server1 rhel7]# systemctl start php-fpm
[root@server1 rhel7]# 
[root@server1 rhel7]# netstat -tnlp

在这里插入图片描述
4.在/usr/local/nginx/html目录下编写一个测试页index.php

[root@server1 ~]# cd /usr/local/nginx/html/
[root@server1 html]# ls
50x.html  index.html
[root@server1 html]# vim test.php 
[root@server1 html]# 
[root@server1 html]# ls
50x.html  index.html  test.php
[root@server1 html]# 
[root@server1 html]# mv test.php index.php
[root@server1 html]# ls
50x.html  index.html  index.php

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  <?php
            $redis = new Redis();
            $redis->connect('172.25.19.2',6379) or die ("could net connect redis server");
      #      $query = "select * from test limit 9";
            $query = "select * from test";
            for ($key = 1; $key < 10; $key++)
            {
                    if (!$redis->get($key))
                    {
                            $connect = mysql_connect('172.25.19.3','redis','redhat');
                            mysql_select_db(test);
                            $result = mysql_query($query);
                            //如果没有找到$key,就将该查询sql的结果缓存到redis
                            while ($row = mysql_fetch_assoc($result))
                            {
                                    $redis->set($row['id'],$row['name']);
                            }
                            $myserver = 'mysql';
                            break;
                    }
                    else
                    {
                            $myserver = "redis";
                            $data[$key] = $redis->get($key);
                    }
    
            }
    
        echo $myserver;
        echo "<br>";
        for ($key = 1; $key < 10; $key++)
        {
                echo "number is <b><font color=#FF0000>$key</font></b>";

                echo "<br>";

                echo "name is <b><font color=#FF0000>$data[$key]</font></b>";

                echo "<br>";
        }
?>

在这里插入图片描述
重新加载nginx服务

[root@server1 html]# ../sbin/nginx -s reload

在这里插入图片描述

  • 配置server2

因为之前安装配置过redis,server2的redis是一个slave,所以编辑配置文件,删除slave的配置即可

1.编辑配置文件,删除最后一行

[root@server2 ~]# cd /etc/redis/
[root@server2 redis]# ls
6379.conf  sentinel.conf
[root@server2 redis]# vim 6379.conf 

在这里插入图片描述
2.开启redis服务

[root@server2 redis]# /etc/init.d/redis_6379 start
Starting Redis server...

在这里插入图片描述
3.删除之前的数据,查看当前状态

[root@server2 redis]# redis-cli
127.0.0.1:6379> get name
"yan"
127.0.0.1:6379> DEL name
(integer) 0
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> info

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 配置server3

1.关闭mysqld服务,卸载mysql

[root@server3 ~]# systemctl stop mysqld
[root@server3 ~]# 
[root@server3 ~]# rpm -e `rpm -qa | grep mysql` --nodeps
warning: /etc/my.cnf saved as /etc/my.cnf.rpmsave

在这里插入图片描述

2.安装mariadb

[root@server3 ~]# yum install -y mariadb-server

在这里插入图片描述
3.删除数据目录下的数据,开启mariadb

[root@server3 ~]# cd /var/lib/mysql/
[root@server3 mysql]# ls

[root@server3 mysql]# rm -fr *
[root@server3 mysql]# ls 
[root@server3 mysql]# systemctl start mariadb

在这里插入图片描述
4.安全初始化

[root@server3 mysql]# mysql_secure_installation 

在这里插入图片描述
在这里插入图片描述
5.登陆数据库,创建test库,创建redis用户并授权

[root@server3 mysql]# mysql -p
Enter password: 
MariaDB [(none)]> show databases;
MariaDB [(none)]> create database test;

MariaDB [(none)]> grant all on test.* to redis@'%' identified by 'redhat';
MariaDB [(none)]> flush privileges;

在这里插入图片描述
6.将test.sql倒入数据库

[root@server3 ~]# ls
redis-5.0.3  test.sql
[root@server3 ~]# mysql -predhat < test.sql 

在这里插入图片描述
7.查看test库中的数据

[root@server3 ~]# mysql -p 
MariaDB [(none)]> use test;
MariaDB [test]> show tables;

+----------------+
| Tables_in_test |
+----------------+
| test           |
+----------------+

MariaDB [test]> select * from test
    -> ;
+----+-------+
| id | name  |
+----+-------+
|  1 | test1 |
|  2 | test2 |
|  3 | test3 |
|  4 | test4 |
|  5 | test5 |
|  6 | test6 |
|  7 | test7 |
|  8 | test8 |
|  9 | test9 |
+----+-------+

在这里插入图片描述
在这里插入图片描述

  • 访问测试:
  • 打开浏览器访问server1的ip访问到的是mysql
    在这里插入图片描述
  • 刷新一下访问到的是redis,之后在刷新访问的一直是redis
    在这里插入图片描述

命令行访问测试:

[root@server2 redis]# redis-cli
127.0.0.1:6379> get 1
"test1"
127.0.0.1:6379> get 2
"test2"

在这里插入图片描述

  • 补充:

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 ;

分布式的任务分发管理器
通过server1分发任务
数据库当前不支持实时更新数据加一个函数

  • 修改数据后再测试:

1.server3在数据库中修改一个数据

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

MariaDB [test]> select * from test;
+----+--------+
| id | name   |
+----+--------+
|  1 | westos |

在这里插入图片描述
2.server2中redis查看 没有改变,浏览器查看也没有改变

[root@server2 redis]# redis-cli
127.0.0.1:6379> get 1
"test1"

在这里插入图片描述
在这里插入图片描述
3.server2再修改一个数据,浏览器查看改变了,但是数据库中没有改变

127.0.0.1:6379> set 2 westos
OK
127.0.0.1:6379> get 2
"westos"

MariaDB [test]> select * from test;
+----+--------+
| id | name   |
+----+--------+
|  1 | westos |
|  2 | test2  |

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
总结:当前情况下,在mysql端或者redis端改变数据,在浏览器中查看不会同步改变,在没有修改的另一端查看数据也不会同步,这样在实际应用中显然是不合理的

四、配置gearman实现数据同步

同步过程:mysql -> update -> trigger -> json_map -> mysql plugin -> gearman(server) -> worker(php-gearman/php-redis) -> redis

  • mysql 触发器,就相当于 Gearman 的客户端。修改表,插入表就相当于直接下发任务。然后通过 lib_mysqludf_json UDF 库函数将关系数据映射为 JSON 格式,然后在通过 gearman-mysql-udf 插件将任务加入到 Gearman 的任务队列中,最后通过redis_worker.php,也就是 Gearman 的 worker 端来完成 redis 数据库的更新

1.Gearman 是一个支持分布式的任务分发框架

2.Gearman Job Server:Gearman 核心程序,需要编译安装并以守护进程形式运行在后台

3.Gearman Client:可以理解为任务的请求者

4.Gearman Worker:任务的真正执行者,一般需要自己编写具体逻辑并通过守护进程方式运行,Gearman Worker 接收到 Gearman Client 传递的任务内容后,会按顺序处理

  • server1

1.开启gearmand服务(之前在安装php的时候我们已经安装过gearman的包)

[root@server1 html]# systemctl start gearmand
[root@server1 html]# systemctl status gearmand

在这里插入图片描述

  • (server3)mysql端:

1.下载一个lib_mysqludf_json-master的包,安装unzip命令,解压安装包

[root@server3 ~]# ls
lib_mysqludf_json-master.zip  redis-5.0.3  test.sql
[root@server3 ~]# yum install -y unzip
[root@server3 ~]# ls
lib_mysqludf_json-master.zip  redis-5.0.3  test.sql
[root@server3 ~]# unzip lib_mysqludf_json-master.zip 
[root@server3 ~]# ls

在这里插入图片描述
在这里插入图片描述
2.安装依赖性,安装lib_mysqludf_json
(1)切换到安装目录

[root@server3 ~]# ls
lib_mysqludf_json-master  lib_mysqludf_json-master.zip  redis-5.0.3  test.sql

[root@server3 lib_mysqludf_json-master]# ls

在这里插入图片描述
(2)安装依赖性

[root@server3 lib_mysqludf_json-master]# yum install -y mariadb-devel
[root@server3 lib_mysqludf_json-master]# yum install -y gcc

在这里插入图片描述
在这里插入图片描述
(3)gcc编译

[root@server3 lib_mysqludf_json-master]# gcc $(mysql_config --cflags) -shared 
-fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c

在这里插入图片描述
(4)将lib_mysqludf_json.so模块复制到mysql插件库中

[root@server3 lib_mysqludf_json-master]# cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/

在这里插入图片描述
(5)登陆数据库可以查看到插件目录

[root@server3 lib_mysqludf_json-master]# mysql -p
Enter password: 
MariaDB [(none)]> show global variables like 'plugin_dir';
+---------------+--------------------------+
| Variable_name | Value                    |
+---------------+--------------------------+
| plugin_dir    | /usr/lib64/mysql/plugin/ |
+---------------+--------------------------+

在这里插入图片描述
3.安装gearman软件包,安装php的gearman扩展程序
(1)解压gearman-mysql-udf安装包

[root@server3 ~]# ls
gearman-mysql-udf-0.6.tar.gz  lib_mysqludf_json-master.zip  test.sql
lib_mysqludf_json-master      redis-5.0.3
[root@server3 ~]# tar zxf gearman-mysql-udf-0.6.tar.gz 

在这里插入图片描述
(2)server1将libevent-devel-2.0.21-4.el7.x86_64.rpm, libgearman-1.1.12-18.el7.x86_64.rpm , libgearman-devel-1.1.12-18.el7.x86_64.rpm 三个包传给server3

[root@server1 rhel7]# scp libevent-devel-2.0.21-4.el7.x86_64.rpm libgearman-* server3:

在这里插入图片描述
(3)server3安装这三个包

[root@server3 ~]# yum install -y libevent-devel-2.0.21-4.el7.x86_64.rpm  libgearman-*

在这里插入图片描述
(4)编译安装

[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

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

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

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;
+--------------------+-----+-------------------------+----------+
| name               | ret | dl                      | type     |
+--------------------+-----+-------------------------+----------+
| json_object        |   0 | lib_mysqludf_json.so    | function |
| gman_do_background |   0 | libgearman_mysql_udf.so | function |
| gman_servers_set   |   0 | libgearman_mysql_udf.so | function |
+--------------------+-----+-------------------------+----------+
3 rows in set (0.00 sec)

在这里插入图片描述
5.指定gearman服务信息

MariaDB [(none)]> select gman_servers_set('172.25.19.1:4730');
+--------------------------------------+
| gman_servers_set('172.25.19.1:4730') |
+--------------------------------------+
| 172.25.19.1:4730                     |
+--------------------------------------+

在这里插入图片描述
6.编写触发器,导入数据库

[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 

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

[root@server3 ~]# mysql -p

MariaDB [(none)]> show triggers from test;
+-------------+--------+-------+----------------------------------------------------------------------------------------------------------------+--------+---------+----------+----------------+----------------------+----------------------+--------------------+
| Trigger     | Event  | Table | Statement                                                                                                      | Timing | Created | sql_mode | Definer        | character_set_client | collation_connection | Database Collation |
+-------------+--------+-------+----------------------------------------------------------------------------------------------------------------+--------+---------+----------+----------------+----------------------+----------------------+--------------------+
| 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 | utf8                 | utf8_general_ci      | latin1_swedish_ci  |
+-------------+--------+-------+----------------------------------------------------------------------------------------------------------------+--------+---------+----------+----------------+----------------------+----------------------+--------------------+

在这里插入图片描述

  • 配置worker

1.编写gearman的worker端

<?php
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction('syncToRedis', 'syncToRedis');

$redis = new Redis();
$redis->connect('172.25.19.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);
}
?>

[root@server1 ~]# vim worker.php 
[root@server1 ~]# 
[root@server1 ~]# cp worker.php /usr/local
[root@server1 ~]# 

在这里插入图片描述
在这里插入图片描述
2.后台运行worker

[root@server1 ~]# nohup php /usr/local/worker.php &>/dev/null &
[1] 15278
[root@server1 ~]# 
[root@server1 ~]# ps ax

在这里插入图片描述
在这里插入图片描述

  • 测试:

mysql修改数据

MariaDB [(none)]> use test;
MariaDB [test]> update test set name='redhat' where id=2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

MariaDB [test]> select * from test;
+----+--------+
| id | name   |
+----+--------+
|  1 | westos |
|  2 | redhat |
|  3 | test3  |
|  4 | test4  |
|  5 | test5  |
|  6 | test6  |
|  7 | test7  |
|  8 | test8  |
|  9 | test9  |
+----+--------+
9 rows in set (0.00 sec)

在这里插入图片描述

  • 浏览器中刷新以下就可以看到数据更新
    在这里插入图片描述
    redis查看也可以看到

    127.0.0.1:6379> get 2
      "redhat"
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值