Loading

Redis集群(八)

一、Redis集群

1.1 问题

容量不够,Redis如何进行扩容?

并发写操作,Redis如何分摊?

另外,主从模式、薪火相传模式、主机宕机,导致IP地址发生变化,应用程序中配置需要修改对应的主机地址、端口等信息(代码中地址肯定写死了)。

之前通过代理主机来解决,但是 redis3.0 中提供了解决方案。就是 无中心化集群 配置

任何一个服务都能作为集群的入口,他们之间可以互相访问。

image-20220222190046809

1.2 什么是集群

Redis集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的 1/N 。

Redis集群通过分区来提供一定程度的可用性:即使集群中有一部分节点失效或无法进行通讯,集群也可以继续处理命令请求。

二、模拟集群

制作6个实例:6379、6380、6381、6389、6390、6391

2.1 配置基本信息

删除 /myredis 目录下的所有 dump**.rdb ,然后再删除 redis6380.confredis6381.conf ,留下 redis6379.conf

修改 redis6379.conf 。仅留下以下内容。

cluster-enabled yes 打开集群模式
cluster-config-file nodes-6379.conf 设定节点配置文件名
cluster-node-timeout 15000 设定节点失联时间,超过该时间(毫秒),集群自动进入主从切换

image-20220222191903497

然后复制5份分别为redis6380.confredis6381.confredis6389.confredis6390.confredis6391.conf。并将里面的端口信息修改为对应的端口。例如 6379 ---> 6380

image-20220222192335165

可以使用快捷键批量替换字符

image-20220222192502006

启动6个redis服务

image-20220222193410084

2.2 将6个节点合成一个集群

组合之前,请确保所有redis实例启动后,nodes-xxxx.conf文件都正常生成。

合体:

# 进入redis的安装目录下的 src 文件夹
cd /export/software/redis-6.2.6/src/

# --cluster 集群操作
# create 创建集群
# --cluster-replicas 1 	1代表从机数量。采用最简单的方式配置集群,一台主机,一台从机。6台主机正好三组
# 都填写真实IP地址,不要用127.0.0.1
redis-cli --cluster create --cluster-replicas 1 192.168.121.138:6379 192.168.121.138:6380 192.168.121.138:6381 192.168.121.138:6389 192.168.121.138:6390 192.168.121.138:6391

image-20220222194614047

image-20220222194755756

2.3 采用集群的方式连接

# -c :采用集群策略连接,设置数据会自动切换到相应的“写”主机
# 在redis安装目录下的src文件夹中操作
redis-cli -c -p 6379

image-20220222195224792

image-20220222195401752

2.4 什么是slots

一个Redis集群包含16384个插槽,数据库中的每个键都属于这16384个插槽中的其中一个。

集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽,其中 CRC16(key) 语句用于计算键 key 的CRC16校验和。

集群每个节点负责一部分插槽。

image-20220222200327736

2.4.1 在集群中插入值

image-20220222202414105

image-20220222202901514

2.4.2 查询集群中的值

cluster keyslot cust	# 计算key对应的插槽值
cluster countkeysinslot 4847	# 计算该插槽值里面有几个key
cluster getkeysinslot 4847 10	# 在对应插槽中返回10个值

2.5 故障恢复

测试某主机挂掉,和重启后的情况。

image-20220222203717849

image-20220222204045290

image-20220222204237262

三、Jedis操作集群

package com.example.jedis;

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;

public class RedisClusterDemo {
    public static void main(String[] args) {
        //创建对象
        HostAndPort hostAndPort = new HostAndPort("192.168.121.138", 6379);
        JedisCluster jedisCluster = new JedisCluster(hostAndPort);

        //进行操作
        jedisCluster.set("b1", "value1");

        String b1 = jedisCluster.get("b1");
        System.out.println(b1);
        jedisCluster.close();
    }
}

image-20220222204919670

四、Redis集群的优缺点

4.1 优点

  • 实现扩容
  • 分摊压力
  • 无中心配置相对简单

4.2 不足

  • 多键操作是不支持的
  • 多键的Redis事务是不被支持的。lua脚本不被支持。
  • 由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而代理或者客户端分片的方案想要迁移至redis cluster,需要整体迁移而不是逐步过渡,复杂度较大。

参考资源:

posted @ 2022-02-28 20:57  KledKled  阅读(38)  评论(0编辑  收藏  举报