阿里P7架构师教你部署Redis作为MySQL缓存

168 阅读4分钟

server1:192.168.1.11 安装nginx和php为用户提供服务访问入口

server3:192.168.1.13 安装mysql,存储数据

server2:192.168.1.12 安装redis作为缓存服务器,缓存mysql数据

一、搭建LNMP+Redis

1. server1安装nginx和php以及php相关插件

安装nginx

解压

tar zxf nginx-1.18.0.tar.gz

阿里P7架构师教你部署Redis作为MySQL缓存

vim auto/cc/gcc ###这一步是为了取消debug模式,比较省空间,可以不做

阿里P7架构师教你部署Redis作为MySQL缓存

安装依赖

yum install -y pcre-devel zlib-devel


编译

./configure --prefix=/usr/local/nginx

阿里P7架构师教你部署Redis作为MySQL缓存

安装

make && make install

阿里P7架构师教你部署Redis作为MySQL缓存

阿里P7架构师教你部署Redis作为MySQL缓存

安装php及相关插件 gearman(后面会用到,为了实现redis更新mysql内容)

阿里P7架构师教你部署Redis作为MySQL缓存

配置nginx为系统服务

vim /usr/lib/systemd/system/nginx.service

阿里P7架构师教你部署Redis作为MySQL缓存

软连接,将nginx配置文件连接到/etc下

ln -s /usr/local/nginx/conf/nginx.conf /etc/

修改nginx配置文件如下

vim /etc/nginx.conf

阿里P7架构师教你部署Redis作为MySQL缓存

阿里P7架构师教你部署Redis作为MySQL缓存

阿里P7架构师教你部署Redis作为MySQL缓存

开启nginx测试

systemctl start nginx.service

浏览器测试访问

阿里P7架构师教你部署Redis作为MySQL缓存

开启php,编写php页面测试

systemctl start php-fpm.service

阿里P7架构师教你部署Redis作为MySQL缓存

阿里P7架构师教你部署Redis作为MySQL缓存

浏览器测试访问

阿里P7架构师教你部署Redis作为MySQL缓存

2. server2安装redis

上一篇讲过安装redis步骤,这里就跳过了,详情见

https://blog.csdn.net/qq_36023219/article/details/106179458

打开redis

阿里P7架构师教你部署Redis作为MySQL缓存

3. server3安装数据库

这里直接用官方yum源自带的mariadb

yum install -y mariadb-server

阿里P7架构师教你部署Redis作为MySQL缓存

启动服务

systemctl start mariadb.service

安全初始化

mysql_secure_installation ###初始密码为空,直接回车即可

阿里P7架构师教你部署Redis作为MySQL缓存

登陆数据库

mysql -uroot -p密码

阿里P7架构师教你部署Redis作为MySQL缓存

授权

grant all on *.* to redis@'%' identified by 'redhat';

flush privileges;

阿里P7架构师教你部署Redis作为MySQL缓存

二、编写php测试页面,创建测试数据

vim index.php

阿里P7架构师教你部署Redis作为MySQL缓存

根据自己实际情况更改redis和mysql绑定的ip端口,创建对应的数据库,比如我这里是testdb,所以下一步,在mysql创建对应数据库,以及内容

