redis集群的搭建

1.集群介绍

1.redis集群的原理

1)所有的节点都是互连的,通过ping/pong互连,内部使用二进制协议优化传输速度和带宽
2)节点的fail是通过集群中超过半数节点检测失效时才生效
3)客户端与节点可以直连,不需要中间件,不需要连接到所有的节点,连接到一个节点也行
4)redis集群把所有的物理节点映射到[0-16383]slot(插槽)上,其内置了16384个哈希槽,当需要在redis集群中存一个key-value时,会对key使用crc16算法,算出一个值,再用这个值对16384取余,这样每一个key都能在[0-16383]这个范围内落脚,redis会根据节点数量均等的将哈希槽映射到不同的节点,每个节点的哈希槽数量一般相差不会太大
5)图
在这里插入图片描述
2.怎样投票

1)投票过程是集群中所有master参与,如果半数以上master节点与当前master节点通信时间超过cluster-node-timeout设定的值,则认为当前master节点挂掉

3.怎样判断节点是否可用

1)如果集群任意master挂掉,且该master没有slave,集群进入fail状态,也可以说是集群的[0-16383]这个范围不连续则为挂掉
2)如果集群超过半数master挂掉,无论是否有slave,集群进入fail状态,当集群不可用时,所有对集群的操作都不可用,会受到错误信息反馈

2.集群搭建

2.1 基础搭建

1.准备工作:先提前安装好redis

2.进入redis目录,创建一个空文件夹,主要存放,集群节点的配置文件
在这里插入图片描述
3.进入到rediscluster文件中再新增6个文件夹用于存放redis的配置文件
在这里插入图片描述
4.接下来就是把原来的redis.conf配置文件拷贝出来六份,然后修改里面的数据,分别放到那六个文件夹中,我这里之前redis配置文件改过名,改为了redis6379.conf。

4.1)先把配置文件拷贝到7001文件夹中

cp redis6379.conf rediscluster/7001/redis7001.conf

4.2 )进入到7001文件夹中,修改redis7001.conf文件
在这里插入图片描述
4.2.1)把redis服务器改成后台运行,改为yes
在这里插入图片描述

4.2.2)开启集群功能
在这里插入图片描述
4.2.3)修改节点配置文件名
在这里插入图片描述
4.2.4)开启节点连接的超时时间
在这里插入图片描述
4.2.5)修改服务端口号为7001
在这里插入图片描述
4.2.6)绑定自己的虚拟机ip地址
在这里插入图片描述
4.2.7)开启AOF功能
在这里插入图片描述
4.2.8)修改AOF文件名
在这里插入图片描述
4.2.9)设置连接到当前redis服务器需要的密码
在这里插入图片描述

4.2.10)设置当前redis服务器作为master时,从机连接时需要使用的密码
在这里插入图片描述

4.2.11)保存退出
4.3)将修改后的redis7001.conf文件分别拷贝到其它五个空文件夹中
在这里插入图片描述
4.4)进入到7002文件夹中,修改redis7002.conf文件,修改内容主要是将7001改为7002即可,剩下的其他几个配置文件也一样这样改
在这里插入图片描述

执行命令替换内容即可,如何替换,vi文件后,按Esc,再按:建,再输入替换命令,回车,再保存退出即可
在这里插入图片描述
4.5)其他几个配置文件也是如4.4替换
4.6)启动这六个redis实例
在这里插入图片描述

4.7)通过redis-cli --cluster create命令创建集群,-a后面接的是连接redis的密码

redis-cli --cluster create 192.168.244.132:7001 192.168.244.132:7002 192.168.244.132:7003 192.168.244.132:7004 192.168.244.132:7005 192.168.244.132:7006 -a root123

4.8)输入yes,注意查看,这六个节点这个时候都为master
在这里插入图片描述

4.9)连接进入到7001端口的redis服务器,查看当前节点信息

redis-cli -c -a root123 -p 7001 -h 192.168.244.132
cluster info

在这里插入图片描述
或者通过cluster nodes命令查看
在这里插入图片描述
4.10)在4.9我们可以看到那六个节点都是master,显然这样在实际中是不合理的,应当又slave才比较合理,配置slave也很简单,那么在这之前我们想要删除掉之前配置好的集群信息,把如下文件删除即可
在这里插入图片描述
4.11)再重新执行redis-cli --cluster create命令,添加副本数量为1,这样就是三个master,三个slave了,注意:每个redis700x的配置文件的masterauth都要事先配置好

