当我们缓存数据量比较大时,如何实现能?
3种:
1.哈希取余分区
优点: 简单粗暴,直接有效,只需要预估好数据规划好节点;
缺点:进行扩容或者缩容就比较麻烦
2.一致性哈希算法分区
优点
一致性哈希算法的容错性
容错性
假设Node C宕机,可以看到此时对象A、B、D不会受到影响,只有C对象被重定位到Node D。一般的,在一致性Hash算法中,如果一台服务器不可用,则受影响的数据仅仅是此服务器到其环空间中前一台服务器(即沿着逆时针方向行走遇到的第一台服务器)之间数据,其它不会受到影响。简单说,就是C挂了,受到影响的只是B、C之间的数据,并且这些数据会转移到D进行存储。
一致性哈希算法的扩展性
扩展性
数据量增加了,需要增加一台节点NodeX,X的位置在A和B之间,那收到影响的也就是A到X之间的数据,重新把A到X的数据录入到X上即可,不会导致hash取余全部数据重新洗牌。
缺点
一致性哈希算法的数据倾斜问题
Hash环的数据倾斜问题
一致性Hash算法在服务节点太少时,容易因为节点分布不均匀而造成数据倾斜(被缓存的对象大部分集中缓存在某一台服务器上)问题
3.哈希槽分区
在数据和节点之间加入了一层,把这层称为哈希槽(slot),用于管理数据和节点之间的关系
3主3从redis集群配置
前提已经拉取redis(6.0.8)镜像:
关闭防火墙+启动docker后台服务
新建6个docker容器redis实例
docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381
docker run -d --name redis-node-2 --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382
docker run -d --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383
docker run -d --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
docker run -d --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385
docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386
执行结果:
进入容器:docker exec -it redis-node-1 /bin/bash
ip为自己真实ip
--cluster-replicas 1 表示为每个master创建一个slave节点
redis-cli --cluster create 172.21.64.23:6381 172.21.64.23:6382 172.21.64.23:6383 172.21.64.23:6384 172.21.64.23:6385 172.21.64.23:6386 --cluster-replicas 1
上图为3主3从
链接进入6381作为切入点,查看集群状态
链接进入6381作为切入点,查看节点状态
redis-cli -p 6381
cluster info
cluster nodes
如果仅仅使用redis-cli -p 6381进入redis中是单机版,但是现在使用的是集群,所以要使用redis-cli -p 6381 -c
查看集群信息:redis-cli --cluster check 172.21.64.:6381
主从容错切换迁移
如果有一台主机down机,如:docker stop redis-node-1
进入docker exec -it redis-node-2 /bin/bash查看
查看上图中,redis-node-1停机后,它的从机(redis-node-6)升为master
如果想要恢复之前的redis-node-1为主,redis-node-6为从机,需要以下步骤:
启动:docker start redis-node-1
关闭:docker stop redis-node-6
重新启动:docker start redis-node-6
等一会,查看