Redis集群笔记

知识点:
1:redis集群中的每个节点都需要建立两个tcp端口,一个为“客户端端口”,用于接收客户端指令,与客户端交互,如6379,一个端口称之为集群总线端口,是在客户端端口号上加10000,如16397,用于节点之间通过二进制协议通讯
2:Redis集群不是使用的一致性哈希,而是使用哈希槽,整个redis集群有16384个哈希槽,决定一个key应该分配到那个槽的算法是:计算该key的CRC16结果再模16384,
集群中 的每个节点负责一部分哈希槽,
例如:
节点A存储的哈希槽范围是:0-5500
节点B存储的哈希槽范围是:5501-11000
节点C存储的哈希槽范围是:11001-16384
3:redis不能保证强一直性,redis是异步同步数据,
丢失数据场景:
1)客户端向主节点B发起写的操作
2)主节点B回应客户端写操作成功
3) 主节点B向它的从节点B1,B2,B3同步该写,
若在第3步时故障,那么此写操作就丢失了
4:redis.conf配置
cluster-enabled <yes/no>: 如果配置”yes”则开启集群功能,此redis实例作为集群的一个节点,否则,它是一个普通的单一的redis实例。
cluster-config-file : 注意:虽然此配置的名字叫“集群配置文件”,但是此配置文件不能人工编辑,它是集群节点自动维护的文件,主要用于记录集群中有哪些节点、他们的状态以及一些持久化参数等,方便在重启时恢复这些状态。通常是在收到请求之后这个文件就会被更新。
cluster-node-timeout : 这是集群中的节点能够失联的最大时间,超过这个时间,该节点就会被认为故障。如果主节点超过这个时间还是不可达,则用它的从节点将启动故障迁移,升级成主节点。注意,任何一个节点在这个时间之内如果还是没有连上大部分的主节点,则此节点将停止接收任何请求。
cluster-slave-validity-factor : 如果设置成0,则无论从节点与主节点失联多久,从节点都会尝试升级成主节点。如果设置成正数,则cluster-node-timeout乘以cluster-slave-validity-factor得到的时间,是从节点与主节点失联后,此从节点数据有效的最长时间,超过这个时间,从节点不会启动故障迁移。假设cluster-node-timeout=5,cluster-slave-validity-factor=10,则如果从节点跟主节点失联超过50秒,此从节点不能成为主节点。注意,如果此参数配置为非0,将可能出现由于某主节点失联却没有从节点能顶上的情况,从而导致集群不能正常工作,在这种情况下,只有等到原来的主节点重新回归到集群,集群才恢复运作。
cluster-migration-barrier :主节点需要的最小从节点数,只有达到这个数,主节点失败时,它从节点才会进行迁移。更详细介绍可以看本教程后面关于副本迁移到部分。
cluster-require-full-coverage <yes/no>:在部分key所在的节点不可用时,如果此参数设置为”yes”(默认值), 则整个集群停止接受操作;如果此参数设置为”no”,则集群依然为可达节点上的key提供读操作

启动redis:
redis-server redis.conf //以该配置启动redis服务
关闭节点:
redis-cli -a cyclone -c -h 192.168.220.11 -p 7001 shutdown
-a: password
-h: hostname
-p: port

搭建:
1:下载redis,安装,配置6个环境
http://ifeve.com/redis-cluster-tutorial/
3:搭建集群命令

redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 \
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
--cluster-replicas 1

解释:create:创建集群
–cluster-replicas 第一个为master,第二个则为slave,就是7000master,7001为slave,7002为master,7003为slave,7004为master,7005为slave
redis问你是否采用默认策略:即哈希槽平均分为三份,给三个master。输入yes即可

在这里插入图片描述
搭建成功:
在这里插入图片描述
简单测试:会看到存储的值的分到的哈希槽以及分到那个master节点上

