
客户端分区方案的代表为Redis Sharding,Rdis Sharding事Redis Cluster出来之前,业界普遍使用的Redis多实例集群方法。Java的Redis客户端驱动库Jedis,支持Redis Sharding功能,即ShardingJedis以及结合缓存池的ShardingJedisPool。
优点:
不适用第三方中间件,分区逻辑可控,配置简单,节点之间无关联,容易线性扩展,灵活性强
缺点:
客户端无法动态增删服务节点,客户端要自行维护分发维护,分发逻辑,客户端之间,无连接共享会造成连接浪费

代理分区常用方案有Twemproxy和Codis
前面介绍了主从机制,但是从运维角度来看,主节点出现了问题我们还需要通过人工干预的方式把从节点设为主节点,还要通知应用程序更新主节点地址,这种方式非常繁琐笨重,而且主节点的读写能力都十分有限,有没有较好的办法解决这两个问题呢?烧饼机制就是针对第一个问题的有效解决方案,第二个问题则依赖于集群,烧饼的作用就是监控Redis系统的运行状况,其功能主要事包括以下三点:

哨兵的原理
Redis哨兵的三个定时任务,Redis哨兵判定一个Redis节点故障不可达主要就是通过三个定时监控任务来完成的


如果在定时Job3检测不到节点的心跳,会判断为“主管下线”。如果该节点还是主节点,那么还会通知到其他的哨兵对改主节点进行心跳检测,这时主管下线的票数超过了数时,那么这个主节点确定就可能时故障不可达了,这时就由原来的主管下线变为了”客观下线“。
故障转移和Leader选举
如果主节点被判定为客观下线之后,就要选取一个哨兵节点来完成后面的故障转移工作,选举出一个leader,这里采用的选举算法为Raft。选举出来的哨兵leader就要来完成故障转移工作,也就是在从节点中选出一个节点来当新的主节点
https://redis.io/topics/cluster-tutorial/
Redis的官方多级部署方案,Redis Cluster。一组Redis Cluster是由多个Redis实例组成,官方推荐我们使用6实例,其中3哥为主节点,3哥为从节点。一旦由主节点发生故障的时候,Redis Cluster可以选举出对应的从节点成为主节点,继续对外服务,从而保证服务的高可用性。那么对于客户端来说,知道对应的key是要路由到哪一个节点呢?Redis Cluster把所有的数据划分为16384哥不同的槽位,可以根据机器的性能把不同的槽位分配给不同的redis实例,对于Redis实例来说,它们只会存储部分的Redis数据,当然,槽的数据是可以迁移的,不同的实例之间,可以通过一定的协议,进行数据迁移。


1、槽

Redis集群的功能限制,Redis集群相对单机在功能上存在一些限制,需要开发人员提前了解,在使用时做好规避。JAVA CRC16校验

2、一致性hash
一致性哈希可以很好的解决稳定性问题,可以将所有的存储节点排列在首位相接的Hash环上,每个key在计算Hash后会顺时针找到相邻的存储节点存放。而当有节点加入或退出时,仅影响该节点在Hash环上顺时针相邻的后续节点

Hash倾斜
如果节点很少,容易出现倾斜,负载不均衡问题。一致性哈希算法,引入了虚拟节点,在整个环上,均衡增加若干个节点,比如a1,a2,b1,b2,c1,c2,a1和a2都是输入A节点的。解决hash倾斜问题
Redis Cluster原理图

3主3从方式,从位了同步备份,主进行slot数据分片
for port in $(seq 7001 7006); \
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port ${port}
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.56.10
cluster-announce-bus-port 1${port}
appendonly yes
EOF
docker run -p ${port}:${port} -p 1${port}:1${port} --privileged=true --name redis-${port} \
--net host \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d redis:5.0.7 redis-server /etc/redis/redis.conf; \
done
2、使用redis建立集群
#进入第一个redis
docker exec -it redis-7001 /bin/bash
#设置第一个为主节点
redis-cli --cluster create 192.168.56.10:7001 192.168.56.10:7002 192.168.56.10:7003 192.168.56.10:7004 192.168.56.10:7005 192.168.56.10:7006 --cluster-replicas 1