0
点赞
收藏
分享

微信扫一扫

Redis之Redis集群、持久化到mysql、与mysql数据同步

慕容冲_a4b8 2022-08-22 阅读 71

一、Redis集群

1.Redis集群介绍及环境搭建

请添加图片描述
请添加图片描述redis集群需要开多个redis实例,如果每个实例开一台虚拟机的话,需要的资源太多了,所以下面用源码自带的脚本在一台主机上开多个实例并组建集群。
关闭之前实验的sentinel,因为redis集群自带高可用。
在这里插入图片描述

先关闭之前实验所创建的redis实例以及mysql。
在这里插入图片描述在这里插入图片描述在这里插入图片描述
使用源码自带的脚本创建多个redis实例
在这里插入图片描述在这里插入图片描述在这里插入图片描述创建6个redis实例可以理解为6个节点(不想开太多虚拟机,所以在一个主机上创建了6个实例),再利用create命令组成集群
六个redis实例组成3组一主一从架构
在这里插入图片描述
在这里插入图片描述

2.redis集群管理

通过redis-cli命令接入集群以及管理集群

[root@server1 ~]# redis-cli -c -p 30001  #接入集群
127.0.0.1:30001> 

redis集群是无中心化,也就是说从任何一个节点都可以接入集群
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

Redis集群介绍

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

注意当这16384个哈希槽,任何一个出现了问题,导致集群哈希槽不完整,集群就不可用。好在集群自带了负载均衡和高可用,也不需要做读写分离,因为任何一个节点都可以读写,只要在外层加一层负载均衡就行,nginx、hproxy七层或者lvs四层负载均衡,不需要做端口转发。

停掉master节点,再校验集群
在这里插入图片描述使用脚本,重启实例
在这里插入图片描述
当主从节点都挂掉时,哈希槽将不再完整,集群不可用。
在这里插入图片描述恢复集群
在这里插入图片描述

3.扩展redis集群节点并分配哈希槽

修改脚本增加两个节点

appendonly类似于mysql的二进制日志追加的方式,RDB用于主从复制是一个内存快照
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
将节点添加到集群
在这里插入图片描述
在这里插入图片描述将30008节点以30007节点slave的身份加入集群
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从集群中其他节点迁移哈希槽给新master节点

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

在不同节点上搭建并使用Redis集群方法
在这里插入图片描述
回收集群
关闭slave节点,并清除节点
在这里插入图片描述

二、redis持久化

Redis持久化官方介绍

redis和mysql数据同步,我们要做的是从redis里读数据,写数据往mysql数据库里写,当redis里没有的时候从数据库里加载
几种redis与mysql整合的方案
请添加图片描述
请添加图片描述
redis与mysql整合有很多种设计方法,在大厂的实际生产环境中因为数据量庞大所以通常会做解藕,也就是微服务会更加灵活,适合企业的敏捷开发(Devops),但是解藕也意味着复杂度增加,因为原来是一个整体分成了不同的块、组件,不同的组件进行切分、解藕,运维成本也会相应增加。

以下实验案例对数据库版本又要求,因为UDF函数的设计方式要给数据库编译一个json-object模块,mysql5.7以后的版本自带该模块,会有冲突,所以将数据库版本降一下。因为之前在server1上搭建lamp架构时,源码编译的php编本比较高,比系统自带的php-mysql、php-redis模块版本高,在新的节点server3上搭建lamp架构。

redis作mysql数据库的缓存架构

主机用途
server2搭建redis服务
server3搭建lamp架构
server4搭建mariadb服务

1.server4创建数据库服务

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

2.server2主机节点搭建redis服务(master状态)

在这里插入图片描述

3.server3搭建lamp架构

在这里插入图片描述
在server3上搭建带有php模块的lamp架构
重新源码编译nginx
在这里插入图片描述解决开发包依赖性
在这里插入图片描述检验操作系统的依赖性
在这里插入图片描述
源码编译安装
在这里插入图片描述

修改nginx的配置文件,启动Nginx服务
在这里插入图片描述在这里插入图片描述

在这里插入图片描述

安装php

安装php-fpm
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述安装php-mysql模块
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在nginx发布目录下放置php发布页面
在这里插入图片描述在这里插入图片描述在这里插入图片描述开启php-fpm
在这里插入图片描述

