redis集群环境搭建

redis集群环境搭建

说明:本案例模拟生产环境,使用六台装有redis的linux服务器(CentOS7),实现三主三从集群环境的搭建

一、集群环境介绍

redis高可用方案有四种,分别为:
(1)数据持久化RDB和AOF,redis4.0之后,引入RDB+AOF混合持久化
(2)主从复制,即数据读写分离
(3)哨兵模式(redis-sentinel),引入sentinel哨兵监控,实现自动故障恢复,弥补了主从复制下,主节点发生故障,需要人工介入手动恢复的不足

主从复制、哨兵模式虽然提高了读的并发,但是单个master容量是有限的,如果写操作的并发提高,那么redis就会达到性能的瓶颈,此时,就需要引入第四种高可用方案–集群部署

redis cluster是redis3.0之后推出的分布式集群解决方案,当遇到单机内存、并发、流量等瓶颈的时候,redis cluster可以起到很好的负载均衡的作用

redis cluster根据投票容错机制,需要半数以上主节点同意的原则,因此搭建redis集群至少需要6个节点(3主3从),其中主节点提供读写功能,从节点只作为备用节点,提供故障转移的作用,redis cluster采用虚拟槽分区,所有键根据哈希函数映射到0~16383个哈希槽内,每个节点负责一部分槽以及槽内映射的键值数据

redis cluster特点:

  • 去中心化,分散写的压力,便于进行横向扩展
  • 部分节点出现故障,仍然不影响集群的正常运行,只有当主节点和它对应的从节点全部都出现故障时,集群环境才会不可用
  • 集群模式包含了主从复制+哨兵模式

二、集群模式(三主三从)架构图

redis集群架构图

三、集群环境搭建

集群搭建前置条件:6台安装redis的linux服务器,也可选择一台服务器,搭建6个节点的伪集群环境

  1. 执行vim redis.conf命令修改6台redis服务器的redis配置文件
#开启集群模式
cluster-enabled yes
#每个节点需要一个配置文件,每个节点在集群的角色需要告知其他节点
cluster-config-file node-6379.conf
#设置超时时间,如果连接超过指定时间,则认为节点发生故障,自动切换至备用节点
cluster-node-timeout 5000
#开启AOF
appendonly yes
  1. 创建集群环境,redis3.0版本后引入集群,redis5.0之前,需要通过ruby工具,结合redis安装包下提供的redis-trib.rb脚本,实现集群搭建,redis5.0之后,redis-trib.rb被集成到redis-cli中,本案例使用的redis版本是6.2.5,因此该案例直接通过redis-cli相关命令进行集群环境搭建(随机在一台服务器上执行即可)
#执行以下命令,搭建集群环境
#其中执行redis-cli命令需要先进入redis安装bin目录下
#ip1:port1 ip2:port2 ip3:port3 ip4:port4 ip5:port5 ip6:port6 会对主从节点进行随机分配
#--cluster-replicas 1 声明一主对应一从的关系
redis-cli --cluster create ip1:port1 ip2:port2 ip3:port3 ip4:port4 ip5:port5 ip6:port6 --cluster-replicas 1

集群环境搭建


注:执行集群创建命令前,需要将6台redis服务器启动,否则该命令无法成功执行
3. 集群环境搭建完成后,执行redis-cli --cluster check ip:port命令,可以查看各个节点的详细信息

集群内各个节点信息


从节点信息可以看到,其中192.168.132.138、192.168.132.139、192.168.132.140这三个节点被定义为主节点,分别分配了0-5460、5461-10922、10923-16383号哈希槽,从节点可以根据replicates属性的编码值,查找到对应的主节点
4. 随机进入一台redis服务器的客户端,执行cluster info命令查看集群信息

