Redis--05--集群搭建

为什么要搭建集群

  1. 通常,为了提高网站响应速度,总是把热点数据保存在内存中而不是直接从后端数据库中读取。 Redis是一个很好的Cache工具。大型网站应用,热点数据量往往巨大,几十G上百G是很正常的事儿。
  2. 由于内存大小的限制,使用一台 Redis 实例显然无法满足需求,这时就需要使用多台.Redis作为缓存数据库。但是如何保证数据存储的一致性呢,这时就需要搭建redis集群.采用合理的机制,保证用户的正常的访问需求.
  3. 采用redis集群,可以保证数据分散存储,同时保证数据存储的一致性.并且在内部实现高可用的机制.实现了服务故障的自动迁移.

redis分片特点:

1.可以实现Redis内存数据的扩容.
2.redis分片本身没有高可用效果的.如果宕机将直接影响用户的使用.

redis哨兵特点:

1.Redis哨兵可以实现Redis节点的高可用.但是哨兵本身没有实现高可用机制.(最好不要引入第三方)
2.Redis哨兵有主从的结构 实现了内存数据的备份. 但是没有实现内存扩容的效果.

升级:

需要Redis内容扩容同时需要Redis高可用性所以应该使用Redis集群.

集群搭建

1 准备集群文件夹

1.准备集群文件夹

Mkdir cluster

2.在cluster文件夹中分别创建7000-7005文件夹
在这里插入图片描述

2.复制配置文件

说明:
将redis根目录中的redis.conf文件复制到cluster/7000/ 并以原名保存

cp redis.conf cluster/7000/

3 .编辑配置文件

  1. 注释本地绑定IP地址
    在这里插入图片描述
  2. 关闭保护模式
    在这里插入图片描述
  3. 修改端口号
    在这里插入图片描述
  4. 启动后台启动
    在这里插入图片描述
  5. 修改pid文件
    在这里插入图片描述
  6. 修改持久化文件路径
    在这里插入图片描述
  7. 设定内存优化策略
    在这里插入图片描述
  8. 关闭AOF模式
    在这里插入图片描述
  9. 开启集群配置
    在这里插入图片描述
    10. 开启集群配置文件
    在这里插入图片描述
  10. 修改集群超时时间
    在这里插入图片描述
  11. 修改集群超时时间
    在这里插入图片描述

4 复制修改后的配置文件

说明:将7000文件夹下的redis.conf文件分别复制到7001-7005中

[root@localhost cluster]# cp 7000/redis.conf  7001/
[root@localhost cluster]# cp 7000/redis.conf  7002/
[root@localhost cluster]# cp 7000/redis.conf  7003/
[root@localhost cluster]# cp 7000/redis.conf  7004/
[root@localhost cluster]# cp 7000/redis.conf  7005/

5 批量修改

说明:分别将7001-7005文件中的7000改为对应的端口号的名称,
修改时注意方向键的使用
在这里插入图片描述

6 通过脚本编辑启动/关闭指令

1.	创建启动脚本  vim start.sh

在这里插入图片描述
2. 编辑关闭的脚本 vim shutdown.sh
在这里插入图片描述
3. 启动redis节点

sh start.sh
  1. 检查redis节点启动是否正常
    在这里插入图片描述

实际操作

在这里插入图片描述

#!/bin/bash
cd redis01  
/usr/local/bin/redis-server redis.conf  
cd ..  
cd redis02  
/usr/local/bin/redis-server redis.conf  
cd ..  
cd redis03  
/usr/local/bin/redis-server redis.conf  
cd ..  
cd redis04  
/usr/local/bin/redis-server redis.conf  
cd ..  
cd redis05  
/usr/local/bin/redis-server redis.conf  
cd ..  
cd redis06  
/usr/local/bin/redis-server redis.conf  
cd ..

[root@appserver2 cluster]# ./start-all.sh

在这里插入图片描述

7 创建redis集群

5.0以下版本

如果你正在使用 Redis 4.0.12 版本,那么 redis-trib.rb 工具仍然适用于创建和管理 Redis 集群。Redis 4.0.x 版本的 redis-trib.rb 工具支持 create 命令来创建集群。

使用 redis-trib.rb 创建 Redis 集群的步骤
1.确认 redis-trib.rb 的位置

  • 首先,确认你的 Redis 安装目录中是否包含了 redis-trib.rb 工具。通常情况下,它位于 Redis 源码目录下的 src目录中。
    在这里插入图片描述

2.创建 Redis 集群

假设你已经确定了 redis-trib.rb 的位置,可以按照以下步骤创建 Redis 集群:

  • 如果你已经在 src 目录下,可以使用相对路径
cd /data/redis-4.0.12/src

在这里插入图片描述
在这里插入图片描述
3.client.rb修改
在这里插入图片描述

	find / -name 'client.rb'
//进入到第一次编译的目录
cd /usr/local/redis/redis-4.0.14/src

//创建集群
./redis-trib.rb create --replicas 1 192.168.2.70:6379 192.168.2.70:7000 192.168.126.129:7001 192.168.126.129:7002 192.168.126.129:7003 192.168.126.129:7004

在这里插入图片描述

在这里插入图片描述

5.0版本执行 使用C语言内部管理集群

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

在这里插入图片描述
在这里插入图片描述
连接一个节点 测试

redis-cli -h 192.168.2.70 -p 6379 -a 密码
cluster nodes

在这里插入图片描述

