redis之cluster分片集群搭建

一:分片集群工作概览图
在这里插入图片描述
1:master支持存储的是不同的数据,因此相比哨兵可以存储更多的数据
2:每个master还可以配置多个slave节点,读写分离
3.master之间通过心跳监控彼此健康状态,不需要sentinel监控

二:分片插槽
在这里插入图片描述
1:根据master节点个数将16384个插槽分成多少份,key是与插槽绑定而不是与master实例,这也是为什么能实现故障转移的原因
2:redis会根据key的有效值计算key的插槽值,分两种情况:
2.1:key中包含{},且{}中至少含有一个字符,{}中部分为有效值
2.2:key中不包含{},则整个key都是有效值
因此,比如业务中要将用户库的信息都存到某个实例的插槽里,就要定义相同key中都有相同的有效值,例如:user:1,user:2,这样redis就不需要进行一次重定向到正确实例取值

三:docker compose搭建redis-cluster集群(3主3从)
创建docker挂载的目录,按自己需求创建
在这里插入图片描述
创建docker-compose-redis-cluster.yml文件

version: '3.8'
services:
  redis-node-1:
    image: redis:7.4
    container_name: redis-node-1
    #集群的每一个节点需要打开两个端口,一个用于为客户端提供服务的端口(port),另一个为集群的总线端口(cluster-bus-port),
    #为节点与节点之间通信使用,默认情况下,集群总线端口(cluster-bus-port)是10000+(port)。如果没有打开这两个 TCP 端口,集群将无法按预期工作。
    ports:
      - "3333:3333"
      - "13333:13333"
    command: redis-server /usr/local/etc/redis/redis.conf 
    volumes:
      - /Applications/java_dev_util/dockerData/redis-cluster/redis1/data:/data 
      - /Applications/java_dev_util/dockerData/redis-cluster/redis1/logs:/var/log/redis 
      - /Applications/java_dev_util/dockerData/redis-cluster/redis1/redis.conf:/usr/local/etc/redis/redis.conf 
    networks:
      - redis-cluster-net

  redis-node-2:
    image: redis:7.4
    container_name: redis-node-2
    ports:
      - "3334:3334"
      - "13334:13334"
    command: redis-server /usr/local/etc/redis/redis.conf 
    volumes:
      - /Applications/java_dev_util/dockerData/redis-cluster/redis2/data:/data 
      - /Applications/java_dev_util/dockerData/redis-cluster/redis2/logs:/var/log/redis 
      - /Applications/java_dev_util/dockerData/redis-cluster/redis2/redis.conf:/usr/local/etc/redis/redis.conf 
    networks:
      - redis-cluster-net

  redis-node-3:
    image: redis:7.4
    container_name: redis-node-3
    ports:
      - "3335:3335"
      - "13335:13335"
    command: redis-server /usr/local/etc/redis/redis.conf 
    volumes:
      - /Applications/java_dev_util/dockerData/redis-cluster/redis3/data:/data 
      - /Applications/java_dev_util/dockerData/redis-cluster/redis3/logs:/var/log/redis 
      - /Applications/java_dev_util/dockerData/redis-cluster/redis3/redis.conf:/usr/local/etc/redis/redis.conf 
    networks:
      - redis-cluster-net

  redis-node-4:
    image: redis:7.4
    container_name: redis-node-4
    ports:
      - "3336:3336"
      - "13336:13336"
    command: redis-server /usr/local/etc/redis/redis.conf 
    volumes:
      - /Applications/java_dev_util/dockerData/redis-cluster/redis4/data:/data 
      - /Applications/java_dev_util/dockerData/redis-cluster/redis4/logs:/var/log/redis 
      - /Applications/java_dev_util/dockerData/redis-cluster/redis4/redis.conf:/usr/local/etc/redis/redis.conf 
    networks:
      - redis-cluster-net

  redis-node-5:
    image: redis:7.4
    container_name: redis-node-5
    ports:
      - "3337:3337"
      - "13337:13337"
    command: redis-server /usr/local/etc/redis/redis.conf 
    volumes:
      - /Applications/java_dev_util/dockerData/redis-cluster/redis5/data:/data 
      - /Applications/java_dev_util/dockerData/redis-cluster/redis5/logs:/var/log/redis 
      - /Applications/java_dev_util/dockerData/redis-cluster/redis5/redis.conf:/usr/local/etc/redis/redis.conf 
    networks:
      - redis-cluster-net

  redis-node-6:
    image: redis:7.4
    container_name: redis-node-6
    ports:
      - "3338:3338"
      - "13338:13338"
    command: redis-server /usr/local/etc/redis/redis.conf 
    volumes:
      - /Applications/java_dev_util/dockerData/redis-cluster/redis6/data:/data 
      - /Applications/java_dev_util/dockerData/redis-cluster/redis6/logs:/var/log/redis 
      - /Applications/java_dev_util/dockerData/redis-cluster/redis6/redis.conf:/usr/local/etc/redis/redis.conf 
    networks:
      - redis-cluster-net

