redis cluster集群节点的扩缩容、重新分配槽位

扩容

我们首先按照上面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-thkshdbv-1679531893788)(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-cifX2hzE-1679531893788)(picture/Redis/55436)]

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

# 使用集群中任意一个节点来进行添加新节点
/usr/local/redis-5.0.3/src/redis-cli -a hs --cluster add-node 192.168.0.61:8008 192.168.0.61:8001

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

新加入的节点是master,并且不会分配slot槽位

接下来需要登录刚刚添加的新节点,使用replicate命令来指定当前节点要作为哪一个节点的slave节点,

# 先登录从节点,然后在replicate命令中指定主节点的id
/usr/local/redis-5.0.3/src/redis-cli -a hs -c -h 192.168.0.61 -p 8008
192.168.0.61:8008> cluster replicate 2728a594a0498e98e4b83a537e19f9a0a3790f38  #后面这串id为8007的节点id

现在8008端口的redis实例就变为了slave了。

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



缩容

接下来将上面新增加的两个节点删除

删除8008从节点

redis-cli --cluster del-node 删除从节点8008,指定删除节点ip和端口,以及节点id

/usr/local/redis-5.0.3/src/redis-cli -a hs --cluster del-node 192.168.0.61:8008 a1cfe35722d151cf70585cee21275565393c0956

再次查看集群状态,如下图所示,8008这个slave节点已经移除,并且该节点的redis服务也已被停止

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

删除8807主节点

主节点的里面是有分配了hash槽的,所以我们这里必须先把8007里的hash槽放入到其他的可用主节点中去,然后再进行移除节点操作,不然会出现数据丢失问题

目前只能把master的数据迁移到一个节点上,暂时做不了平均分配功能

# 任选一个主节点进行重新分片
/usr/local/redis-5.0.3/src/redis-cli -a hs --cluster reshard 192.168.0.61:8007

接下来的命令交互如下:

… …

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

(ps:需要多少个槽移动到新的节点上)

… …

What is the receiving node ID? 2728a594a0498e98e4b83a537e19f9a0a3790f38

