Redis | Redis集群模式搭建

Redis存在三种模式:主从模式,哨兵模式和集群模式。对于集群模式的话,用于生产实践中是最多的,因为其利用了分片的思想,对其水平扩展很友好。

本文主要讲述Redis集群模式搭建过程以及一些注意事项,包括集群搭建后的水平扩容和缩容。原谅小编没有那么多机器,所以只能搭建一个伪集群模式,完全不影响搭建的过程,因为真正集群模式的话在不同的机器上,伪集群的话在相同的机器上,所以对于每一个实例只要做到端口号不一样就可以了。

1.搭建集群

1.下载redis
wget https://download.redis.io/releases/redis-6.0.8.tar.gz

2.解压redis
tar -zxvf redis-6.0.8.tar.gz
解压后你会发现如下的两个文件

image-20230722101055663

1.创建myredis的目录[可自定义],在该目录下创建redis9000的文件夹。该文件夹用于存放redis.conf文件,因为后期启动redis要根据这个文件;

2.拷贝redis-6.0.8目录下的redis.conf文件到redis9000文件夹。 cp ./redis-6.0.8/redis.conf ./myredis/redis9000/

3.修改redis9000文件夹下的redis.conf配置文件

bind 127.0.0.1  ##这个ip就是springboot项目中集成redis需要填的ip 如果只是本地的话 修改成你的本地机器ip;如果是远程的话 填的公网ip

port 6379   #因为我的是伪集群 所以通过端口号来区分实例 这里我改成9000 和文件夹名字对应

daemonize  #开启守护进程

pidfile /var/run/redis_9000.pid #我这里伪分布式 得改成对应端口号

dbfilename dump9000.rdb  #端口号区分

dir ./ #默认是在启动时的文件下生成对应的文件 由于伪集群如果用同一个文件夹会产生文件冲突问题。这里得修改成redis9000文件夹路径 可用pwd命令查看一下

appendfilename "appendonly.aof"  #这里改成 appendfilename "appendonly9000.aof"

cluster-enabled yes  #开启集群模式

cluster-config-file nodes-6379.conf  # 开启 node-6379要改成node-9000

cluster-node-timeout 15000

cluster-replica-validity-factor 10

cluster-migration-barrier 1

cluster-require-full-coverage yes

cluster-replica-no-failover no

4.sed ‘s/9000/9001/g’ redis9000/redis.conf > redis9001/redis.conf 将redis9000文件夹下的redis.conf文件中的所有0000替换成9001

依次执行到9007,结果如下: image-20230722142709365 使用redis-server命令根据对应的配置启动redis服务端:

redis-server ./redis9000/redis.conf 依次启动到redis9005,总共有六台,使用ps -ef | grep redis 查看 并且机器后面时cluster字样! image-20230722144225973 此时可以使用redis的客户端进行连接但是不能写入数据,使用cluster info命令查看时,该状态为fail,因为此时还没有分配槽位。

image-20230722144955885

5.初始化cluster集群,做了三件事:1. 使用cluster meet {ip} {port}让cluster之间相互握手;2.指派槽位;3.分配主从(cluster replicate node-id);

redis客户端提供了一条命令完成上述三件事:

redis-cli --cluster create {yourip}:9000 {yourip}:9001 {yourip}:9002 {yourip}:9003 {yourip}:9004 {yourip}:9005 --cluster-replicas 1 该命令执行后完成整个集群模式初始化,最后一个参数1表示主从按照1:1的方式配置,后面三台是前面三台的从节点。Note: redis集群模式至少三个 image-20230722151103087

6.客户端连接

a). 使用redis-cli -h {ip} -p {port} 连接执行某个key属于其他节点的时候,会提示(error) MOVED 6918 10.100.113.38:9001;

b). 使用redis-cli -h {ip} -p {port} -c使用集群模式连接会直接redirect到对应的节点上; image-20230722151859490

上述的自动跳转是redis的客户端工具特有的,在集群模式下可以redirect到对应key的实例上,但是对于jedis客户端是不支持自动redirect,和第一种一样 会产生一个错误。

cluster node 查看集群信息

cluster slotkey {key} 查看slot位置

上述整个过程完成redis集群的搭建,接下来主要讲述redis集群的水平扩容和缩容。

2.集群扩容

在上述搭建的过程中的是0-5这六个实例,还有6-7这两个实例还有没有启动,这时启动这两个实例加入集群。

扩容主要做了三件事:1.加入集群;2.设置主从关系;3分配slot;

在使用cluster nodes命令查看刚刚启动的那两个实例,由于没有加入之前的集群中,并且没有从节点,所以主节点和丛节点都是当前节点,接下来就是将9007这个节点设置为9006节点的丛节点,9006以主节点的身份加入集群中。

image-20230722210526003

加入集群的命令:redis-cli --cluster add-node {当前节点ip}:9006 {集群中任意节点ip}:9000

以从节点的身份加入集群: redis-cli --cluster add-node {当前节点ip}:9007 {集群中任意节点ip}:9000 --cluster-slave --cluster-master-id 411fa6bdfc53c09cbed87be2e62f5fcac5cc05db 411这个串数字是集群中的实例id,可以理解成身份id。

image-20230722214835066

这时9006这个实例还没有对应的slot,需要对其进行分配

分配槽位的命令: redis-cli --cluster reshard {集群中任意节点ip}:9000,会出现如下结果 image-20230722220712596 两种模式说明:

all:上述说明要迁移5000个槽位,all模式会基于集群中主节点个数,将5000槽位除以主节点个数number,然后在每个主节点中迁移number个槽位;

done:通过自定义的方式,例如上述我有三个主节点,我只输入了两个节点,意味着这5000槽位得在这两个节点中每个主节点平均提供2500出来;

3.集群缩容

1.缩容命令: redis-cli --cluster reshard --cluster-from {需要迁移的实例id 411fa6bdfc53c09cbed87be2e62f5fcac5cc05db} --cluster-to {迁移目标实例id c0a88db56e023130582651ac6a262a3e36ceaaa5} --cluster-slots {槽位数 5000} {任意节点ip} 9000

2.删除节点:先删除丛节点再删除主节点,如果先删主节点会导致丛节点故障转移变成主节点。

redis-cli --cluster del-node {任意节点ip}:9000 fa5316bdebbe956f50939455d65aa5597bdfe5cc

4.总结

本文讲述集群搭建的过程,以及水平扩容和缩容。集群模式的搭建步骤:

  1. 配置文件开启集群模式,并根据该配置文件启动server端;
  2. 将启动的server分配主从关系并加入集群;
  3. 指派slot槽位就可以使用了;

对于扩容的话会导致slot槽位移动,如果客户端使用-c 的集群模式访问的话会自动重定向到某个节点,如果是普通模式访问的话会出现错误。对于Jedis的话是没有集群模式访问的,会返回错误。如果用redis cluster模式的话会有重试机制,根据返回的异常刷新slot和集群映射关系,实现后续的正常访问。