Redis Cluster集群搭建、Cluster集群扩缩容、底层原理

Cluster集群与核心原理

Cluster集群介绍

哨兵集群的一些缺点:

  • 写操作只能在一台master节点上进行
  • 单台redis的使用内存一般不超过10G,因为内存如果太大持久化时会影响性能
  • master宕机后,重新选举,这一段时间中整个redis集群是不可用的

而Redis3.0版本开始就提供了RedisCluster的集群模式

在这里插入图片描述

  • 整个服务数据是分片存储在多个master节点上的,每个master中存储的数据是不一样的,各个master节点下又可以加多个从节点,这样就组成了一个一个的小集群,多个小集群就组成了整个Cluster集群。

  • 每个节点负责一定范围的哈希槽,默认总共有16384个slots槽位

  • 这种方式搭建的集群读写都只能在master节点上行进行,slave节点一般只是做数据备份,不能读。

  • 如果某个master节点宕机后,在哪个小集群中会进行选举,重新选举出一个master节点来。

  • 一个小集群全挂了,不能对外提供服务了,默认情况下,整个cluster集群就都不能用了,但是可以通过一个配置项cluster-require-full-coverage改为no,这样其他小集群就还能对外提供服务。



Cluster集群搭建

我们首先需要关闭防火墙,或者是开发redis提供服务的端口和gossip的端口(提供服务端口+10000)

比如我当前一台服务器要部署两个redis服务,使用6379和6380端口,那么我就需要开放6379 6380 16379 16380端口

# 临时关闭防火墙
systemctl stop firewalld 

# 禁止开机启动
systemctl disable firewalld 

接下来的一个环境搭建案例是使用三台服务器,其中运行六个redis实例

对各个实例的redis.conf文件中的基本配置项做一些相应的修改

# 后台运行
daemonize yes

# 端口
port 6379

# 把pid进程号写入pidfile配置的文件
pidfile /var/run/redis_6379.pid

# 数据文件存放位置,rdb和aof文件使用的文件目录就是这个配置项
dir /usr/local/redis-cluster/6379/

# 绑定ip可以选择注释掉
# bind 127.0.0.1

# 关闭保护模式
protected-mode  no

# aof持久化 可以选择开不开启
appendonly yes

# 指定redis连接访问密码,一般生产环境都会配置一个密码
requirepass hs

# 配置了上面的密码,那么也就是要指定一下集群访问的密码,和上面要一致,不然集群各个节点访问不通
masterauth hs

# 接下来三个是cluster集群相关的配置
# 启动集群模式
cluster-enabled yes

# 集群节点信息文件,这里6379建议和port对应上
# 这个文件保存了整个Cluster集群各个节点信息,当服务器关机后我们启动redis实例后 不需要在执行一遍--cluster create创建集群的命令。只需要启动redis服务即可,它会根据这个文件中的信息自动搭建好cluster集群
cluster-config-file nodes-6379.conf

# 节点超时时间
cluster-node-timeout 10000

六个redis实例的配置文件都准备好后就都先启动

redis-server redis.conf

此时六个redis-server都是毫无关联的,接下来将它们配置成为一个cluster集群

# -a 指定访问redis的密码
# -- cluster-replicas 表示每个redis小集群中,master下有几个slave,这里配置为1 就表示各个mastere只有一个slave
# 最后就是6个redis实例的ip和端口
redis-cli -a hs --cluster create --cluster-replicas 1 192.168.75.50:6379 192.168.75.50:6380 ......

验证集群

连接任意一个客户端即可

# -a 访问密码    -c 表示集群模式  -h -p为连接主机ip和端口
# redis-cli -c -h -p
redis-cli -a hs -c -h 192.168.75.50 6379

# 查看集群信息
cluster info

# 查看节点列表
cluster nodes

关闭

关闭集群则需要逐个进行关闭

redis-cli -a hs -c -h 192.168.75.50 -p 6379 shutdown



集群扩缩容

查看redis集群帮助

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uCwQ6LsE-1679498390679)(picture/Redis/70145)]

  • create:创建一个集群环境
  • check:检查集群状态
  • reshard:重新分片
  • add-node:添加新节点到cluster集群中,第一个参数为新节点的ip:port,第二个参数为集群中任意一个已经存在的节点的ip:port
  • del-node:移除一个节点
  • call:可以执行redis命令



扩容

我们首先按照上面Cluster集群搭建部分的内容,先启动两个redis实例192.168.0.61:8007(主)192.168.0.61:8008(从)

然后执行下面的命令

# -a redis连接密码
# 第一个ip为当前新启动的redis实例ip
# 后面一个ip为当前cluster集群中任意一个正常运行的节点ip
/usr/local/redis-5.0.3/src/redis-cli -a hs --cluster add-node 192.168.0.61:8007 192.168.0.61:8001

查看节点状态

/usr/local/redis-5.0.3/src/redis-cli -a hs -c -h 192.168.0.61 -p 8001
192.168.0.61:8001> cluster nodes

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K2xjrqPl-1679498390679)(picture/Redis/81628)]

新加入的节点都是master,并且不会分配任何slot槽位,我们要手动为新节点分配hash槽

使用redis-cli --cluster reshard命令为新加入的节点分配槽位,需要使用集群中任意一个master节点对其进行重新分片工作

/usr/local/redis-5.0.3/src/redis-cli -a hs --cluster reshard 192.168.0.61:8001

接下来的命令交互如下:

… …

How many slots do you want to move (from 1 to 16384)? 600

(ps:需要多少个槽移动到新的节点上,自己设置,比如600个hash槽)

… …

What is the receiving node ID? 2728a594a0498e98e4b83a537e19f9a0a3790f38

(ps:把这600个hash槽移动到哪个节点上去,需要指定节点id)

… …

Please enter all the source node IDs.

Type ‘all’ to use all the nodes as source nodes for the hash slots.

Type ‘done’ once you entered all the source nodes IDs.

Source node 1:all

(ps:输入all为从所有主节点(8001,8002,8003)中分别抽取相应的槽数指定到新节点中,抽取的总槽数为600个)

… …

Do you want to proceed with the proposed reshard plan (yes/no)? yes

(ps:输入yes确认开始执行分片任务)

接下来再查看最新的集群节点信息

/usr/local/redis-5.0.3/src/redis-cli -a hs -c -h 192.168.0.61 -p 8001
192.168.0.61:8001> cluster nodes

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L4ZunP7s-1679498390680)(picture/Redis/55436)]

此时还只是添加了一台master节点到集群中,我们接下来在添加192.168.0.61:8008节点来作为192.168.0.61:8007节点的从节点

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值