Redis Cluster 6.0 模式部署与运维场景实战介绍

1、背景


早期Redis 分布式集群部署方案:
1) 客户端分区:由客户端程序决定key写分配和写入的redis node,但是需要客户端自己处理写入分配、高可用管理和故障转移等
2) 代理方案:基于三方软件实现redis proxy,客户端先连接之代理层,由代理层实现key的写入分配,对客户端来说是有比较简单,但是对于集群管节点增减相对比较麻烦,而且代理本身也是单点和性能瓶颈。

在哨兵sentinel机制中,可以解决redis高可用的问题,即当master故障后可以自动将slave提升为master从而可以保证redis服务的正常使用,但是无法解决redis单机写入的瓶颈问题,即单机的redis写入性能受限于单机的内存大小、并发数量、网卡速率等因素,因此redis官方在redis 3.0版本之后推出了无中心架构的redis cluster机制,在无中心的redis集群当中,其每个节点保存当前节点数据和整个集群状态,每个节点都和其他所有节点连接,特点如下:

  • 所有Redis节点使用(PING机制)互联
  • 集群中某个节点的失效,是整个集群中超过半数的节点监测都失效才算真正的失效
  • 客户端不需要proxy即可直接连接redis,应用程序需要写全部的redis服务器IP。
  • redis cluster把所有的redis node映射到 0-16383个槽位(slot)上,读写需要到指定的redis node上进行操作,因此有多少个reids node相当于redis 并发扩展了多少倍。
  • Redis cluster预先分配16384个(slot)槽位,当需要在redis集群中写入一个key -value的时候,会使用CRC16(key) mod 16384之后的值,决定将key写入值哪一个槽位从而决定写入哪一个Redis节点上,从而有效解决单机瓶颈。

2、Redis Cluster基本架构


三主三从:假如三个主节点分别是:A, B, C 三个节点,采用哈希槽 (hash slot)的方式来分配16384个slot 的话,它们三个节点分别承担的slot 区间是:

  • 节点A覆盖 0-5460
  • 节点B覆盖 5461-10922
  • 节点C覆盖 10923-16383

3.Redis Cluster部署


3.1 环境准备:


三台服务器:每台机器分别启动6379和6380两个Redis服务

机器IP

服务名称

端口号

192.168.79.135

redis6379.service redis6380.service

6379
6380

192.168.79.152

redis6379.service redis6380.service

6379
6380

192.168.79.153

redis6379.service redis6380.service

6379
6380


3.2 创建集群的前提:


1)每个redis node节点采用相同的硬件配置、相同的密码、相同的redis版本。
2)每个节点必须开启的参数:
cluster-enabled yes #必须开启集群状态,开启后redis 进程会有cluster显示
cluster-config-file nodes-6380.conf #此文件有redis cluster集群自动创建和维护,不需要任何手动操作
3)所有redis服务器必须没有任何数据
4)先启动为单机redis且没有任何key value

redis.conf 示例:

bind $IP
port 6379
protected-mode no
tcp-backlog 4096
timeout 300
tcp-keepalive 60
maxclients 10000
maxmemory-policy volatile-lru
slowlog-max-len 512
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 0 0 0
repl-backlog-size 100mb
stop-writes-on-bgsave-error no
cluster-enabled yes
cluster-config-file node6379.conf
cluster-node-timeout 5000
cluster-require-full-coverage no
dbfilename "dump6379.rdb"
appendonly yes
appendfilename "appendonly6379.aof"
logfile "/mnt/data/redis/redis6379.log"
daemonize yes
dir "/mnt/data/redis"

 

验证当前Redis服务状态:

3.3 创建集群:

在redis5.0之后取消了redis-trib.rb脚本的支持,也就是说不再需要自己安装ruby了,将功能直接搬到了redis-cli里了,直接使用redis-cli --cluster就可以搭建和管理集群;

使用 “redis-cli --cluster help“ 命令可以查看具体的命令。

执行命令创建集群:

redis-cli --cluster create --cluster-replicas 1 192.168.79.152:6379 192.168.79.153:6379 192.168.79.135:6379 192.168.79.152:6380 192.168.79.153:6380 192.168.79.135:6380

