【Redis Cluster集群运维与核心原理剖析】

一、Redis Cluster集群搭建实战

1.1、Redis高可用集群搭建

  1. 准备三台服务器,因为redis集群至少需要三个master,这里我们搭建一主一从,共六个redis节点,准备的服务器ip分别为:102、103、104,每台机器上一主一从,如下图:
    在这里插入图片描述

  2. 在第一台机器上,创建文件夹redis-cluster,然后在其下面创建两个文件夹8001、8002
    在这里插入图片描述

  3. 将redis.confg拷贝一份到8001和8004文件下,修改其相关配置
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    当然还有设置requirepass密码和访问其他节点的密码masterauth
    在这里插入图片描述

  4. 同样非方式,配置剩余的服务器对应的节点数据,且启动每个节点的redis服务,结果图示如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  5. 用redis‐cli创建整个redis集群(redis5以前的版本集群是依靠ruby脚本redis‐trib.rb实现)
    //执行这条命令需要确认三台机器之间的redis实例要能相互访问,可以先简单把所有机器防火墙关掉,如果不 关闭防火墙则需要打开redis服务端口和集群节点gossip通信端口16379(默认是在redis端口号上加1W) src/redis-cli -a lyf --cluster create --cluster-replicas 1 192.168.118.102:8001 192.168.118.103:8002 192.168.118.104:8003 192.168.118.102:8004 192.168.118.103:8005 192.168.118.104:8006在这里插入图片描述
    出现上述问题的原因与解决方案:这是由于上次redis集群没有配置成功,生成了每个节点的配置文件和db的备份文件,所以才产生这个错误。
    删除每个redis节点的备份文件,数据库文件和集群配置文件(在与端口同名的子目录中)

    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

1.2、Java操作Redis集群实战

package com.practice.redis;

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;

import java.util.HashSet;
import java.util.Set;

/**
 * 测试java连接redis集群操作
 */
public class JedisClusterTest {
    public static void main(String[] args) {

        //配置连接池
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(20);

        jedisPoolConfig.setMaxIdle(10);
        jedisPoolConfig.setMinIdle(5);

        Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>();
        jedisClusterNode.add(new HostAndPort("192.168.118.102",8001));
        jedisClusterNode.add(new HostAndPort("192.168.118.103",8002));
        jedisClusterNode.add(new HostAndPort("192.168.118.104",8003));
        jedisClusterNode.add(new HostAndPort("192.168.118.102",8004));
        jedisClusterNode.add(new HostAndPort("192.168.118.103",8005));
        jedisClusterNode.add(new HostAndPort("192.168.118.104",8006));
        try{

            //connectionTimeout:指的是连接一个url的连接等待时间
            //soTimeout:指的是连接上一个url,获取response的返回等待时间
            JedisCluster jedisCluster = new JedisCluster(jedisClusterNode,5000,5000,10,"lyf",jedisPoolConfig);
            System.out.println(jedisCluster.set("clusterTest","testCluster"));
            System.out.println(jedisCluster.get("clusterTest"));
        }catch (Exception e){
            System.out.println("出现异常信息:"+e);
        }
    }
}

测试结果截图
在这里插入图片描述
在这里插入图片描述

1.3、Redis集群原理剖析

Redis Cluster将所有的数据划分为16384个槽位(slots),每个master节点负责其中一部分槽位,当有客户端来连接Redis Cluster时,会结合槽位定位算法(默认会对key值使用crc16算法进行hash得到一个整数值,然后用这个整数值对16384取模来得到具体槽位==>HASH_SLOT = CRC16(key) mod 16384)定位到具体哪个master的哪个位置上,如下图:
在这里插入图片描述

1.4、Redis集群选举Master节点原理剖析

  1. 当salve发现自己的master变为fall
  2. 将自己记录的集群currentEpoch加1,并光弄FAILOVER_AUTH_REQUEST信息
  3. 其他节点收到该信息,只有master响应,判断请求者的合法性,并发送FAILOVER_AUTH_ACK,对每一个epoch只是发送一次
  4. 尝试failover的slave收集master返回的FAILOVER_AUTH_ACK
  5. salve收到超过半数的ACK后就会变为新的Master(所以说,为什么至少需要三个主节点,如果只有两个,当其中一个挂了,只剩一个主节点是不能选举成功的)
  6. slaver广播Pong消息通知其他集群节点

注:从节点并不是在主节点一进入 FAIL 状态就马上尝试发起选举,而是有一定延迟,一定的延迟确保我们等待FAIL状态在集群中传播,slave如果立即尝试选举,其它masters或许尚未意识到FAIL状态,可能会拒绝投票
延迟计算公式:DELAY = 500ms + random(0 ~ 500ms) + SLAVE_RANK * 1000ms

1.5、Redis集群闹裂问题分析与解决

redis集群没有过半机制会有脑裂问题,也就是如果在主从中,如果主节点出现网络问题,与从节点通信断开,从节点会认为主节点已经挂了,会重新选举Master节点,写数据时,会写入两个节点,那网络恢复之后,被屏蔽的主节点就会拉取当前选举出来的主节点数据,之前在屏蔽主节点写的数据就会被覆盖,所以,就存在脑裂问题,解决方案为:设置参数min‐replicas‐to‐write 1 //写数据成功最少同步的slave数量,这个数量可以模仿大于半数机制配置,比如集群总共三个节点可以配置1,加上leader就是2,超过了半数

二、Redis Cluster高可用集群水平拓展实战

这里我们需要在原有的集群基础上关注如下图示的两个命令:
在这里插入图片描述
具体命令为:

src/redis‐cli ‐a zhuge ‐‐cluster add‐node 192.168.118.102:8007 192.168.118.102:8001

需要给新增的节点分配槽位:

src/redis‐cli ‐a lyf ‐‐cluster reshard 192.168.118.102:8001

结果输出如下:
输出如下:
How many slots do you want to move (from 1 to 16384)? 600
(需要多少个槽移动到新的节点上,自己设置,比如600个hash槽)
What is the receiving node ID? 2728a594a0498e98e4b83a537e19f9a0a3790f38
(把这600个hash槽移动到哪个节点上去,需要指定节点id)
Please enter all the source node IDs.
Type ‘all’ to use all the nodes as source nodes for the hash slots.
Type ‘done’ once you entered all the source nodes IDs.
Source node 1:all
(输入all为从所有主节点(8001,8002,8003)中分别抽取相应的槽数指定到新节点中,抽取的总槽数为600个)
… …
Do you want to proceed with the proposed reshard plan (yes/no)? yes
(输入yes确认开始执行分片任务)

同样的方式,将8008加入,并作为8007从节点:

src/redis‐cli ‐a lyf ‐c ‐h 192.168.118.102 ‐p 8008
192.168.118.102:8008> cluster replicate 2728a594a0498e98e4b83a537e19f9a0a3790f38 #后面这串id为8007的节点id
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值