zoukankan      html  css  js  c++  java
  • Redis的主从架构+哨兵模式

    Redis主从架构

    redis主从架构搭建,配置从节点步骤:

    1、复制一份redis.conf文件的目录

    cd /usr/local/java
    cp -a redis redis_6380

    2、将相关配置修改为如下值:

    port 6380
    pidfile /var/run/redis_6380.pid  # 把pid进程号写入pidfile配置的文件
    logfile "6380.log"
    dir /usr/local/redis/data/6380  # 指定数据存放目录
    # 需要注释掉bind
    # bind 127.0.0.1(bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户端通过机器的哪些网卡ip去访问,内网一般可以不配置bind,注释掉即可)

    注意数据存放目录的文件夹目录要预先设置好

    3、配置主从复制

    replicaof 127.0.0.1 6379   # 从本机6379的redis实例复制数据,Redis 5.0之前使用slaveof
    replica-read-only yes  # 配置从节点只读

    4、启动从节点

     /usr/local/bin/redis-server /usr/local/java/redis_6380/redis.conf

    5、连接从节点

     ./redis-cli -p 6380

    6、测试在6379实例上写数据,6380实例是否能及时同步新修改数据

    6379主节点

     6380从节点

    Redis主从工作原理

    如果你为master配置了一个slave,不管这个slave是否是第一次连接上Master,它都会发送一个PSYNC命令给master请求复制数据。

    master收到PSYNC命令后,会在后台进行数据持久化通过bgsave生成最新的rdb快照文件,持久化期间,master会继续接收客户端的请求,它会把这些可能修改数据集的请求缓存在内存中。

    当持久化进行完毕以后,master会把这份rdb文件数据集发送给slave,slave会把接收到的数据进行持久化生成rdb,然后再加载到内存中。然后,master再将之前缓存在内存中的命令发送给slave。

    当master与slave之间的连接由于某些原因而断开时,slave能够自动重连Master,如果master收到了多个slave并发连接请求,它只会进行一次持久化,而不是一个连接一次,然后再把这一份持久化的数据发送给多个并发连接的slave。

    主从复制(全量复制)流程图:

    数据部分复制

    当master和slave断开重连后,一般都会对整份数据进行复制。但从redis2.8版本开始,redis改用可以支持部分数据复制的命令PSYNC去master同步数据,slave与master能够在网络连接断开重连后只进行部分数据复制(断点续传)。

    master会在其内存中创建一个复制数据用的缓存队列,缓存最近一段时间的数据,master和它所有的slave都维护了复制的数据下标offset和master的进程id,因此,当网络连接断开后,slave会请求master继续进行未完成的复制,从所记录的数据下标开始。

    如果master进程id变化了,或者从节点数据下标offset太旧,已经不在master的缓存队列里了,那么将会进行一次全量数据的复制。

    主从复制(部分复制,断点续传)流程图:

    如果有很多从节点,为了缓解主从复制风暴(多个从节点同时复制主节点导致主节点压力过大),可以做如下架构,让部分从节点与从节点(与主节点同步)同步数据

    Redis哨兵高可用架构

    sentinel哨兵是特殊的redis服务,不提供读写服务,主要用来监控redis实例节点。

    哨兵架构下client端第一次从哨兵找出redis的主节点,后续就直接访问redis的主节点,不会每次都通过sentinel代理访问redis的主节点,当redis的主节点发生变化,哨兵会第一时间感知到,并且将新的redis主节点通知给client端(这里面redis的client端一般都实现了订阅功能,订阅sentinel发布的节点变动消息)

    redis哨兵架构搭建步骤:

    1、自己再配置一个6381的从节点,步骤和上述6380一样,首先配置6379主节点的sentinel.conf文件

    2、将相关配置修改为如下值:

    port 26379
    daemonize yes
    pidfile "/var/run/redis-sentinel-26379.pid"
    logfile "26379.log"
    dir /usr/local/redis/data
    # sentinel monitor <master-redis-name> <master-redis-ip> <master-redis-port> <quorum>
    # quorum是一个数字,指明当有多少个sentinel认为一个master失效时(值一般为:sentinel总数/2 + 1),master才算真正失效
    sentinel monitor mymaster 127.0.0.1 6379 2   # mymaster这个名字随便取,客户端访问时会用到

    3、启动sentinel哨兵实例

    cd  /usr/local/bin
    ./redis-sentinel /usr/local/java/redis/sentinel.conf

    4、查看sentinel的info信息

    redis-cli -p 26379
    info

    可以看到Sentinel的info里已经识别出了redis的主从

     

    自己再配置两个sentinel,端口26380和26381,注意上述配置文件里的对应数字都要修改

    启动26380

    /usr/local/bin/redis-sentinel /usr/local/java/redis_6380/sentinel.conf
    redis-cli -p 26380

     启动26381

    /usr/local/bin/redis-sentinel /usr/local/java/redis_6381/sentinel.conf
    redis-cli -p 26381

    sentinel集群都启动完毕后,会将哨兵集群的元数据信息写入所有sentinel的配置文件里去(追加在文件的最下面),我们查看下6379的如下配置文件sentinel.conf,如下所示:
    当redis主节点如果挂了,哨兵集群会重新选举出新的redis主节点,同时会修改所有sentinel节点配置文件的集群元数据信息,

     比如6379的redis如果挂了,

     假设选举出的新主节点是6380,则sentinel文件里的集群元数据信息会变成如下所示

    同时还会修改sentinel文件里之前配置的mymaster对应的6379端口,改为6380
    当6379的redis实例再次启动时,哨兵集群根据集群元数据信息就可以将6379端口的redis节点作为从节点加入集群
    /usr/local/bin/redis-server /usr/local/java/redis/redis.conf
    ./redis-sentinel /usr/local/java/redis/sentinel.conf

  • 相关阅读:
    【Anagrams】 cpp
    【Count and Say】cpp
    【Roman To Integer】cpp
    【Integer To Roman】cpp
    【Valid Number】cpp
    重构之 实体与引用 逻辑实体 逻辑存在的形式 可引用逻辑实体 不可引用逻辑实体 散弹式修改
    Maven项目聚合 jar包锁定 依赖传递 私服
    Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器
    mysql案例~tcpdump的使用
    tidb架构~本地化安装
  • 原文地址:https://www.cnblogs.com/lusaisai/p/14397452.html
Copyright © 2011-2022 走看看