可以看到已经建立了主从依赖关系,一个主节点对应一个从节点,共三组。

Master: 192.168.79.152:6379

Slave:192.168.79.153:6380
Master: 192.168.79.153:6379 Slave:192.168.79.135:6380
Master: 192.168.79.135:6379 Slave:192.168.79.152:6380

3.3.1 验证集群状态

 

4 Redis cluster集群节点维护

集群运行时间长久之后,难免由于硬件故障、网络规划、业务增长等原因对已有集群进行相应的调整, 比如增加Redis node节点、减少节点、节点迁移、更换服务器等。

4.1 集群维护之动态添加节点:

增加Redis node节点,需要与之前的Redis node版本相同、配置一致,然后分别启动两台Redis node,因为一主一从。

机器IP服务名称端口
192.168.79.136

redis.service

redis6380.service 

6379

6380

把新的Redis节点192.168.79.136:6379加到当前集群中:

执行命令:redis-cli --cluster add-node  新节点   当前集群中的节点                 

 redis-cli --cluster add-node 192.168.79.136:6379   192.168.79.152:6379

   (注意需要关闭防火墙,否则加入不了)

如下图,可以看到加入集群成功: 

检查当前集群节点信息如下图:发现新加入的节点没有分配卡槽。

 使用命令进行集群重新分配卡槽,如下图:

redis-cli  --cluster reshard  192.168.79.136:6379

验证是否分配成功,如下图:

为新加入的Master节点添加Slave节点:

redis-cli --cluster add-node 192.168.79.136:6380 192.168.79.136:6379    //将6380节点加入当前集群
redis-cli  -c -h 192.168.79.136 -p 6380   //进入新加入的6380节点

192.168.79.136:6380> cluster replicate 36c41a3a88a9c36840ddf33f7d3097be3651f37b        //将其设置为192.168.79.136:6379  的从节点

4.2 集群维护之动态删除节点:

添加节点的时候是先添加node节点到集群,然后分配槽位,删除节点的操作与添加节点的操作正好相反,是先将被删除的Redis node上的槽位迁移到集群中的其他Redis node节点上,

然后再将其删除,如果一个Redis node节点上的槽位没有被完全迁移,删除该node的时候会提示有数据且无法删除。

4.2.1 迁移master 的槽位至其他master

注意:被迁移Redis master源服务器必须保证没有数据,否则迁移报错并会被强制中断。

redis-cli  --cluster reshard 192.168.79.136:6379

4.2.2 从集群中删除改节点

redis-cli --cluster del-node 当前集群的某个node    要删除的node ID

redis-cli --cluster del-node 192.168.79.152:6379 36c41a3a88a9c36840ddf33f7d3097be3651f37b

如下图:

4.2.3 集群维护之平均分配槽位

redis-cli --cluster rebalance 192.168.79.152:6379 --cluster-threshold 1 --cluster-use-empty-masters
  • --cluster-threshold 1                  只要不均衡的slot数量超过1,就触发rebanlance
  •  --cluster-use-empty-masters    没有slot槽点的节点也参数均分

4.2.4 确定集群Master与Slave对应关系:

  • 确保Redis cluster 中 每个master至少有一个slave,可以有多个,但是至少要有一个提供数据备份和服务高可用。
  • Redis Slave节点一定不能个master在一个服务器,必须为跨主机交叉备份模式,避免主机故障后主备全部挂掉,如果出现Redis Slave与Redis master在同一台Redis node的情况,则需要安装以上步骤重新进行slave分配,直到不相互交叉备份为止。

4.2.5 集群维护之导入现有Redis数据:

导入数据需要redis cluster不能与被导入的数据有重复的key名称,否则导入不成功或中断。

redis-cli --cluster import 当前集群的任意节点IP:port  --cluster-from  数据源端IP:port --cluster-copy

redis-cli --cluster import 192.168.79.135:6379 --cluster-from 192.168.79.151:6379 --cluster-copy

如下图所示:

可以看到数据已经迁移成功

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值