• Redis_三种集群模式


    主从模式

    如何配置

    启动两个redis实例,登录从服务器的redis,执行下面的命令,就配置完成了

    slaveof <主ip> <主port>

    配置完成后,执行 info replication 命令,就能够知道服务器的基本信息了

    显示 "role:master" 是主服务器
    显示 "role:slaveof" 是从服务器

    特点

    1、设置主从后,主服务器可读可写;从服务器只能读,不能写。

    2、主服务器加上密码之后,需要在从服务器的配置文件里加mastersauth password,主服务器的数据才能同步到从服务器。

    3、当主服务器挂掉了,从服务器还是从服务器,这个时候就无法向redis中写数据了。

    主从复制原理

    1、主服务器与从服务器建立连接

    2、从服务器向主服务器发送进行数据同步的消息

    3、主服务器收到数据同步的消息,将主服务器的数据进行持久化,把rdb文件发送到从服务器,从服务器拿到rdb文件进行读取

    4、主服务器进行写操作后,收集所有收到的修改数据命令,执行完毕后,将新的所有收集到的修改命令一次传递给从服务器进行数据同步

    全量复制:从服务器接收到数据库文件数据后,将期存起来并加载到内存中

    增量复制:主服务器将新的所有收集到的修改命令一次传递给slave,完成同步

    从服务器连接主服务器的时候,进行的时全量复制,之后就是主服务器主动传递给从服务器增量数据,是增量复制。

    优缺点

    优点:读写分离,将Redis读操作分摊到多个节点,大大提高redis服务器的并发量

    缺点:不支持容错,master宕机后没有可写节点,可能会数据丢失,较难支持扩容

    薪火相传

    在从服务器上再挂一从服务器,就起到了薪火相传的作用

    slaveof <从ip> <从port>

    当从中间的从服务器挂掉时,他下面的从服务器,不会再接收到同步信息;主服务挂掉了,从服务器还是从服务器,无法写数据了,主服务器启动后,仍然为主服务器

    反客为主

    当主服务器挂掉之后,登录到从服务器,执行下面的命令,将从服务器变成主服务器

    slaveof no one

    这种方式是手动的,怎么变成自动的呢?那就要用哨兵模式了。

    哨兵模式

    如何配置

    新建一个哨兵的配置文件sentinel.conf,加上下面的配置

    sentinel monitor mymaster 127.0.0.1 6379 1

    mymaster 代表哨兵服务的名称

    127.0.0.1 代表主服务器的ip

    6379 代表主服务器的端口号

    1 代表有多少个哨兵认为主机挂掉了,才进行切换,这里是有一个哨兵认为主机挂掉了,就切换主机

    启动哨兵:redis-sentinel /sentinel.conf

    默认端口:26379

    切换过程

    检测到主机挂掉,选择一台从服务器作为主服务器,另一个从服务器仍然作为从服务器,挂掉的主服务器变成挂掉的从服务器。挂掉的主服务器再次启动的时候,会变成从服务器。

    从服务器选择规则

    1、选择优先级靠前的,也就是说slave-priorty,他的值越小,优先选为主服务器;slave-priorty是优先级的配置,当主服务器挂掉的时候,按照这个配置决定哪一个做从服务器。新版本中这个配置是replica-priorty.

    2、选择偏移量大的,偏移量指的是跟主服务器同步数据的数量,同步的多的,优先选为主服务器;

    3、选择runid最小的,每个redis实例启动之后会随机生成一个40位的runid,小的优先原为主机;

    优缺点

    优点:

    1、哨兵模式基于主从复制,因此主从复制的优点哨兵都具备

    2、哨兵具备了主从切换和故障转移,因此集群有了更高的可用性

    3、sentinel 哨兵主要用来监控redis主从,提高了redis 主从的可用性。

    缺点:

    1、Redis较难支持在线扩容,在线扩容比较复杂。

    由于所有的操作都在主服务器上,然后同步到从服务器上,所以同步到从服务器的时候会有一定的延迟,当系统很忙的时候,延迟问题会更加严重,从服务器个数的增加,也会使这个问题更加严重。

    在java开发的时候,修改数据库连接池的ip和端口配置为哨兵的ip和端口号,在实例化连接池的时候,指定名称为哨兵的名称,也就是mymaster。

    集群模式

    如何配置

    无中心化集群配置

    cluster-enabled yes 打开集群配置

    cluster-config-file nodes-6379.conf 设置当前节点的配置文件名字

    cluster-node-timeout 15000 设置节点超时时间

    redis-cli --cluster create --cluster-replicas 1 ip1:port1 ip2:port2 ip3:port3 ip4:port4

    这里面的1指的是以最简单的方式进行分配,分配原则:尽量保证每个主数据库在不同IP地址上,主库和从库不再一个ip地址上

    redis-cli -c -p 6379   以集群的方式连接

    cluster nodes  查看集群节点信息

    原理

    一个redis集群,包含16384个插槽,数据库中的每个键都属于这16384个插槽的其中一个,集群使用CRC16(KEY)%16384来判断属于哪个槽(插槽编号为0~16383)。
    客户端只需要连接其中任意一个节点,就能查询到所有节点的数据,Redis集群中每个节点都保存了其他节点的插槽信息。当要进行数据存取的时候,将key按照公式计算后得到插槽编号,通过保存槽信息从配置中获取节点信息,然后再去对应得节点获取数据。

    redis-cluster集群引入了主从复制模型,一个主节点对应一个或多个从节点,当主节点宕机的时候,就会启用从节点。当其它主节点 ping 一个主节点 A 时,如果半数以上的主节点与 A 通信超时,那么认为主节点 A 宕机了。

    如果主节点 A 和它的从节点 A1 都宕机了,那么看配置文件中的配置clluster-require-full-converage 的值为yes,那么该集群挂掉,无法再提供服务;如果为no,该插槽数据不能使用了。

    优缺点

    优点:支持扩容,减轻压力

    缺点:多键操作不支持,多键的redis不支持事务​​​​​​​

  • 相关阅读:
    一图多码如何分解?快速做二维码解码的方法
    SpringBoot
    (202402)多智能体MetaGPT入门1:MetaGPT环境配置
    ElasticSearch-查询语法(全文查询)
    9月9日扒面经
    PaddleOCR安卓Demo存在的问题
    XiaodiSec day028 Learn Note 小迪安全学习笔记
    配电室智能运维方案
    字节二面问的MySQL,差点没答好
    计算机毕业设计 基于SpringBoot的驾校管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • 原文地址:https://blog.csdn.net/weixin_40877388/article/details/127756364