$ redis-cli -c -p 7000
redis 127.0.0.1:7000> set foo bar
-> Redirected to slot [12182] located at 127.0.0.1:7002
OK
redis 127.0.0.1:7002> set hello world
-> Redirected to slot [866] located at 127.0.0.1:7000
OK
redis 127.0.0.1:7000> get foo
-> Redirected to slot [12182] located at 127.0.0.1:7002
"bar"
redis 127.0.0.1:7000> get hello
-> Redirected to slot [866] located at 127.0.0.1:7000
"world

以下为一些redis集群的常用操作:
1:查看集群信息(id号,节点的ip和端口,主节点、从节点、哈希槽范围)

redis- cli -p 7000 cluster nodes

2:重新分配哈希槽

redis-cli --cluster 
127.0.0.1:7000

此处的127.0.0.1:7000,换成7001,7002,7003,7004,7005都是可以的,他只是一个对集群的指向,这个会以问答的形式进行迁移

定向进行哈希槽分配(常用)

redis-cli --cluster reshard 127.0.0.1:7000 --cluster-from a50cacc428610be7d1be73a91d8c1066c697daea --cluster-to 581b1270174a28b8d1717c971d4a25c5f5f4f212 --cluster-slots 1000 --cluster-yes

解释:127.0.0.1:7000是对集群的指向,换成7001也可以
–cluster-from :从哪个节点中分布哈希槽,后面接该节点的id
–cluster-to: 哈希槽迁移到那个节点中,后面接节点的id
–cluster-slotes :迁移的哈希槽的数量。

3:添加新的节点
和前面一样,配置一个7006的redis服务,并启动服务。
3.1:添加主节点

 redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000

集群中新增的7006节点没有哈希槽,要给他手动分配哈希槽。
3.2:添加从节点

redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000 --cluster-slave

注:7006节点添加到副本较少的随机的主节点中成为从节点。

redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000 --cluster-slave --cluster-master-id <node-id>

将节点7006添加到指定的主节点上成为其从节点

4:删除节点
4.1删除从节点

redis-cli --cluster del-node 127.0.0.1:7000 <node-id>

4.2删除主节点
1:只能删除为空的主节点,若不为空,可将其数据重新分片到所有其他主节点后删除(主节点数量少1),
2:也可对其从节点执行手动故障转移,在该节点成为新主节点的从节点之后删除该节点(主节点数量不变)

redis集群中节点的升级:
从节点升级:停止该节点,更新版本后重启即可
主节点升级:
1:使用cluster failover触发主服务器到其从服务器之一的手动故障转移
2:等待主节点成为从节点
3:最后,像对从节点一样升级节点
4:如果希望将主节点作为刚升级的节点,再次触发新的手动故障迁移,把升级后的节点转换回主节点

手动故障转移:就是人为模拟故障,以实现从节点升级为主节点,主节点变成从节点的行为,
利用redis-cli -p 登陆从节点,在从节点上执行该命令

CLUSTER FAILOVER

复制集迁移:把当前节点变成master-node-id的主节点。
利用redis-cli -p 登陆从节点,在从节点上执行该命令

CLUSTER REPLICATE <master-node-id>

redis-cli -p 7000 cluster nodes
此命令分为两部分,
redis-cli -p 7000 登陆本地的7000redis服务器,
登陆后执行cluster nodes,所以7000这个参数只要是集群中的其中一台服务器即可

redis-cli --help //获取帮助

redis-cli --stat 和一般执行的ls -l ,–stat和-l都是一样的,作为一个选项,这个是每个命令有不同的选项而已,没什么特殊的作用

redis过期删除策略:
被动删除:当get被操作时,redis会去检查该key是否过期,如果过期则删除之并且返回nil,对cpu友好,对内存不友好
主动删除:redis定期主动删除一批已过期的key,相当于定时器进行删除
主动清除策略:当已用内存操作maxmemory的限定后,会触发函数清理出空间,这个清理过程是阻塞的,直到清理出足够的空间来。

参考资料:
https://redis.io/topics/cluster-tutorial
http://ifeve.com/redis-cluster-tutorial/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值