和我一起迎接明天的太阳吧

klaus08

焦虑源于行动的匮乏

8-集群

什么是集群

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

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


创建集群

配置集群结点的基本信息,按如如下配置拷贝多个,我这里分别配置了端口号为6379、6380、6381、6389、6390、6391的文件。

include /myredis/redis.conf
pidfile /var/run/redis_6379.pid
port 6379
dbfilename dump6379.rdb
cluster-enabled yes #开启集群
cluster-config-file nodes-6379.conf  # 结点配置文件名称
cluster-node-timeout 15000

然后使用在Redis安装目录下的src目录中,运行redis-cli --cluster create --cluster-replicas 1 192.168.232.129:6379 192.168.232.129:6380 192.168.232.129:6381 192.168.232.129:6389 192.168.232.129:6390 192.168.232.129:6391

以集群的方式启动客户端,-c

redis-cli -c -p 6379

运行CLUSTER NODES查看集群信息。

image-20210923192745285

分配原则

一个集群至少要有三个主节点。

  • 尽量保证主库不再同一个 ip上
  • 从库和对应的主库尽量不在一个ip上

插槽

一个 Redis 集群包含 16384 个插槽,每个主库都会分配一个插槽范围,当添加 kv对时,会根据待添加元素的 key 计算出对应的插槽值( CRC16(key) % 16384),然后放入对应的库中。

image-20210923193648086

如下图,不同的key对应不同的slot,然后被存放在对应的库中。

image-20210923194026381

添加值

不在一个slot下的键值,是不能使用mget,mset等多键操作。

image-20210923195344342

可以通过{}来定义组的概念,从而使key中{}内相同内容的键值对放到一个slot中去。此时根据分组计算slot

image-20210923195416676

故障恢复

Q:如果主节点下线,从节点能否自动升为主节点?

A:能。

Q:主节点恢复后,主从关系会如何?

A:主节点回来变成从机。

Q:如果所有某一段插槽的主从节点都宕掉,redis服务是否还能继续?

A:如果运行配置cluster-require-full-coverage 为yes,那么整个集群都会垮掉;但如果cluster-require-full-coverage 为 no,那么只有down掉的节点负责的插槽不能使用,其他可以。

Jedis开发

package com.klaus;

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

public class Main {
    public static void main(String[] args) {
        HostAndPort hostAndPort = new HostAndPort("192.168.232.129", 6379);
        JedisCluster jedisCluster = new JedisCluster(hostAndPort);
        jedisCluster.set("IDE", "IDEA");
        String ide = jedisCluster.get("IDE");
        System.out.println(ide);
        jedisCluster.close();
    }
}

优点

  • 实现扩容

  • 分摊压力

  • 无中心配置相对简单

不足

多键操作是不被支持

多键的 Redis 事务是不被支持的,lua脚本不被支持

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

posted @ 2021-09-23 20:22  klaus08  阅读(25)  评论(0编辑  收藏  举报