redis-cli --cluster create 192.168.244.132:7001 192.168.244.132:7002 192.168.244.132:7003 192.168.244.132:7004 192.168.244.132:7005 192.168.244.132:7006 --cluster-replicas 1 -a root123

在这里插入图片描述
4.12)再次连接进入7001,查看节点信息
在这里插入图片描述

3. 动态添加节点

1.在以上2.0章节,已经搭好一个既有master也有slave的redis集群了,那么如何再往集群里面添加节点呢?
2.新建一个7007文件夹,并且从7001文件夹中将redis7001.conf拷贝一份
在这里插入图片描述
3.修改redis7007.conf文件
在这里插入图片描述
4.启动集群中所有的redis实例,可以通过如下命令查看是否启动
在这里插入图片描述

5.执行redis-cli --cluster add-node命令,添加节点,注意:这里要附件多一个节点的信息才可以

redis-cli --cluster add-node 192.168.244.132:7007 192.168.244.132:7006 -a root123

在这里插入图片描述
6.我们通过cluster nodes命令可以看到7007节点为master,但是没有分配到哈希插槽,代表着这个节点当前节点是不可用的,存数据时,这个节点是存不了数据的
在这里插入图片描述
7.我们可以通过命令将其它节点的哈希槽移动到7007节点,如下从7001节点分2020个哈希槽给7007节点

redis-cli --cluster reshard ip地址 + 端口号 --cluster-from 节点uuid --cluster-to 节点uuid --cluster-slots 2020(要分配的哈希槽个数) -a root123(连接密码)

在这里插入图片描述
在这里插入图片描述
8.如何删除节点?注意:在删除之前,得当前节点的哈希槽全部分配给其他节点,再去删掉nodes-700x.conf文件即可

9.我们知道默认添加节点,该节点是master,那如何添加一个节点为slave呢?,也很简单,在执行添加节点如下命令时,其后面加上–cluster-slave --cluster-master-id(id就是节点的id,很长那一串字符串)即可

redis-cli --cluster add-node 192.168.244.132:7007 192.168.244.132:7006 -a root123 --cluster-slave --cluster-master-id

4.jedis操作集群

1.pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>distribute-lock</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--json依赖-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.12.3</version>
        </dependency>
        <!--jedis依赖-->
        <dependency>
               <groupId>redis.clients</groupId>
               <artifactId>jedis</artifactId>
               <version>3.2.0</version>
               <type>jar</type>
               <scope>compile</scope>
        </dependency>
        <!--bloom依赖-->
        <dependency>
               <groupId>com.redislabs</groupId>
               <artifactId>jrebloom</artifactId>
               <version>1.2.0</version>
        </dependency>
    </dependencies>

</project>

2.测试

package com.yl;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;

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

/**
 * jedis操作集群
 */
public class RedisClusterTest {
    public static void main(String[] args) {
        //创建节点
        Set<HostAndPort> nodes = new HashSet<>();
        nodes.add(new HostAndPort("192.168.244.132",7001));
        nodes.add(new HostAndPort("192.168.244.132",7002));
        nodes.add(new HostAndPort("192.168.244.132",7003));
        nodes.add(new HostAndPort("192.168.244.132",7004));
        nodes.add(new HostAndPort("192.168.244.132",7005));
        nodes.add(new HostAndPort("192.168.244.132",7006));
        nodes.add(new HostAndPort("192.168.244.132",7006));
        //连接池配置
        GenericObjectPoolConfig config = new GenericObjectPoolConfig();
        //最大空闲数
        config.setMaxIdle(400);
        //最大连接数
        config.setMaxTotal(2000);
        //连接最大等待时间,-1代表没有限制
        config.setMaxWaitMillis(300000);
        //获取集群对象
        JedisCluster cluster = new JedisCluster(nodes,20000,20000,5,"root123",config);

        //往集群里存数据
        cluster.set("k1","helloVue");
        //从集群里取数据
        String s = cluster.get("k1");
        System.out.println(s);
    }
}

3.结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值