networks:
  redis-cluster-net:
    driver: bridge

redis1配置文件

#绑定端口
bind 0.0.0.0

#端口
port 3333

#保护模式关闭
protected-mode no

#注释掉daemonize yes,或者配置成 daemonize no。因为该配置和 docker run中的 -d 参数冲突,会导致容器一直启动失败
daemonize no

##设置日志级别,如debug、verbose、notice、warning等。
loglevel notice

#logfile:指定日志文件的路径
logfile /var/log/redis/redis.log

# 设置密码,这样只有输入正确的密码后才能访问服务器。默认为空,表示没有密码。
requirepass ming

#访问主节点密码
masterauth ming  

#redis能使用的最大内存
maxmemory 1gb

#是否在将rdb文件持久化到磁盘时,进行压缩操作。设置为 "yes" 可以提高数据安全性,但可能会降低性能。默认为 "no"。
rdbcompression yes
 
#rdb文件名
dbfilename rdb_dump.rdb

#指定Redis服务器存储数据(比如RDB快照文件)的目录
dir /data

#rdb持久化,快照可以用一个空字符串参数完全禁用:save “”
#在900秒(15分钟)内,如果有至少1个键被改变,则bgsave进行RDB持久化
#在300秒(5分钟)内,如果有至少10个键被改变,则bgsave进行RDB持久化
#在60秒内,如果有至少10000个键被改变,则bgsave进行RDB持久化
save 900 1          
save 300 10          
save 60 10000        

#开启aof持久化,关闭为no
appendonly yes

#aof持久化刷盘策略
appendfsync everysec


# 是否开启集群模式
cluster-enabled yes

# 集群节点信息文件,由redis自己维护
cluster-config-file nodes-3333.conf

# 集群节点连接超时时间
cluster-node-timeout 15000

redis2配置文件

#绑定端口,任何人都可以访问
bind 0.0.0.0

#保护模式关闭
protected-mode no

#注释掉daemonize yes,或者配置成 daemonize no。因为该配置和 docker run中的 -d 参数冲突,会导致容器一直启动失败
daemonize no

#端口
port 3334

##设置日志级别,如debug、verbose、notice、warning等。
loglevel notice

#logfile:指定日志文件的路径
logfile /var/log/redis/redis.log


#redis能使用的最大内存
maxmemory 1gb

#是否在将rdb文件持久化到磁盘时,进行压缩操作。设置为 "yes" 可以提高数据安全性,但可能会降低性能。默认为 "no"。
rdbcompression yes
 
#rdb文件名
dbfilename rdb_dump.rdb

#指定Redis服务器存储数据(比如RDB快照文件)的目录
dir /data

#rdb持久化,快照可以用一个空字符串参数完全禁用:save “”
#在900秒(15分钟)内,如果有至少1个键被改变,则bgsave进行RDB持久化
#在300秒(5分钟)内,如果有至少10个键被改变,则bgsave进行RDB持久化
#在60秒内,如果有至少10000个键被改变,则bgsave进行RDB持久化
save 900 1          
save 300 10          
save 60 10000        

#开启aof持久化,关闭为no
appendonly yes

# 设置密码,这样只有输入正确的密码后才能访问服务器。默认为空,表示没有密码。
requirepass ming

#访问主节点
masterauth ming  


# 是否开启集群模式
cluster-enabled yes

# 集群节点信息文件,由redis自己维护
cluster-config-file nodes-3334.conf

