redis-集群
哨兵模式
1主n从
原理:client端先请求哨兵,哨兵返回主master的ip,client端通过ip访问redis服务。
哨兵也是一个程序,监控redis服务器情况,对外有服务端口。
问题:client端一直只访问一个节点,单台服务器内存不能提供到很大。
高可用集群模式
n主n*m从,多个子集群
搭建集群步骤
待完成...
复制因子:1个主节点配几个子节点
分片:理论上划分出16384个槽位,每个集群上大体上均分槽位。只有master节点分配槽位。
命令:(在下面章节有 Redis Cluster日常操作命令)
访问集群 redis-cli -a password -c(cluster) -h hostip -p port
查看节点信息 cluster nodes
nodeid ip:port master ... connect 分配的槽位范围
nodeip ip:port slave master_nodeip ..
一般主节点和从节点不在同一台机器上,如机器出故障,这个集群就全部有问题,不能做到高可用了。
原理分析
槽位定位算法:
槽位计算:hash_slot = cre16(key) mode 16384
get、set 操作都会计算key的槽位,判断在哪个集群上;
节点信息(主节点和从节点的匹配关系)在服务器端的nodes-port.conf中(自己配置的名称);客户端也会存一份,当客户端第一次读取到redis信息后,会得到一份节点信息,缓存到jvm中。
跳转重定向:
redirect to slot[槽位] located at ip:port
在发现指令key不在当前节点的槽位上时,会向客户端发送一个特殊的跳转指令
网络抖动:
主节点之间会有心跳监控机制,若检测期间网络延迟,可能会误认为某个主节点已死,从而选举新的主节点。解决:设置超时时间。
适宜的节点数:
redis官方做过测试,节点不要超过1000个。
redis集群水平扩展(扩容)
existing_host:existing_port(任意存活的节点)目的主要是与集群联系上。
1.新节点以集群方式启动
主节点:
2.redis-cli add-node new_host:new_port existing_host:existing_port(任意存活的节点) 默认设置为主节点
3.重新分槽:redis-cli --cluster reshard existing_host:existing_port
选择分多少,为哪个id分
选择哪种方式:
all 从其他所有主节点平均分片过来
done 从某个具体的节点分片
注意:分槽过程中,redis会阻塞。
从节点:
4.redis-cli add-node new_host:new_port existing_host:existing_port(任意存活的节点)
5.默认为主节点,改为从节点,进入新节点客户端:
redis-cli -c -h ip -p port
cluster replicate 主节点的nodeip
扩容的配置,在主节点心跳检测时,会进行同步
redis集群缩容
1.数据迁移,将当前节点的数据迁移到其他节点
redis-cli --cluster reshard existing_host:existing_port
source node 目标nodeip
done
2.删除从节点
redis-cli del-node existing_host:existing_port node_id
3. 删除主节点
redis-cli del-node existing_host:existing_port node_id
数据迁移
涉及槽位迁移的redis服务,都会阻塞;是在节点existing存活时,做数据迁移
两种方式:
1. redis-cli --cluster reshard
2. redis-cli --cluster rebalance existing_host:existing_port
选举原理
分布一致性协议,少数服从多数