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 

选举原理

分布一致性协议,少数服从多数 

Redis Cluster日常操作命令

https://www.cnblogs.com/kevingrace/p/7910692.html

原文地址:https://www.cnblogs.com/hongyedeboke/p/12825648.html