Redis分片集群

目录

搭建集群 

 散列插槽slot

将数据保存在同一个redis实例,我们可以用{}指定实例

Redis集群伸缩

测试添加节点: 

故障转移 

 无痛数据交接(手动故障转移)

测试7002重新夺回master:

RedisTemplate访问分片集群


 

搭建集群 

首先抛出两个问题:redis对于海量数据储存和高并发写的问题

我们可以采用分片集群来解决问题——>意思就是配置多个master,每个master保存不同的数据,这样我们就可以处理高并发写的问题(毕竟多个master嘛,有点像CurrentHashMap中的Segment),有利于提高写并发量;

对于读的话,我们每个master节点底下也可以配置多个slave节点来保证数据的读取;

对于master健康监测,我们可以采用相互监控的方式,互相ping对方的健康状态

那么问题来了,redisTemplate如何访问得到我们的master进行操作呢?

我们可以访问任意一个节点,因为master之间是相互监测的,所以我们redisTemplate访问人一个节点都会转发到正确的节点上;

 master集群配置节点信息

1.在tmp目录下准备一个基础的redis.conf文件

port 6379
# 开启集群功能
cluster-enabled yes
# 集群的配置文件名称,不需要我们创建,由redis自己维护
cluster-config-file /tmp/6379/nodes.conf
# 节点心跳失败的超时时间
cluster-node-timeout 5000
# 持久化文件存放目录
dir /tmp/6379
# 绑定地址
bind 0.0.0.0
# 让redis后台运行
daemonize yes
# 注册的实例ip
replica-announce-ip 192.168.150.101
# 保护模式
protected-mode no
# 数据库数量
databases 1
# 日志
logfile /tmp/6379/run.log

2.然后我们将这个redis.conf文件cp复制到7001~8003这几个文件中

# 进入/tmp目录
cd /tmp
# 执行拷贝
echo 7001 7002 7003 8001 8002 8003 | xargs -t -n 1 cp redis.conf

3.然后每个文件需要修改一下自己的端口

cd /tmp
# 修改配置文件
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t sed -i 's/6379/{}/g' {}/redis.conf

4.然后一键启动

cd /tmp
# 一键启动所有服务
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-server {}/redis.conf

5.给各个节点进行集群配置

看你设置的副本数——>master=总节点数/(副本数+1) ,然后其余就是slave,分配给主节点master

 6.查看节点信息

redis-cli -p 7001 cluster nodes

 散列插槽slot

作用:当我们写入数据的时候,有多个master节点时,我们是写入哪个节点中呢?

根据散列插槽(hash slot)决定,我们的key不是与节点绑定,是和hash slot绑定的,我们每个master负责一个范围,我们的redis会根据key来计算插槽值以此决定放在哪个master节点中——>有利于提高写并发,并且在一定程度上缓解了redis压力

根据key利用CRC16算法计算hash值,对16384取余

 当一个master宕机了,会将自己的的插槽值给到其他节点master,这样就可以保证数据不被丢失

——>有点像elasticsearch,也是这种保证数据的一致性

测试:

redis-cli -c -p 7001

 发现,我们访问任意一个节点都会帮助我们进行重定向,所以我们redisTemplate访问任意一个节点即可;

总结:

将数据保存在同一个redis实例,我们可以用{}指定实例

 


Redis集群伸缩

如何在集群中添加一个节点,并且指定是否是master还是slave?

测试添加节点: 

 1.我们创建7004,并在下面复制一个redis.conf,然后改变里面的端口信息

sed -i s/6379/7004/g 7004/redis.conf 

2.然后运行7004在的redis.conf,并且将这个节点添加到redis集群中

注意:这里添加到集群中,我们添加的节点肯定是要告诉集群中的第一个节点说自己加入的

redis-cli --cluster add-node 192.168.184.131:7004 192.168.184.131:7001

3.查看一下节点状态 

发现是没有分配插槽的

4.分配插槽(redis-cli --cluster reshard 节点)

redis-cli --cluster reshard 192.168.184.131:7001

 

 问你分配多少插槽+分配给那个节点(输入端口)+谁的节点+done结束

5.然后我们看看集群中的节点信息

redis-cli -p 端口 cluster nodes


故障转移 

当我们一个master宕机之后,它的从机会自动顶上去(本质上:就是一个投票机制,本质就是反客为主,其他master会投票slave->master),有点像es

1.首先先对集群进行监控watch

watch redis-cli -p 7001 cluster nodes

2.然后宕机其中一个节点

redis-cli -p 端口 shutdown,观看监控状态 

 3,再次重启节点

 无痛数据交接(手动故障转移)

我们利用cluster failover命令让集群中某个master宕机,然后执行cluster failover命令这个从节点,实现无感觉数据迁移

里面的offset设计rep_balklog,下面笔记有讲到

(31条消息) 分布式Redis_Fairy要carry的博客-CSDN博客 

测试7002重新夺回master:

CLUSTER FAILOVER


RedisTemplate访问分片集群

 redis配置集群节点地址(跟之前比较不再是哨兵模式)


# redis配置  
spring:
  redis:
    cluster:
      nodes: 
        - 192.168.184.131:7001
        - 192.168.184.131:7002
        - 192.168.184.131:7003
        - 192.168.184.131:8001
        - 192.168.184.131:8002
        - 192.168.184.131:8003
    #哨兵模式
    sentinel:
      master: mymaster
      nodes:
        - 192.168.184.131:27001
        - 192.168.184.131:27002
        - 192.168.184.131:27003
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Fairy要carry

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值