目录
搭建集群
首先抛出两个问题: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