lamp架构(16)-redis持久化、redis结合mysql

一、redis持久化

Redis 提供了不同级别的持久化方式:
RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储.
AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾.Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大.
如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式.
你也可以同时开启两种持久化方式, 在这种情况下, 当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下`AOF文件保存的数据集要比RDB文件保存的数据集要完整.rdb方式一般在主从复制中用的比较多

详解链接:http://www.redis.cn/topics/persistence.html.

redis默认的持久化方式是RDB
配置文件中关于持久化的相关设置:
save 900 1                  %当有一条Keys数据被改变时,900秒刷新到Disk一次
save 300 10                 %当有10条Keys数据被改变时,300秒刷新到Disk一次
save 60 10000 				%当有10000条Keys数据被改变时,60秒刷新到Disk一次
appendonly yes       		%启用AOF持久化方式
appendfsync everysec		%每秒钟强制写入磁盘一次

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

二、redis结合mysql

方式一:

由于目前互联网巨大的访问量,在生产环境中常常需要redis结合mysql来用,如下图例,这种方式用户对redis进行读写,redis的刷盘机制使得信息可以从内存存储到硬盘上,通过特定的函数(这个函数需要自己开发,需要能够支持redis协议同时可以连接mysql)从海量的数据中过滤出有价值的信息存储到mysql中,因为redis是非关系型数据库,并不适合用来做存储,而找到数据之间的关系对数据挖掘与分析来说无疑是有重大意义的,因此我们需要将数据存储到mysql这种关系型数据库中,这样也能保证数据的稳定性,现在常见的例子有微信qq添加好友时与通信录的匹配机制,这种就属于典型的关系型数据
在这里插入图片描述

方式二:

这种方式我们可以将redis当作mysql的缓存,应用(app)所有读的操作都负载到redis上,因为redis够快,如果直接从mysql上读会对它造成巨大的压力,之前的mysql主从复制同样也是为了解决这样的问题,如果redis中没有想要的内容再从mysql中读并把读到的内容缓存到redis中。但是现在存在一个问题:当应用执行update操作时,就是往mysql中添加内容时,这时候redis无法完成更新,并且mysql无法将更改传递到redis中,因为二者的数据结构不同并且没有专门的连接端口,这时候我们该如何解决呢?
第一种传统的方式:在mysql中事先定义好触发器,通过udf(用户自定义函数)将mysql数据做映射,比如说将其映射为json数据,json数据可以跨平台传输,因此可以将json文件传递给redis从而完成数据的同步。但是这种方式从根本上是对mysql做操作,相当于给数据库创建函数对象,这种操作对数据库的侵入度是比较高的
第二种方式是目前比较主流的,阿里开发的canal应用,它直接伪装成mysql slave的身份来对mysql进行复制,相当于mysql主从复制,然后通过事先准备好的javaclient将数据同步到redis,由于主从复制是mysql本身的功能,通过mysql主从复制协议实现的,因此侵入mysql数据库的程度更小
在这里插入图片描述

下面我们将以方式二为例来演示:

1.基本的lamp架构搭建

nginx、php相关组件配置

在server2主机上进行配置:
[root@server2 ~]# cd rhel7/   
[root@server2 rhel7]# yum install -y php-* libgearman-* libevent-*  %server2上安装php-fpm
[root@server2 rhel7]# systemctl start php-fpm.service     %启动php-fpm
[root@server2 rhel7]# netstat -antulp         %查看是否开启相关端口
[root@server2 rhel7]# cd /usr/local
[root@server2 local]# cd nginx/conf/
[root@server2 conf]# cp nginx.conf.default nginx.conf
cp: overwrite ‘nginx.conf’? y
[root@server2 conf]# vim nginx.conf     %打开php站点注释
[root@server2 conf]# cd
[root@server2 ~]# vim .bash_profile     %配置环境变量
[root@server2 ~]# source .bash_profile 
[root@server2 ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@server2 ~]# nginx                 %开启nginx
[root@server2 ~]# php -m |grep mysql
mysql
mysqli
pdo_mysql
[root@server2 ~]# php -m |grep redis
redis

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

其它主机上启动redis(server3)

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

安装mysql(server4上)

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

测试文件配置

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

测试

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

2.redis与mysql的自动同步

配置 gearman 实现数据同步:
Gearman 是一个支持分布式的任务分发框架:
Gearman Job Server:Gearman 核心程序,需要编译安装并以守护进程形式运行在后台。
Gearman Client:可以理解为任务的请求者。
Gearman Worker:任务的真正执行者,一般需要自己编写具体逻辑并通过守护进程方式运行,Gearman Worker 接收到 Gearman Client 传递的任务内容后,会按顺序处理。
大致流程:下面要编写的 mysql 触发器,就相当于 Gearman 的客户端。修改表,插入表就相当于直接下发任务。然后通过 lib_mysqludf_json UDF 库函数将关系数据映射为 JSON 格式,然后再通过 gearman-mysql-udf 插件将任务加入到 Gearman 的任务队列中,最后通过redis_worker.php,也就是 Gearman 的 worker 端来完成 redis 数据库的更新。

安装lib_mysqludf_json

lib_mysqludf_json UDF 库函数将关系数据映射为 JSON 格式。通常,数据库中的数据映射为 JSON 格式,是通过程序来转换的。

在mysql主机上(server4):
yum install -y mysql-devel
unzip lib_mysqludf_json-master.zip
cd lib_mysqludf_json-master
gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c    %生成so文件

查看 mysql 的模块目录:
mysql> show global variables like 'plugin_dir';
+---------------+-------------------------+
| Variable_name | Value |
+---------------+-------------------------+
| plugin_dir | /usr/lib64/mysql/plugin |
+---------------+-------------------------+

拷贝 lib_mysqludf_json.so 模块:
cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/

注册 UDF 函数
mysql> CREATE FUNCTION json_object RETURNS STRING SONAME
'lib_mysqludf_json.so';

查看函数
mysql> select * from mysql.func;
+--------------------+-----+-------------------------+----------+
| name | ret | dl | type |
+--------------------+-----+-------------------------+----------+
| json_object | 0 | lib_mysqludf_json.so | function |
+--------------------+-----+-------------------------+----------+

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

安装 gearman-mysql-udf

这个插件是用来管理调用 Gearman 的分布式的队列。

server4上:
tar zxf gearman-mysql-udf-0.6.tar.gz
cd gearman-mysql-udf-0.6
./configure --libdir=/usr/lib64/mysql/plugin/
make
make install

注册 UDF 函数
mysql> CREATE FUNCTION gman_do_background RETURNS STRING SONAME
'libgearman_mysql_udf.so';
mysql> CREATE FUNCTION gman_servers_set RETURNS STRING SONAME
'libgearman_mysql_udf.so';

查看函数
mysql> 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 |
+--------------------+-----+-------------------------+----------+

指定 gearman 的服务信息
mysql> SELECT gman_servers_set('172.25.0.2:4730');       %指定gearman后台,负责接收mysql更改,但不负责处理,处理交给指定的worker
+------------------------------------+
| gman_servers_set('127.0.0.1:4730') |
+------------------------------------+
| 127.0.0.1:4730 |
+------------------------------------+

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

编写 gearman 的 worker 端

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

编写 mysql 触发器

客户提交update任务,然后触发器启动,通过触发器中定义的函数将数据同步到redis

vim test.sql:
use test;
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 < test.sql      %导入数据库

查看触发器
mysql> SHOW TRIGGERS FROM test;+-------------+--------+-------+------------------------------------------------------------------------
-------+----------------------+--------------------+
| 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 | latin1 |
latin1_swedish_ci | latin1_swedish_ci |
+-------------+--------+-------+------------------------------------------------------------------------
-------+----------------------+--------------------+

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

整体流程框图

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值