8 Redis集群高可用测试

  1. 关闭redis主机.检查是否自动实现故障迁移.
  2. 再次启动关闭的主机.检查是否能够实现自动的挂载.
    一般情况下 能够实现主从挂载
    个别情况: 宕机后的节点重启,可能挂载到其他主节点中(7001-7002) 正确的
    在这里插入图片描述

9.关于Redis集群搭建问题说明

前提条件: redis.conf的配置文件首先应该配置正确 码云中有redis配置.

搭建步骤:

1.关闭所有的redis服务器

sh stop.sh

在这里插入图片描述
2.删除多余的文件
由于搭建集群之后,所有的集群的信息都会写入nodes.conf文件中,如果下次重启会读取其中的配置信息实现redis集群的主从的搭建. 所以如果需要重新搭建集群,则必须删除该文件重新生成.
在这里插入图片描述

4.重启redis服务器 执行挂载命令

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

10. SpringBoot整合Redis集群

redis集群的入门案例
jedisCluster 操作整个redis集群,链接redis的所有的节点

 @Test
    public void testCluster(){
        Set<HostAndPort> sets = new HashSet<>();
        sets.add(new HostAndPort("192.168.126.129", 7000));
        sets.add(new HostAndPort("192.168.126.129", 7001));
        sets.add(new HostAndPort("192.168.126.129", 7002));
        sets.add(new HostAndPort("192.168.126.129", 7003));
        sets.add(new HostAndPort("192.168.126.129", 7004));
        sets.add(new HostAndPort("192.168.126.129", 7005));
        JedisCluster jedisCluster = new JedisCluster(sets);
        jedisCluster.set("cluster", "集群测试");
        System.out.println(jedisCluster.get("cluster"));
    }

Redis集群原理

Redis集群高可用推选原理

Redis的所有节点都会保存当前redis集群中的全部主从状态信息.并且每个节点都能够相互通信.当一个节点发生宕机现象.则集群中的其他节点通过PING-PONG检测机制检查Redis节点是否宕机.当有半数以上的节点认为宕机.则认为主节点宕机.同时由Redis剩余的主节点进入选举机制.投票选举链接宕机的主节点的从机.实现故障迁移.

在这里插入图片描述

Redis集群宕机条件

特点:集群中如果主机宕机,那么从机可以继续提供服务,
当主机中没有从机时,则向其它主机借用多余的从机.继续提供服务.如果主机宕机时没有从机可用,则集群崩溃.
在这里插入图片描述
如果3主3从(1主1从) 最少/宕机几台集群崩溃? B
A. 1台 B.2台 C.3台 D.4台

如果3主6从(1主2从) 最少宕机几台集群崩溃? C
A. 3台 B.4台 C.5台 D.6台
说明: 如果没有子节点 则会借用其他主机的多余的从.

关于选举机制-脑裂现象

说明: 当集群进行选举时,如果连续3次都出现了平票的结果的则可能出现脑裂的现象.(3主3从)
问题: 出现脑裂现象的概率是多少??? 1/8
数学建模:
抛银币连续3次出现平票的概念是多少? 1/8=12.5%
第一次: 正正 正反 反正 反反 1/2
第二次: 正正 正反 反正 反反 1/2
第三次: 正正 正反 反正 反反 1/2

预防: 增加主节点的数量可以有效的降低脑裂现象的发生.

Redis hash槽存储数据原理

说明:

RedisCluster采用此分区,所有的键根据哈希函数(CRC16[key]%16384)映射到0-16383槽内,共16384个槽位,每个节点维护部分槽及槽所映射的键值数据.根据主节点的个数,均衡划分区间.

算法:

哈希函数: Hash()=CRC16[key]%16384

图解

在这里插入图片描述
当向redis集群中插入数据时,

  1. 首先将key进行计算.之后将计算结果匹配到具体的某一个槽的区间内,
  2. 之后再将数据set到管理该槽的节点中.
    在这里插入图片描述

集群面试题

问题1: Redis集群中最多存储16384个数据???
错的 分区只负责数据的划分 数据的存储由内存决定.
crc16(key1)%16384 = 1000
crc16(key2)%16384 = 1000

问题2: Redis集群中最多有多少台主机?? 16384主机.
一台主机占用一个槽道

SpringBoot整合Redis集群

1 编辑pro配置文件

# 配置redis单台服务器
redis.host=192.168.126.129
redis.port=6379

# 配置redis分片机制
redis.nodes=192.168.126.129:6379,192.168.126.129:6380,192.168.126.129:6381

# 配置哨兵节点
redis.sentinel=192.168.126.129:26379

# 配置redis集群
redis.clusters=192.168.126.129:7000,192.168.126.129:7001,192.168.126.129:7002,192.168.126.129:7003,192.168.126.129:7004,192.168.126.129:7005

2 编辑RedisConfig配置类

@Configuration
@PropertySource("classpath:/properties/redis.properties")
public class JedisConfig {

    @Value("${redis.clusters}")
    private String clusters;

    @Bean
    public JedisCluster jedisCluster(){
        Set<HostAndPort> nodes = new HashSet<>();
        String[] nodesArray = clusters.split(",");
        for (String node : nodesArray){
            String host = node.split(":")[0];
            int port = Integer.parseInt(node.split(":")[1]);
            HostAndPort hostAndPort = new HostAndPort(host,port);
            nodes.add(hostAndPort);
        }
        return new JedisCluster(nodes);
    }
  }

3.编辑CacheAOP

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值