use testdbCREATE TABLE `test` (`id` int(7) NOT NULL AUTO_INCREMENT, `name` char(8) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;INSERT INTO `test` VALUES (1,'sven'),(2,'jim'),(3,'zhu'),(4,'wang'),(5,'ftd'),(6,'test'),(7,'test01'),(8,'test02'),(9,'test03');

测试

浏览器访问

阿里P7架构师教你部署Redis作为MySQL缓存

这是第一次访问,redis中没有key,从mysql中缓存数据到redis

再访问

阿里P7架构师教你部署Redis作为MySQL缓存

第二次访问,因为redis'中有key,所以直接从redis中获取数据

到此为止已经实现了redis缓存mysql数据,但如果mysql数据更新了,而redis不会去主动同步mysql数据,会造成redis缓存和mysql数据不同步。

解决方法:通过mysql触发器,当更新时触发同步,使得redis和mysql数据一致。

三、gearman实现mysql和redis同步

1. 介绍

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

  • Gearman Job Server:Gearman核心程序,需要编译安装并以守护进程形式运行在后台。
  • Gearman Client:可以理解为任务的请求者。
  • Gearman Worker:任务的真正执行者,一般需要自己编写具体逻辑并通过守护进程方式运行,Gearman Worker接收到Gearman Client传递的任务内容后,会按顺序处理。

我们在最开始安装php插件时已经安装了gearman

下面要编写的mysql触发器,就相当于Gearman的客户端。

修改表,插入表就相当于直接下发任务。

  • 通过lib_mysqludf_json UDF库函数将关系数据映射为JSON格式
  • 再通过gearman-mysql-udf插件将任务加入到Gearman的任务队列中
  • 最后通过redis_worker.php,也就是Gearman的worker端来完成redis数据库的更新。

2. 安装lib_mysqludf_json

先安装mariadb开发包,否则不支持udf(用户自定义函数)

yum install -y mariadb-devel

阿里P7架构师教你部署Redis作为MySQL缓存

解压lib_mysqludf_json安装包并编译

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

阿里P7架构师教你部署Redis作为MySQL缓存

将编译好的插件复制到mysql插件目录

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

注册udf函数

CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so';

阿里P7架构师教你部署Redis作为MySQL缓存

3. 安装gearman-mysql-udf

获取安装包和相关依赖

阿里P7架构师教你部署Redis作为MySQL缓存

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

解压gearman-mysql-udf

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

阿里P7架构师教你部署Redis作为MySQL缓存

编译

./configure --with-mysql=/usr/bin/mysql_config --libdir=/usr/lib64/mysql/plugin/

阿里P7架构师教你部署Redis作为MySQL缓存

阿里P7架构师教你部署Redis作为MySQL缓存

安装

make && make install

阿里P7架构师教你部署Redis作为MySQL缓存

注册函数

CREATE FUNCTION gman_do_background RETURNS STRING SONAME 'libgearman_mysql_udf.so';

CREATE FUNCTION gman_servers_set RETURNS STRING SONAME 'libgearman_mysql_udf.so';

阿里P7架构师教你部署Redis作为MySQL缓存

注册完成可以查看下mysql的函数

select * from mysql.func;

阿里P7架构师教你部署Redis作为MySQL缓存

设置gearman的server,我们是在server1安装的gearman,所以这里填写server1的ip(gearman默认端口4730)

select gman_servers_set('192.168.1.11:4730');

阿里P7架构师教你部署Redis作为MySQL缓存

可以打开server1的gearman,验证下端口

阿里P7架构师教你部署Redis作为MySQL缓存

编写mysql触发器

use testdb

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 ;

阿里P7架构师教你部署Redis作为MySQL缓存

查看定义的触发器

show triggers from testdb;

阿里P7架构师教你部署Redis作为MySQL缓存

在server1编写gearman的worker

vim syncRedis_worker.php

阿里P7架构师教你部署Redis作为MySQL缓存

运行这个php

nohup php syncRedis_worker.php &> /dev/null &

阿里P7架构师教你部署Redis作为MySQL缓存

测试:

原来访问的数据

阿里P7架构师教你部署Redis作为MySQL缓存

mysqll端更新数据

阿里P7架构师教你部署Redis作为MySQL缓存

浏览器访问

阿里P7架构师教你部署Redis作为MySQL缓存

可以看到,数据已经更新

访问redis,查看数据,已经更新为新数据

阿里P7架构师教你部署Redis作为MySQL缓存

至此,本文关于部署Redis作为MySQL缓存的介绍结束了,如果你看完觉得有用,还望不吝转发

原文链接:
https://blog.csdn.net/qq_36023219/article/details/106229527