# 集群节点连接超时时间
cluster-node-timeout 15000

redis3配置文件

#绑定端口
bind 0.0.0.0

#保护模式关闭
protected-mode no

#注释掉daemonize yes,或者配置成 daemonize no。因为该配置和 docker run中的 -d 参数冲突,会导致容器一直启动失败
daemonize no

#端口
port 3335

##设置日志级别,如debug、verbose、notice、warning等。
loglevel notice

#logfile:指定日志文件的路径
logfile /var/log/redis/redis.log

#redis能使用的最大内存
maxmemory 1gb

#是否在将rdb文件持久化到磁盘时,进行压缩操作。设置为 "yes" 可以提高数据安全性,但可能会降低性能。默认为 "no"。
rdbcompression yes
 
#rdb文件名
dbfilename rdb_dump.rdb

#指定Redis服务器存储数据(比如RDB快照文件)的目录
dir /data

#rdb持久化,快照可以用一个空字符串参数完全禁用:save “”
#在900秒(15分钟)内,如果有至少1个键被改变,则bgsave进行RDB持久化
#在300秒(5分钟)内,如果有至少10个键被改变,则bgsave进行RDB持久化
#在60秒内,如果有至少10000个键被改变,则bgsave进行RDB持久化
save 900 1          
save 300 10          
save 60 10000        

#开启aof持久化,关闭为no
appendonly yes

# 设置密码,这样只有输入正确的密码后才能访问服务器。默认为空,表示没有密码。
requirepass ming

#访问主节点密码
masterauth ming   

# 是否开启集群模式
cluster-enabled yes

# 集群节点信息文件,由redis自己维护
cluster-config-file nodes-3335.conf

# 集群节点连接超时时间
cluster-node-timeout 15000

redis4配置文件

#绑定端口
bind 0.0.0.0

#端口
port 3336

#保护模式关闭
protected-mode no

#注释掉daemonize yes,或者配置成 daemonize no。因为该配置和 docker run中的 -d 参数冲突,会导致容器一直启动失败
daemonize no

##设置日志级别,如debug、verbose、notice、warning等。
loglevel notice

#logfile:指定日志文件的路径
logfile /var/log/redis/redis.log

# 设置密码,这样只有输入正确的密码后才能访问服务器。默认为空,表示没有密码。
requirepass ming

#访问主节点密码
masterauth ming 

#redis能使用的最大内存
maxmemory 1gb

#是否在将rdb文件持久化到磁盘时,进行压缩操作。设置为 "yes" 可以提高数据安全性,但可能会降低性能。默认为 "no"。
rdbcompression yes
 
#rdb文件名
dbfilename rdb_dump.rdb

#指定Redis服务器存储数据(比如RDB快照文件)的目录
dir /data

#rdb持久化,快照可以用一个空字符串参数完全禁用:save “”
#在900秒(15分钟)内,如果有至少1个键被改变,则bgsave进行RDB持久化
#在300秒(5分钟)内,如果有至少10个键被改变,则bgsave进行RDB持久化
#在60秒内,如果有至少10000个键被改变,则bgsave进行RDB持久化
save 900 1          
save 300 10          
save 60 10000        

#开启aof持久化,关闭为no
appendonly yes

#aof持久化刷盘策略
appendfsync everysec

# 是否开启集群模式
cluster-enabled yes

# 集群节点信息文件,由redis自己维护
cluster-config-file nodes-3336.conf

# 集群节点连接超时时间
cluster-node-timeout 15000

redis5配置文件

#绑定端口
bind 0.0.0.0

#端口
port 3337

#保护模式关闭
protected-mode no

#注释掉daemonize yes,或者配置成 daemonize no。因为该配置和 docker run中的 -d 参数冲突,会导致容器一直启动失败
daemonize no

##设置日志级别,如debug、verbose、notice、warning等。
loglevel notice

#logfile:指定日志文件的路径
logfile /var/log/redis/redis.log

# 设置密码,这样只有输入正确的密码后才能访问服务器。默认为空,表示没有密码。
requirepass ming

#访问主节点密码
masterauth ming 

#redis能使用的最大内存
maxmemory 1gb

