redis 7.X 集群模式(cluster )搭建



背景介绍

Redis Cluster中,Sharding采用slot(槽)的概念,一共分成16384个槽,这有点儿类pre

sharding思路。对于每个进入Redis的键值对,根据key进行散列,分配到这16384个slot中的

某一个中。使用的hash算法也比较简单,就是CRC16后16384取模。 Redis集群中的每个

node(节点)负责分摊这16384个slot中的一部分,也就是说,每个slot都对应一个node负责处

理。当动态添加或减少node节点时,需要将16384个槽做个再分配,槽中的键值也要迁移。

Redis集群,要保证16384个槽对应的node都正常工作,如果某个node发生故障,那它负责

的slots也就失效,整个集群将不能工作。

本次集群部署,三台服务器分别为192.168.0.3、192.168.0.4、192.168.0.5,三个主节点,

无从节点。

什么是slots

一个 Redis 集群包含 16384 个插槽(hash slot), 数据库中的每个键都属于这 16384 个插

槽的其中一个,

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

于计算键 key 的 CRC16 校验和 。

集群中的每个节点负责处理一部分插槽。 举个例子, 如果一个集群可以有主节点, 其中:

节点 A 负责处理 0 号至 5460 号插槽。

节点 B 负责处理 5461 号至 10922 号插槽。

节点 C 负责处理 10923 号至 16383 号插槽。

安装

redis的编译安装参考:

redis单机安装

注意 集群模式与 单节点 以及 哨兵模式因为slot(槽) 不兼容,不能直接在原有基础上修改,需要清空原来的安装目录下

的文件信息

修改配置文件

vim redis.conf

1
  bind 0.0.0.0
2  protected-mode no
3  port 6379
4  daemonize no
5  pidfile /opt/redis7/redis_6379.pid
6  logfile ""
7
8  masterauth dawenzi
9  requirepass dawenzi
10
11  cluster-enabled yes
12  #这个是redis cluster集群自动生成的文件  用于记录相关信息 可以不用修改
13  cluster-config-file nodes-6379.conf
14  cluster-node-timeout 15000
15  #集群通信端口 0是默认值 当写0的时候代表 command port + 10000
16  cluster-port 0

启动redis服务

./bin/redis-server redis.conf

加入到集群

在任意一台集群主机上执行以下命令即可

1
  bin/redis-cli --cluster create 192.168.30.94:6379 192.168.30.144:6379 192.168.30.92:6379
  -a dawenzi --cluster-replicas 1
2  bin/redis-cli --cluster create 192.168.30.94:6379 192.168.30.144:6379 192.168.30.92:6379
  -a dawenzi
3
4  一个集群至少要有三个主节点
5  选项 --cluster-replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。
6  分配原则尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上。

客户端连接测试

1
  dawenzi@dawenzi-Lenovo-Erazer-Z400:/opt/redis7$  ./bin/redis-cli -c -p 6379
2  127.0.0.1:6379> auth dawenzi
3  OK
4  127.0.0.1:6379>
5  127.0.0.1:6379> cluster nodes
6  65dd48e6a8f603093678269217c6f68e16582bda 192.168.30.144:6379@16379 master - 0
  1676622052225 2 connected 5461-10922
7  2305aef6133d67a04bad3c235b1c13a3a33c072f 192.168.30.94:6379@16379 myself,master - 0
  1676622053000 1 connected 0-5460
8  5a1e6eb75c845cd1f6c4e7ea25bdca7f0bf8160c 192.168.30.92:6379@16379 master - 0
  1676622053231 3 connected 10923-16383

常用命令

1
  redis-cli -c -p 6380
2  -c 采用集群策略连接,设置数据会自动切换到相应的写主
3  查看集群信息
4  cluster nodes
5  不在一个slot下的键值,是不能使用mget,mset等多键操作。
6  可以通过{}来定义组的概念,从而使key中{}内相同内容的键值对放到一个slot中去。
7  计算key的插槽值
8  cluster keyslot <keys>
9  查看插槽的值(只能查看节点本身的值)
10  cluster countkeysinslot <slot>
11  查询集群中数据(只能查看节点本身的值)
12  cluster getkeysinslot <slot> <count>

常见错误

1
  ERR SELECT is not allowed in cluster mode
2
3  redis集群版只使用db0,select命令虽然能够支持select 0。其他的db都会返回错误。

配置文件示例

笔记插图(第 3 页)

笔记插图(第 3 页)

笔记插图(第 3 页)

redis-cluster.conf 104.03KB