redis主从、哨兵、cluster

在redis集群中,从节点一般用于备份操作,主节点挂了,从节点顶上去,读写操作一般都是主读主写。

主从架构

用处:用于数据备份操作,主节点挂了之后可以有备份节点顶上去当主节点。
缺点:主节点挂了需要手动切换从节点为主节点。
原理: 从客户端首先会请求主节点拉取主节点的所有数据,主节点接收到请求之后,发送当前时间以及当前时间的AOF文件发送到从节点,如果从节点在同步的过程中,主节点又接收到新指令数据了,那么主节点会将数据存储到缓冲区中,在从节点同步完AOF之后再同步缓冲区的内容,缓冲区同步完毕之后中从节点会建立起一个长连接,主节点有新指令了则会自动同步到从节点中。如下图所示
image
由于全量复制太浪费系统资源了, 在主节点中会维护一个缓冲区,我们只要同步以及同步指令以后的数据,在缓冲区中记录最近的指令数据,主节点挂了之后根据偏移量,找到下一条指令继续同步,例如如果从节点同步了十条数据,在同步第十一条,这时候从节点再同步数据的时候忽略前十条,直接找第十条以后同步数据就可以了,这个缓冲区大小是有限制的,由于从节点挂的时间太长,在缓冲区找不到指定的指令数据的时候,那么只能重写全部拉取了。
image

主从复制风暴:主节点需要向从节点推送数据,如果从节点过多时,主节点压力过大会导致阻塞、宕机,这时候可以优化主从架构,让一部分从节点担任主节点来给其他从节点同步数据。
image

配置

从节点在redis.conf添加以下配置

# 配置主节点信息
replicaof 192.168.18.147 6379
# 从节点只能对数据进行读 禁止写
replica-read-only yes

管道

为了提升性能,避免消耗大量io,每次发送数据都需要建立连接,会消耗时间,使用 Piplie 可以避免消耗这些时间, 一次性将命令发送多个指令到redis中,但是管道不具备原子性。
文档: https://docs.spring.io/spring-data/data-redis/docs/current/reference/html/#pipeline
SessionCallback:似乎是统一会话执行多条命令。
RedisCallback: 似乎是根据连接执行命令,具体官方例子也没看太懂。

        List<Object> objects = stringRedisTemplate.executePipelined(new SessionCallback<Object>() {
            @Override
            public Object execute(RedisOperations operations) throws DataAccessException {
                for (int i = 0; i < 100; i++) {
                    operations.opsForValue().set(i + "", i + "");
                }
                return null;
            }
        });

如果命令执行成功则会返回true,最后根据执行的序列返回一个list
image
image

哨兵

主节点挂了之后没办法自动切换从节点为主节点,当主节点挂了之后,哨兵可以利用选举机制,将从节点选举为主节点,然后再将主节点的信息推送到客户端中。在使用时客户端可以从哨兵拉取主节点的地址,客户端不会每一次都去sentinel拉取主节点信息的,只有在主节点发生改变时才会进行拉取,然后在进行读写。客户端向哨兵拉取主节点信息进行数据读写,如果哨兵挂了,那么redis集群则会不可用。
image

搭建

下载sentinel配置文件: https://download.redis.io/redis-stable/sentinel.conf
哨兵需要在主从架构的基础上才能配置,每个节点都需要配置并启动哨兵
添加sentinel配置:

# 主节点信息 主节点名称 IP 端口 quorum,quorum一般是集群节点数的一半+1
sentinel monitor mymaster 192.168.18.147 6379 2
# 主节点密码
sentinel auth-pass mymaster 365373011

启动

redis-server redis.conf
redis-sentinel sentinel.conf

当主节点进行切换时会在sentinel.conf自动写入主从节点信息
image
spring data redis配置,哨兵搭起来了,但是还没在代码中测试过。

spring:
  data:
    redis:
      host: 192.168.18.114
      port: 6379
      sentinel:
        # 集群名称
        master: mymaster
        # 节点信息
        nodes:  192.168.18.147,192.168.18.187,192.168.18.223

redis cluster

使用sentinel的缺点是如果主节点挂了,在进行主节点选举的时候,会导致一段时间服务不可用,等主节点选举完毕才可用,并且哨兵模式只能由一个节点来对外提供服务,没办法支持高并发,redis cluster可以多节点对外提供服务。单节点一般设置不到10GB,如果内存较大的话,内存读写同步会使主节点造成很大的压力。
image
redis cluster支持数据分片,redis cluster共有16384个hash slot,将hash slot均匀的分配到其他子集群中,例如集群1使用0-5000,集群而使用5000-10000,集群3使用10000-16384。client访问会修改数据时,redis cluster会先根据key进行hash,hash后再与16384进行取余操作,以此来找到修改数据的子集群。当下属子节点的主节点挂了 如果刚好根据hash slot访问的是挂了的子集群 那么会暂时无法访问 等切换选举主节点才能访问。
如果主从节点放在一台机子上会导致,如果整台机子宕机了,那么整个子集群会不可用,为了优化这个问题,redis集群会根据集群的不同,错峰匹配主从。

数据分片:总过有16384个逻辑槽,根据主节点的个数,将数据保存到逻辑槽中。

想要设置redis cluster需要关闭之前配置的主从和哨兵,
添加以下配置:

# 开启redis cluster
cluster-enabled yes
# 设置集群信息保存文件
cluster-config-file "nodes-6379.conf"
# 设置节点超时时间,如果到达超时时间则节点不可用,需要重新选举节点。
cluster-node-timeout 15000

之后按配置启动节点即可。

# 启动redis服务
redis-server redis.conf
# 命令只需要在不需要每个节点都执行一次 -a表示节点密码, cluster-replica后面的1表示cluster下面的字节点有多少个从节点 这个命令只需要执行一次 执行命令完成后所有节点将会自动生成一个文件名字叫nodes-xxx.conf的配置文件,配置文件中记录了集群节点的信息,所有下次执行时直接启动服务就可以了,启动命令之后会展示hash slot信息,直接yes即可。
redis-cli -a 365373011 --cluster create --cluster-replicas 1 192.168.18.187:6379 192.168.18.223:6379 192.168.18.147:6379 192.168.18.187:6380 192.168.18.223:6380 192.168.18.147:6380
1·

使用cluster info可以查询集群节点信息
cluster_size表示子节点信息, cluster_size表示有多少个子集群
image
如果cluster不可用,可以使用redis-cli -a 365373011 --cluster check 127.0.0.1:6379来查看cluster的错误信息
image
cluster nodes可以查看集群节点信息
image

posted @   RainbowMagic  阅读(121)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示