#是否在将rdb文件持久化到磁盘时,进行压缩操作。设置为 "yes" 可以提高数据安全性,但可能会降低性能。默认为 "no"。
rdbcompression yes
 
#rdb文件名
dbfilename rdb_dump.rdb

#指定Redis服务器存储数据(比如RDB快照文件)的目录
dir /data

#rdb持久化,快照可以用一个空字符串参数完全禁用:save “”
#在900秒(15分钟)内,如果有至少1个键被改变,则bgsave进行RDB持久化
#在300秒(5分钟)内,如果有至少10个键被改变,则bgsave进行RDB持久化
#在60秒内,如果有至少10000个键被改变,则bgsave进行RDB持久化
save 900 1          
save 300 10          
save 60 10000        

#开启aof持久化,关闭为no
appendonly yes

#aof持久化刷盘策略
appendfsync everysec

# 是否开启集群模式
cluster-enabled yes

# 集群节点信息文件,由redis自己维护
cluster-config-file nodes-3337.conf

# 集群节点连接超时时间
cluster-node-timeout 15000

redis6配置文件

#绑定端口
bind 0.0.0.0

#端口
port 3338

#保护模式关闭
protected-mode no

#注释掉daemonize yes,或者配置成 daemonize no。因为该配置和 docker run中的 -d 参数冲突,会导致容器一直启动失败
daemonize no

##设置日志级别,如debug、verbose、notice、warning等。
loglevel notice

#logfile:指定日志文件的路径
logfile /var/log/redis/redis.log

# 设置密码,这样只有输入正确的密码后才能访问服务器。默认为空,表示没有密码。
requirepass ming

#访问主节点密码
masterauth ming 

#redis能使用的最大内存
maxmemory 1gb

#是否在将rdb文件持久化到磁盘时,进行压缩操作。设置为 "yes" 可以提高数据安全性,但可能会降低性能。默认为 "no"。
rdbcompression yes
 
#rdb文件名
dbfilename rdb_dump.rdb

#指定Redis服务器存储数据(比如RDB快照文件)的目录
dir /data

#rdb持久化,快照可以用一个空字符串参数完全禁用:save “”
#在900秒(15分钟)内,如果有至少1个键被改变,则bgsave进行RDB持久化
#在300秒(5分钟)内,如果有至少10个键被改变,则bgsave进行RDB持久化
#在60秒内,如果有至少10000个键被改变,则bgsave进行RDB持久化
save 900 1          
save 300 10          
save 60 10000        

#开启aof持久化,关闭为no
appendonly yes

#aof持久化刷盘策略
appendfsync everysec

# 是否开启集群模式
cluster-enabled yes

# 集群节点信息文件,由redis自己维护
cluster-config-file nodes-3338.conf

# 集群节点连接超时时间
cluster-node-timeout 15000

进入docker-compose-redis-cluster.yml文件目录启动

docker compose -f ./docker-compose-redis-cluster.yml up -d

启动成功
在这里插入图片描述
创建redis集群

#进入容易内部
docker exec -it redis-node-1 /bin/bash

#--cluster-replicas 1 表示每个主节点有一个从节点, -a 表示连接密码
redis-cli -a ming --cluster create \
  192.168.1.9:3333 \
  192.168.1.9:3334 \
  192.168.1.9:3335 \
  192.168.1.9:3336 \
  192.168.1.9:3337 \
  192.168.1.9:3338 \
  --cluster-replicas 1

运行出现报错
在这里插入图片描述
第一步:删除 appendonly.aof 和 dump.rdb,具体路劲因人而异,你可以在你配置文件的目录看到
第二部(第一步之后如果还不行再做):删除所有节点的cluster-config-file,也就是节点配置文件,自动生成的,路劲也配置在conf文件中

在这里插入图片描述
删除这些文件后再执行命令成功创建集群,redis内部会自动处理好主从关系和分配插槽的工作
在这里插入图片描述

验证集群是否正常工作

#-c表示集群模式 -a客户端连接redis服务器的密码
redis-cli  -c -a ming -p 3333 cluster nodes

在这里插入图片描述
其他一些关于redis-cluster集群操作的命令,通过redis-cli --cluster help查看
在这里插入图片描述
到此,redis-cluster分片集群搭建成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值