集群信息

  1. 查看集群内节点情况,有两种方式进行查看:
    ①随机进入一台redis服务器的客户端,执行cluster nodes命令查看

    集群节点信息


    ②通过生成的node-6379.conf文件进行查看,执行cat node-6379.conf命令查看

    集群节点信息

  2. 测试其中一个主节点发生故障后的节点变化情况

    节点变化情况


    从上图节点变化情况中可以看出,因redis.conf配置文件中设置的检查超时时间为15s,因此15s之前,192.168.132.140这台redis服务器连接正常,仍为master主节点,持续15s检测192.168.132.140仍未连接成功,则集群认为192.168.132.140发生故障,因此将其对应的141备用节点切换为主节点

  3. 测试发生故障的主节点恢复正常后,节点的变化情况

    节点变化情况


    从图中可以看出,故障节点恢复后,作为备用节点继续工作

  4. 数据存储情况查看
    ①进入192.168.132.138服务器redis客户端,执行set age 20命令,存储一个键值对
    ②进入138主节点服务器对应的从节点142,执行keys *命令查看是否进行主从复制操作
    ③随机选取其他节点查看,执行keys *命令查看138主节点存储的数据是否可以查询到

    主节点存储键值对


    从节点查看是否存在主节点存储的键值对


    其他节点查看存储数据情况


    注:从节点查看数据存储情况需要以集群方式进入:redis-cli -c

四、springboot集成redis集群

前置条件:搭建springboot工程,搭建redis cluster
  1. pom.xml文件引入相关依赖
<dependencies>
        <!-- springboot依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>2.7.3</version>
        </dependency>

        <!-- springboot集成redis依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.7.3</version>
        </dependency>

        <!-- web依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.7.3</version>
        </dependency>

        <!-- lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
            <scope>provided</scope>
        </dependency>

        <!-- jedis-->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>4.2.3</version>
        </dependency>
    </dependencies>
  1. application.yml配置文件对redis集群进行声明
spring:
  redis:
    # redis集群节点声明
    cluster:
      nodes: 192.168.132.138:6379,192.168.132.139:6379,192.168.132.140:6379,192.168.132.141:6379,192.168.132.142:6379,192.168.132.143:6379
    # 连接超时时间声明
    connect-timeout: 5000
  1. 直接使用redisTemplate.opsForValue().get()方法,经过验证,该方法只在redis单机环境下有效,redis集群环境下,无法进行读取
  2. 创建RedisProperties装载配置到对象
@Data
@Component
@ConfigurationProperties(prefix = "spring.redis.cluster") // 查找application.yml配置文件中声明的节点装载到对象属性
public class RedisProperties {

    // 集群节点
    private String nodes;
}
  1. 创建JedisCluster读取配置信息
@Configuration
public class JedisClusterConfig {

    @Resource
    private RedisProperties redisProperties;

    public JedisCluster getJedisCluster() {
    	// 读取redis cluster节点信息
        String[] serverArray = redisProperties.getNodes().split(",");
        Set<HostAndPort> nodes = new HashSet<>();

        for (String server : serverArray) {
            String[] ipPort = server.split(":");
            nodes.add(new HostAndPort(ipPort[0].trim(), Integer.valueOf(ipPort[1].trim())));
        }

        return new JedisCluster(nodes, redisProperties.getCommandTimeout());
    }
}
  1. 创建RedisClientTemplate工具类,用于存储、读取redis数据
@Component
public class RedisClientTemplate {

    @Resource
    private JedisClusterConfig jedisClusterConfig;

    public boolean setToRedis(String key, Object value) {
        String s = jedisClusterConfig.getJedisCluster().set(key, String.valueOf(value));
        if ("OK".equals(s)) {
            return true;
        }
        return false;
    }

    public Object getRedis(String key) {
        String s = jedisClusterConfig.getJedisCluster().get(key);
        return s;
    }
}
  1. 测试从redis中读取信息
@Component
@RequestMapping("/redistest")
public class RedisClusterTest {

    @Resource
    public RedisClientTemplate redisClientTemplate;

    @GetMapping("/getRedisValue/{key}")
    @ResponseBody
    public String getRedisValue(@PathVariable("key") String key) {
        String str = (String) redisClientTemplate.getRedis(key);
        return str;
    }
}
  1. 测试结果

    redis中存储的值


    接口验证读取redis数据

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340