(ps:把这600个hash槽移动到哪个节点上去,这里使用8001的主节点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:2728a594a0498e98e4b83a537e19f9a0a3790f38

(ps:这里是需要数据源,也就是我们的8007节点id。这里这次就不写all了)

Source node 2:done

(ps:这里直接输入done 开始生成迁移计划)

… …

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

(ps:这里输入yes开始迁移)

至此,我们已经成功的把8007主节点的数据迁移到8001上去了,我们可以看一下现在的集群状态如下图,你会发现8007下面已经没有任何hash槽了,证明迁移成功!

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

最后我们直接使用del-node命令删除8007主节点即可

# 指定要删除的节点实例ip 端口 节点id
/usr/local/redis-5.0.3/src/redis-cli -a hs --cluster del-node 192.168.0.61:8007 2728a594a0498e98e4b83a537e19f9a0a3790f38

现在就是回到了最当开始六个实例的时候了

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Kubernetes(k8s)是一个流行的容器编排平台,可以用于部署和管理Redis Cluster集群。要部署Redis Cluster集群,您需要创建一个Kubernetes集群,并使用Kubernetes对象(如Deployment、Service和ConfigMap)来定义Redis Cluster的各个组件。您还需要使用Redis官方提供的Redis Cluster镜像来创建Redis节点,并使用Kubernetes的网络和存储资源来确保Redis节点之间的通信和数据持久性。最后,您需要使用Kubernetes的监控和日志记录工具来监视和管理Redis Cluster集群的状态和性能。 ### 回答2: Kubernetes是一种流行的容器编排平台,可以轻松地部署各种应用程序和服务。Redis是一个开源的内存键值数据库,广泛用于缓存和存储解决方案。在生产环境中,我们通常需要对Redis进行集群部署,以提高性能和可用性。在这篇文章中,我们将介绍如何使用Kubernetes部署Redis Cluster集群。 1. 创建Redis镜像 首先,我们需要创建一个Redis Docker镜像,并将其推送到Docker Hub等镜像仓库中。这个过程比较简单,我们可以从Docker官方网站下载Redis的Dockerfile,并进行一些基本的修改。例如: - 安装一些必要的依赖项,如wget和tar。 - 下载和解压Redis源代码。 - 编译Redis,并将其放置在/usr/local/bin目录下。 - 拷贝启动脚本和Redis配置文件到镜像中。 2. 编写Redis Cluster配置文件 接下来,我们需要编写一个Redis Cluster配置文件,用于指定每个Redis节点的端口和IP地址等信息。Redis Cluster要求至少有3个主节点和3个从节点,因此我们需要至少6个Redis节点来构建集群。例如: port 6379 cluster-enabled yes cluster-node-timeout 15000 cluster-config-file /data/nodes.conf cluster-require-full-coverage no appendonly yes dir /data/ daemonize no logfile "" 3. 部署Redis Cluster 现在,我们可以使用Kubernetes来部署Redis Cluster集群。我们需要使用StatefulSet控制器来生成一组具有唯一名称和稳定网络标识符的Redis Pod。此外,我们还需要使用Service来创建一个Redis Headless服务,并允许Pod之间相互发现和通信。例如: apiVersion: apps/v1beta1 kind: StatefulSet metadata: name: redis-cluster spec: serviceName: redis-cluster replicas: 6 template: metadata: labels: app: redis spec: containers: - name: redis image: my-redis-image:latest command: ["redis-server"] args: ["--appendonly", "yes"] ports: - containerPort: 6379 name: redis volumeMounts: - name: data mountPath: /data volumeClaimTemplates: - metadata: name: data spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 1Gi apiVersion: v1 kind: Service metadata: name: redis-cluster spec: clusterIP: None ports: - name: redis port: 6379 selector: app: redis 4. 启动Redis Cluster 最后,我们可以启动Redis Cluster集群。首先,我们需要使用kubectl命令创建StatefulSet和Headless Service: kubectl create -f redis-cluster.yaml 然后,我们可以检查StatefulSet和Service是否成功创建: kubectl get statefulset kubectl get service 最后,我们可以使用kubectl命令进入Redis Pod,并运行redis-cli命令来验证集群是否正常工作: kubectl exec redis-cluster-0 redis-cli -c cluster info 总之,使用Kubernetes部署Redis Cluster集群比较简单,只需要做好上述几个步骤即可。在实际生产环境中,我们需要注意确保每个Redis节点之间的网络通信和数据同步,以提高集群的性能和可用性。 ### 回答3: Redis是一种快速的开源键值数据库,它的性能是其他NoSQL解决方案无法匹敌的。而Kubernetes是一个开源的容器编排引擎,负责在容器集群中自动化地部署、扩展和运行容器化应用程序。通过结合Kubernetes和Redis,我们可以快速构建一个高性能的Redis Cluster集群。 首先,我们需要设置Redis Cluster节点。因为Redis Cluster需要在一组单独的Redis实例之间进行数据分片,所以必须创建多个Redis实例来配置集群。因此,在Kubernetes中创建Redis Cluster时,最好使用StatefulSet,这样可以保证每个实例都有唯一的标识符和网络标识符。 接下来,我们创建一个Redis镜像,并将其推送到容器仓库。我们还需要为Redis Cluster创建一个配置文件,以确保各个节点能够正确地彼此通信。这里有一些要注意的事项,如: 1. 配置文件中必须使用静态IP地址来分配节点,否则它们将无法正确地通信。 2. 每个Redis实例还需要独立的持久化存储来保存数据,因此需要为每个节点分配一个存储卷。 3. 我们需要使用Kubernetes Service来将Redis Cluster公开给集群内的其他服务。 4. 对于Redis Cluster来说,最好使用至少6个节点用于数据分片。 接下来,我们使用Kubernetes YAML文件创建Redis Cluster。首先,创建一个名为“redis-cluster.yaml”的文件,并将以下内容复制并粘贴。注意,这里的配置文件和镜像名称都需要修改。 --- apiVersion: v1 kind: Service metadata: name: redis-cluster labels: app: redis-cluster spec: ports: - port: 6379 name: redis clusterIP: None selector: app: redis-cluster --- apiVersion: apps/v1 kind: StatefulSet metadata: name: redis-cluster spec: serviceName: redis-cluster replicas: 6 selector: matchLabels: app: redis-cluster template: metadata: labels: app: redis-cluster spec: containers: - name: redis image: redis:5.0.1-alpine command: - redis-server args: - /data/redis.conf ports: - containerPort: 6379 volumeMounts: - name: redis-data mountPath: /data - name: redis-config mountPath: /data/redis.conf subPath: redis.conf volumes: - name: redis-data persistentVolumeClaim: claimName: redis-data - name: redis-config configMap: name: redis-config --- apiVersion: v1 kind: ConfigMap metadata: name: redis-config data: redis.conf: |- port 6379 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes 最后,我们需要使用kubectl工具将YAML文件应用于Kubernetes集群。使用以下命令: kubectl apply -f redis-cluster.yaml 完成这些步骤后,Redis Cluster集群应该已经成功地部署到了Kubernetes集群中。我们可以使用特定的redis-cli命令将各个节点添加到集群中: redis-cli --cluster create 192.168.0.2:6379 192.168.0.3:6379 192.168.0.4:6379 192.168.0.5:6379 192.168.0.6:6379 192.168.0.7:6379 --cluster-replicas 1 这个命令将在所有节点之间创建数据分片,并将第7个节点设置为冗余备份。这样我们就创建了一个可靠的、高性能的Redis Cluster集群,可以在Kubernetes集群中自动部署、扩展和管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡尚

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值