redis 集群部署 jedisCluster

redis的集群部署,会把集群划分为16384个槽位(slot),比如集群里面有6个节点,其中三个是master,3个是slave,会把16384个槽位分配给3个master节点中,当用户给redis中增加值得时候,首先会把增加值得key用hase算法求到值,在用16384取余,得到的值(slot)属于哪个master的槽位区间就会把该值存贮在具体的master节点上面

特别需要数据的是,集群部署的节点中,只有master节点对外提供服务,slave只是作为备份节点。

集群环境中redis的各个节点的通行用的是gossip协议,如果其中一个master节点挂了之后,该主节点的slave节点,会给集群中的所有节点发送FAILOVER_AUTH_REQUEST请求,但是只有master节点会回复此请求,slave节点会更具master节点返回的FAILOVER_AUTH_ACK的数据量来判断自己是否可以升级为master,判断的数据就是收到的FAILOVER_AUTH_ACK的数量必须大于集群中master节点总和的一半,如上,集群有3个节点,挂掉了一个,则slave必须收到两个master的FAILOVER_AUTH_ACK的响应才能成为真正的master。如果一个master有两个slave,两个slave收到的FAILOVER_AUTH_ACK响应数量一样多,则下次redis会延迟发送FAILOVER_AUTH_REQUEST请求,关于延迟的时间根据slave同步的master的数据的多少,同步的越多,延时的时间的一个变量越小,然后在增加一个随机数,这样可以保证第二次一定可以推选出一个master

脑裂问题:当一个master由于网络抖动暂时失去了和集群中其他节点的通信,这时集群内部又选择出了一个新的master,用户的数据有可能就会同事写入两个master节点,当之前的master节点恢复通信之后,从新加入集群节点则之前的master会变成一个slave,这个时候会从新的master同步数据,就会删除掉自己的数据,以新的master的节点的信息为准,从而产生的数据丢失问题就为脑裂问题,解决脑裂的问题,需要增加配置信息,设置每次用户写入数据的时候,必须master和其中一个slave都同时写入成功,才返回给客户端成功,这样就规避的和集群失联的master写入数据的问题。由于和集群失联,所以数据一直不会写入成功。

redis集群扩容:当双11到来之前,需要对集群的节点进行扩容,这个时候的做法是,先增加若干台redis的实例并启动。然后调用meet 通信,让新增加的节点和集群中的某一个节点通讯,这时新增加的节点就会变成集群中的master节点,但是这时用户的数据还是不能写入新增加的节点,因为集群并没有给新增加的节点分配槽位,所以无法写入,可以用reshard命令把已有的节点的槽位分配给新的节点,槽位分配了,则之前在该槽位的数据也就会随之而迁移。用replalic群部署,会把集群划分为16384个槽位(slot),比如集群里面有6个节点,其中三个是master,3个是slave,会把16384个槽位分配给3个master节点中,当用户给redis中增加值得时候,首先会把增加值得key用hase算法求到值,在用16384取余,得到的值(slot)属于哪个master的槽位区间就会把该值存贮在具体的master节点上面

 

特别需要数据的是,集群部署的节点中,只有master节点对外提供服务,slave只是作为备份节点。

 

集群环境中redis的各个节点的通行用的是gossip协议,如果其中一个master节点挂了之后,该主节点的slave节点,会给集群中的所有节点发送FAILOVER_AUTH_REQUEST请求,但是只有master节点会回复此请求,slave节点会更具master节点返回的FAILOVER_AUTH_ACK的数据量来判断自己是否可以升级为master,判断的数据就是收到的FAILOVER_AUTH_ACK的数量必须大于集群中master节点总和的一半,如上,集群有3个节点,挂掉了一个,则slave必须收到两个master的FAILOVER_AUTH_ACK的响应才能成为真正的master。如果一个master有两个slave,两个slave收到的FAILOVER_AUTH_ACK响应数量一样多,则下次redis会延迟发送FAILOVER_AUTH_REQUEST请求,关于延迟的时间根据slave同步的master的数据的多少,同步的越多,延时的时间的一个变量越小,然后在增加一个随机数,这样可以保证第二次一定可以推选出一个master

 

脑裂问题:当一个master由于网络抖动暂时失去了和集群中其他节点的通信,这时集群内部又选择出了一个新的master,用户的数据有可能就会同事写入两个master节点,当之前的master节点恢复通信之后,从新加入集群节点则之前的master会变成一个slave,这个时候会从新的master同步数据,就会删除掉自己的数据,以新的master的节点的信息为准,从而产生的数据丢失问题就为脑裂问题,解决脑裂的问题,需要增加配置信息,设置每次用户写入数据的时候,必须master和其中一个slave都同时写入成功,才返回给客户端成功,这样就规避的和集群失联的master写入数据的问题。由于和集群失联,所以数据一直不会写入成功。

 

redis集群扩容:当双11到来之前,需要对集群的节点进行扩容,这个时候的做法是,先增加若干台redis的实例并启动。然后调用meet 通信,让新增加的节点和集群中的某一个节点通讯,这时新增加的节点就会变成集群中的master节点,但是这时用户的数据还是不能写入新增加的节点,因为集群并没有给新增加的节点分配槽位,所以无法写入,可以用reshard命令把已有的节点的槽位分配给新的节点,槽位分配了,则之前在该槽位的数据也就会随之而迁移。用replica命令可以把其中的master节点切换为slave节点,

集群中,最好可以把master的节点设置为奇树个,因为当一个master节点挂了之后,剩下的节点选举新的master所需要的票数为,总和/2以上的票,如果master的节点为4个节点的话,,因为4/2=2,4个master节点挂掉一个,还剩下3个master,slave需要获取最少3个master的回复才能变成新的master节点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值