1、部署架构模式:

部署方式采用的Redis Cluster是Redis的亲儿子,是Redis作者自己提供的Redis集群化方案,从Redis3.0版本开始正式提供。

redis cluster主要是针对海量数据+高并发+高可用的场景,海量数据,如果你的数据量很大,那么建议就用redis cluster,数据量不是很大时,使用sentinel就够了。redis cluster的性能和高可用性均优于哨兵模式。

集群部署至少要 3 台以上的master节点,最好使用 3 主 3 从六个节点的模式

集群由多个Redis主从组成,每一个节点代表一个主从,每个节点负责一部分数据,他们之间通过一种特殊的二进制协议交互集群信息。

Redis Cluster将所有数据分片,分成16384个槽位,Redis Cluster对key值使用crc16算法进行hash,然后用除留余数发模除16384得到具体的槽位,每个节点负责其中一部分槽位。

当客户端连接集群,会得到一份集群的槽位匹配信息,当客户端要查找key,可以直接定位到目标节点。

Cluster去中心化,由多个节点组成,客户端连接时可以只用一个节点的地址,其余节点可通过该节点自动发现,但如果该节点挂了,就必须手动更换地址,因此连接多个地址安全性更高。

容错机制:

Redis Cluster拥有类似哨兵的功能,每个节点仍需设置若干从节点,主节点发生故障,集群可将slave升级为master;否则如果master挂了,集群完全不可用;

且Redis Cluster是去中心化,集群内某个节点不可用时,一个节点认为他失联并不代表所以节点都认为他失联,集群要进行一次商议,只有大多数节点认为他失联,才会认为其需要主从切换来容错。

支持动态扩容:

假如原先集群中有3个节点,一共3000个数据,可能1-1000在第一个节点,1001-2000在第二个节点,2001-3000在第三个节点。

当新节点加入集群,需要手动将槽和数据迁移到新节点,可以使用redis-trib工具或手动命令迁移。

优缺点:

优点

        无中心架构,支持动态扩容
        Cluster自动具备哨兵监控和故障转移(主从切换)能力
        客户端连接集群内部地址可自动发现
        高性能、高可用,有效解决了Redis分布式需求
缺点

        运维复杂

接下来进行集群部署及配置:

以下以cluster为实例,官方最小集群必须至少包含三个主节点。本次部署,我们使用六节点集群,三主三副本。

1、下载源码包并解压部署,下载地址部署参考

本人redis使用redis-6.2.6版本安装在data目录下。

2、安装完后进入redis安装目录下创建创建6个节点配置文件存放文件夹,目录以实例的端口号命名并配置redis.conf文件。

cd /data/redis-6.2.6
mkdir cluster-test
cd cluster-test
mkdir 7000 7001 7002 7003 7004 7005

在每个目录中创建一个redis.conf文件,从 7000 到 7005。作为配置文件的模板,每个配置文件区别在于port,pidfile,dir,cluster-config-file这几个节点值不一样。

redis.conf配置文件中信息如下:

# 监听端口
port 7000
# 是否开启保护模式,默认只允许本机访问,把 bind 修改为 0.0.0.0 表示允许所有远程访问。如果想指定限制访问,可设置对应的 ip。
bind 0.0.0.0

# 作为守护程序运行,设置为后台启动。
appendonly yes

# 设置密码
requirepass 123456
# 当 master 服务设置了密码保护时,slave 服务连接 master 的密码
masterauth 123456
# 这是设置是否后台启动 Redis,默认 no ,但是生产环境肯定要默认就开启 Redis,所以这里设置为 yes 。
daemonize yes
# PID文件,修改对应的端口
pidfile /data/redis-6.2.6/cluster-test/7000/redis_7000.pid
# 数据文件存放位置,我换成指定目录下存放
dir /data/redis-6.2.6/cluster-test/7000/
# 启动集群模式
cluster-enabled yes
# 加载持久化集群配置文件,修改对应的端口
cluster-config-file nodes_7000.conf
# 超时时间
cluster-node-timeout 5000

3、启动各服务

按如下方式启动每个实例,每个实例都将在在单独的终端中运行:

/data/redis-6.2.6/src/redis-server /data/redis-6.2.6/cluster-test/7000/redis.conf
/data/redis-6.2.6/src/redis-server /data/redis-6.2.6/cluster-test/7001/redis.conf
/data/redis-6.2.6/src/redis-server /data/redis-6.2.6/cluster-test/7002/redis.conf
/data/redis-6.2.6/src/redis-server /data/redis-6.2.6/cluster-test/7003/redis.conf
/data/redis-6.2.6/src/redis-server /data/redis-6.2.6/cluster-test/7004/redis.conf
/data/redis-6.2.6/src/redis-server /data/redis-6.2.6/cluster-test/7005/redis.conf

5、初始创建集群

现在我们有6实例正在运行,我们需要通过向节点写入一些配置来创建我们的集群,要创建集群,请运行以下命令:

redis-cli --cluster create 192.168.43.58:7000 192.168.43.58:7001 192.168.43.58:7002 192.168.43.58:7003 192.168.43.58:7004 192.168.43.58:7005 --cluster-replicas 1

cluster-replicas 1 表示1主1从,前3个为主节点

进入redis中查看状态

redis-cli -c -h 192.168.43.58 -p 7000

cluster info 

 6、集群测试:

设置值

192.168.43.58:7000> set foo bar
-> Redirected to slot [12182] located at 192.168.43.58:7002
OK
192.168.43.58:7002> set name wly
-> Redirected to slot [5798] located at 192.168.43.58:7001
OK
192.168.43.58:7001> set gender 女
-> Redirected to slot [15355] located at 192.168.43.58:7002
OK 

 获取值:

192.168.43.58:7000> get foo
-> Redirected to slot [12182] located at 192.168.43.58:7002
"bar"
192.168.43.58:7002> get name
-> Redirected to slot [5798] located at 192.168.43.58:7001
"wly"
192.168.43.58:7001> get gender
-> Redirected to slot [15355] located at 192.168.43.58:7002
"\xe5\xa5\xb3"

7、Springboot集成redis集群配置方式

application.yml配置如下:

spring:
  redis:
    password: 123456 # Redis服务器连接密码(默认为空)
    timeout: 50000ms # 连接超时时间
    cluster:
      nodes: 192.168.43.58:7000,192.168.43.58:7001,192.168.43.58:7002,192.168.43.58:7003,192.168.43.58:7004,192.168.43.58:7005
      commamd-tomeout: 5000

RedisController:

package andanyoung.redis.rediscluster.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;

/**
 * @author wly
 * @since 2022/5/19 11:05
 */
@RestController
public class RedisController {

    @Autowired
    StringRedisTemplate stringRedisTemplate;
    @GetMapping("get")
    public String get(String key){

       return stringRedisTemplate.opsForValue().get(key);
    }

    @RequestMapping("put")
    public String put(String key,String value){

          stringRedisTemplate.opsForValue().set (key,value);
          return get(key);
    }
}

验证效果:

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