4.server4(mysql数据库)导入数据并对redis用户进行授权

server4上通过test.sql导入数据库,以下是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 

在这里插入图片描述
在这里插入图片描述
数据库建立redis用户并进行授权
在这里插入图片描述

5.浏览器访问测试

第一次访问可以看到是从数据库中取到的数据
在这里插入图片描述在这里插入图片描述

修改数据库中的数据可以发现redis中的数据并没有同步,因为只要redis中已经有了数据就不会从再从数据库中取
在这里插入图片描述
在这里插入图片描述
当删除redis中的数据时,客户端通过浏览器发起请求,查询redis中没有,就会转向后端数据库查询,命中后会返回数据到客户端,同时将数据存到redis,下次再请求该数据,将由redis直接返回数据到客户端,不再转到mysql。
在这里插入图片描述
在这里插入图片描述上面的案例已经完成了redis作为数据库的缓冲,但是数据库数据变更没有同步到redis,下面解决redis与数据库的数据同步问题

6、结合gearmand实现redis与数据库数据同步

gearmand的安装与使用示例
运行流程图
在这里插入图片描述
Client:任务发起者
Job:任务分配者
Worker:任务处理者
支持 mysql、pq、sqlit、brizzle、memcachedb做持久化存储
可开启多个进程,支持failover(自动故障转移)

首先需要给数据库安装两个外部的函数,这对数据库有一定的侵入性

会有安全性问题,现在大都选择侵入性低的软件,比如阿里的canal通过将自身伪装成mysql的slave,通过mysql主从复制实现,对数据库主库没有任何的侵入性。这只是将数据从mysql同步过来,但是如何同步到redis需要编码写客户端,从kafka大数据队列中消费。
在这里插入图片描述
不建议mysql更新的数据由mysql的plugin直接同步到redis,不做解藕数据量大时,会容易出问题,中间最好由分布式的分发框架来做同步。
下载安装 lib_mysqludf_json库函数,添加到数据库的plugin模块中

请添加图片描述

lib_mysqludf_json UDF 库函数将关系数据映射为 JSON 格式。通常,数据库中的数据映射为 JSON 格式,是通过程序来转换的。mysql数据与redis数据不同,一个是关系型数据,一个是非关系型,JSON是跨平台的,所以将数据映射为 JSON 格式。

库函数安装包下载位置
在这里插入图片描述

库函数需要编译,安装gcc和mariadb-devel
请添加图片描述
如果数据库用的mysql,则下载mysql-devel开发包,最新的mysql有原生的json,会冲突,所以用的系统自带的mariadb。
编译的是mysql-udf函数,作用是当mysql更新完数据后,将数据映射成可以跨平台的json数据
在这里插入图片描述
进入数据库,查看数据库模块所在位置

在这里插入图片描述
在这里插入图片描述注册 UDF 函数
在这里插入图片描述
安装 gearman-mysql-udf

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述编译并安装数据库模块
在这里插入图片描述
在这里插入图片描述
利用编译好的请添加图片描述
模块注册UDF函数

在这里插入图片描述查看数据库函数
请添加图片描述
在server3(Lamp架构端主机)安装gearman-server,也就是服务器端gearmand。
在这里插入图片描述
在这里插入图片描述
数据库(servre4)指定 gearman 的服务信息
在这里插入图片描述在这里插入图片描述数据库创建触发器,由触发器调用创建的自定义函数,当数据库更改时就激活触发器,由触发器依次调用三个自定义函数。

在这里插入图片描述
在这里插入图片描述server3的gearman服务端收到数据后,需要分发给woker,也就是消费端。服务端就相当于消息队列,需要消费端去消费队列中的数据。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
php添加gearman模块
在这里插入图片描述php平滑加载geatman模块
在这里插入图片描述
在这里插入图片描述

php执行worker.php 并打入后台:
在这里插入图片描述
在这里插入图片描述测试:
在这里插入图片描述
在这里插入图片描述
上述案例redis以异步方式同步mysql中的数据。只要application将数据写到mysql中,mysql触发器检测到更新,先将数据映射为json,再通过Gearman将数据分配到woker消费端,woker将数据同步到redis。然后读取的话,就直接从redis中进行读取。这就是redis作为mysql缓存的架构

举报

相关推荐

0 条评论