>  기사  >  데이터 베이스  >  Redis의 마스터-슬레이브 동기화 및 센티넬 모드에 대해 이야기해 보겠습니다.

Redis의 마스터-슬레이브 동기화 및 센티넬 모드에 대해 이야기해 보겠습니다.

青灯夜游
青灯夜游앞으로
2022-02-08 09:55:533487검색

이 글은 Redis의 마스터-슬레이브 동기화와 센티넬 모드에 대한 심층적인 이해를 제공하고, 마스터-슬레이브 동기화를 켜고 끄는 방법, Sentinel을 구축하고 시작하는 방법을 소개합니다. 모든 분들께 도움이 되길 바랍니다!

Redis의 마스터-슬레이브 동기화 및 센티넬 모드에 대해 이야기해 보겠습니다.

마스터-슬레이브 동기화

마스터-슬레이브 동기화(마스터-슬레이브 복제)는 Redis 고가용성 서비스의 초석이자 다중 시스템 운영에서 가장 기본적인 서비스입니다. [관련 권장 사항: Redis 동영상 튜토리얼]Redis 高可用服务的基石,也是多机运行中最基础的一个。【相关推荐:Redis视频教程

我们把主要存储数据的节点叫做主节点 (master),把其他通过复制主节点数据的副本节点叫做从节点 (slave),如下图所示:

Redis의 마스터-슬레이브 동기화 및 센티넬 모드에 대해 이야기해 보겠습니다.

Redis一个主节点可以拥有多个从节点一个从节点也可以是其他服务器的主节点,如下图所示:

Redis의 마스터-슬레이브 동기화 및 센티넬 모드에 대해 이야기해 보겠습니다.

主从同步的优点

主从同步具有以下三个优点

  • 性能方面:有了主从同步之后,可以把查询任务分配给从服务器用主服务器来执行写操作,这样极大的提高了程序运行的效率,把所有压力分摊到各个服务器了;
  • 高可用:当有了主从同步之后,当主服务器节点宕机之后,可以很迅速的把从节点提升为主节点,为 Redis 服务器的宕机恢复节省了宝贵的时间;
  • 防止数据丢失:当主服务器磁盘坏掉之后,其他从服务器还保留着相关的数据,不至于数据全部丢失。

开启主从同步

运行中设置从服务器

Redis 运行过程中,我们可以使用 replicaof host port 命令,把自己设置为目标 IP 的从服务器。

如果主服务设置了密码,需要在从服务器输入主服务器的密码,使用 config set masterauth 主服务密码 命令的方式

在执行完 replicaof 命令之后,从服务器的数据会被清空,主服务会把它的数据副本同步给从服务器。

启动时设置从服务器

可以使用命令 redis-server --port 6380 --replicaof 127.0.0.1 6379 将自己设置成目标服务器的从服务器。

数据同步

完整数据同步

当有新的从服务器连接时,为了保障多个数据库的一致性,主服务器会执行一次 bgsave 命令生成一个 RDB 文件,然后再以 Socket 的方式发送给从服务器,从服务器收到 RDB 文件之后再把所有的数据加载到自己的程序中,就完成了一次全量的数据同步

部分数据同步

Redis 2.8 之前每次从服务器离线再重新上线之前,主服务器会进行一次完整的数据同步,然后这种情况如果发生在离线时间比较短的情况下,只有少量的数据不同步却要同步所有的数据是非常笨拙和不划算的,在 Redis 2.8 这个功能得到了优化。

Redis 2.8 的优化方法是当从服务离线之后,主服务器会把离线之后的写入命令,存储在一个特定大小的队列中,队列是可以保证先进先出的执行顺序的,当从服务器重写恢复上线之后,主服务会判断离线这段时间内的命令是否还在队列中,如果在就直接把队列中的数据发送给从服务器,这样就避免了完整同步的资源浪费。

存储离线命令的队列大小默认是 1MB,使用者可以自行修改队列大小的配置项 repl-backlog-size

无盘数据同步

在第一次主从连接的时候,会先产生一个 RDB 文件,再把 RDB 文件发送给从服务器,如果主服务器是非固态硬盘的时候,系统的 I/O

주로 저장하는 노드를 배치합니다. 데이터를 마스터 노드(master)라고 하며, 마스터 노드의 데이터를 복사하는 다른 레플리카 노드를 그림과 같이 슬레이브 노드(slave)라고 합니다. 아래 그림: 🎜🎜Redis의 마스터-슬레이브 동기화 및 센티넬 모드에 대해 이야기해 보겠습니다. 🎜🎜Redis에서 🎜마스터 노드는 여러 개의 슬레이브 노드를 가질 수 있습니다, 🎜슬레이브 노드는 아래 그림과 같이 다른 서버의 마스터 노드가 될 수도 있습니다 : 🎜🎜Redis의 마스터-슬레이브 동기화 및 센티넬 모드에 대해 이야기해 보겠습니다.🎜🎜 🎜마스터-슬레이브 동기화의 장점🎜🎜🎜마스터-슬레이브 동기화에는 다음 세 가지 장점이 있습니다: 🎜
    🎜성능 측면: 마스터-슬레이브를 사용하면 동기화 후 🎜쿼리 작업을 슬레이브 서버에 할당하고 🎜마스터 서버를 사용하여 쓰기 작업을 수행할 수 있습니다. 프로그램 운영 효율성을 높이고 모든 부담을 각 서버에 분산시킵니다.
  • 🎜고가용성: 마스터-슬레이브 동기화를 사용하면 🎜메인 서버 노드가 다운될 때 🎜슬레이브 노드는 매우 빠르게 마스터 노드로 승격될 수 있습니다.
  • Strong>, Redis 서버 다운타임 복구에 귀중한 시간을 절약합니다.
  • 🎜데이터 손실 방지 : 마스터 서버 디스크가 손상되더라도 다른 슬레이브 서버는 여전히 해당 데이터를 유지하므로 모든 데이터가 손실되지 않습니다.
🎜🎜마스터-슬레이브 동기화 활성화🎜🎜🎜작동 중 슬레이브 서버 설정 🎜🎜Redis 작업 중에 replicaof 호스트 포트 명령을 사용하여 대상 IP의 슬레이브 서버로 설정할 수 있습니다. 🎜🎜마스터 서비스에서 비밀번호를 설정한 경우 config set masterauth master service 비밀번호 명령을 사용하여 슬레이브 서버에 마스터 서버의 비밀번호를 입력해야 합니다🎜🎜replicaof를 실행한 후 명령 그 후 슬레이브 서버의 데이터가 지워지고 마스터 서비스는 해당 데이터 복사본을 슬레이브 서버에 동기화합니다. 🎜🎜🎜시작 시 슬레이브 서버 설정🎜🎜redis-server --port 6380 --replicaof 127.0.0.1 6379 명령을 사용하여 자신을 슬레이브 서버로 설정할 수 있습니다. 대상 서버. 🎜🎜🎜데이터 동기화🎜🎜🎜전체 데이터 동기화🎜🎜새로운 슬레이브 서버 연결이 있을 때 🎜순서대로 여러 데이터베이스의 일관성을 보장하기 위해, 메인 서버는 bgsave 명령을 한 번 실행하여 RDB 파일을 생성한 후 Socket 메소드를 사용하여 슬레이브 서버로 보냅니다. 서버로부터 <code>RDB 파일을 받은 후 모든 데이터를 자체 프로그램에 로드하여 🎜전체 데이터 동기화를 완료합니다. 🎜🎜🎜부분 데이터 동기화🎜🎜 Redis 2.8 이전에는 슬레이브 서버가 오프라인이 되었다가 다시 온라인으로 돌아올 때마다 마스터 서버가 완전한 데이터 동기화를 수행했습니다. 오프라인 시간이 상대적으로 짧은 경우, 적은 양의 데이터만 동기화되지 않은 상태에서 모든 데이터를 동기화하는 것은 매우 서투르고 비경제적입니다. 이 기능은 Redis 2.8에서 최적화되었습니다. 🎜🎜Redis 2.8의 최적화 방법은 슬레이브 서비스가 오프라인이 되면 마스터 서버가 오프라인 쓰기 명령을 특정 크기의 대기열에 저장하여 선입선출을 보장할 수 있다는 것입니다. -out 실행. 순차적으로 슬레이브 서버가 다시 작성되고 온라인으로 복원되면 마스터 서비스는 오프라인 기간 동안의 명령이 아직 큐에 있는지 확인하고, 그렇다면 큐에 있는 데이터를 슬레이브 서버로 직접 보냅니다. , 따라서 완전한 동기화를 방지합니다. 🎜🎜오프라인 명령을 저장하기 위한 기본 대기열 크기는 1MB입니다. 사용자는 대기열 크기 구성 항목 repl-backlog-size를 수정할 수 있습니다. 🎜🎜🎜디스크 없는 데이터 동기화🎜🎜첫 번째 마스터-슬레이브 연결 중에 RDB 파일이 먼저 생성된 후 RDB 파일이 전송됩니다. 슬레이브 서버에서 마스터 서버가 솔리드 스테이트 드라이브가 아닌 경우 시스템의 I/O 작업이 매우 높습니다. 🎜

Redis 2.8.18에는 새로운 디스크 없는 복사 기능이 추가되었습니다. 디스크 없는 복사 기능은 RDB 파일을 로컬로 생성하지 않지만 하위 프로세스를 생성한 다음 하위 프로세스를 생성합니다. 프로세스는 소켓을 통해 슬레이브 서버에 RDB 파일을 직접 작성하므로 마스터 서버는 별도의 작업 없이 RDB 파일을 생성할 수 있습니다. , 슬레이브 서버와의 데이터 동기화를 완료합니다. Redis 2.8.18 新增了无盘复制功能,无盘复制功能不会在本地创建 RDB 文件,而是会派生出一个子进程,然后由子进程通过 Socket 的方式,直接将 RDB 文件写入到从服务器,这样主服务器就可以在不创建 RDB 文件的情况下,完成与从服务器的数据同步。

要使用无须复制功能,只需把配置项 repl-diskless-sync 的值设置为 yes 即可,它默认配置值为 no

查询服务器的角色

使用 role 命令,来查询当前服务器的主从角色信息。

关闭主从同步

可以使用 replicaof no one 命令来停止从服务器的复制。

执行了 replicaof no one 命令之后,自己就从服务器变成主服务器了。

服务器类型的转换并不会影响数据,这台服务器的数据将会被保留。

注意事项

数据一致性问题

当从服务器已经完成和主服务的数据同步之后,再新增的命令会以异步的方式发送至从服务器,在这个过程中主从同步会有短暂的数据不一致,如在这个异步同步发生之前主服务器宕机了,会造成数据不一致。

从服务器只读性

默认情况下,处于复制模式的主服务器既可以执行写操作也可以执行读操作,而从服务器则只能执行读操作。

可以在从服务器上执行 config set replica-read-only no 命令,使从服务器开启写模式,但需要注意以下几点:

  • 在从服务器上写的数据不会同步到主服务器;
  • 当键值相同时主服务器上的数据可以覆盖从服务器;
  • 在进行完整数据同步时,从服务器数据会被清空。

复制命令的变化

Redis 5.0 之前使用的复制命令是 slaveof,在 Redis 5.0 之后复制命令才被改为 replicaof,在高版本(Redis 5+)中我们应该尽量使用 replicaof,因为 slaveof 命令可能会被随时废弃掉。

哨兵模式

主从复制模式,它是属于 Redis 多机运行的基础,但这种模式本身存在一个致命的问题,当主节点奔溃之后,需要人工干预才能恢复 Redis 的正常使用。

我们需要一个自动的工具——Redis Sentinel(哨兵模式)来把手动的过程变成自动的,让 Redis 拥有自动容灾恢复(failover)的能力。

哨兵就相当于对主从服务器做一个监视的任务。一旦发现主服务器宕机了,就迅速启动相应的规则将某一台从服务器升级为主服务器,无需人工干预,更稳定更快

Redis Sentinel 的最小分配单位是一主一从。

Redis의 마스터-슬레이브 동기화 및 센티넬 모드에 대해 이야기해 보겠습니다.

Redis Sentinel 搭建

使用命令 ./src/redis-sentinel sentinel.conf 来启动 Sentinel,在启动它时必须设置一个 sentinel.conf 文件,这个配置文件中必须包含监听的主节点信息:

sentinel monitor master-name ip port quorum

其中:

  • master-name 表示给监视的主节点起一个名称;
  • ip 表示主节点的 IP;
  • port 表示主节点的端口;
  • quorum 表示确认主节点下线的 Sentinel 数量,如果 quorum 设置为 1 表示只要有一台 Sentinel 判断它下线了,就可以确认它真的下线了。

如果主节点服务器 Redis 有密码,sentinel.conf 必须包含以下内容:

sentinel monitor mymaster 127.0.0.1 6379 1
sentinel auth-pass mymaster pwd654321

启动 Sentinel 集群

生产环境我们不会只启动一台 Sentinel,因为如果启动一台 Sentinel 假如它不幸宕机的话,就不能提供自动容灾的服务了,不符合我们高可用的宗旨,所以我们会在不同的物理机上启动多个 Sentinel 来组成 Sentinel 集群,来保证 Redis

복사 방지 기능을 사용하려면 구성 항목 repl-diskless-sync의 값을 yes로 설정하면 됩니다. 기본 구성 값은 no. 🎜🎜<strong><span style="font-size: 18px;">서버 역할 쿼리</span></strong>🎜🎜<code>role 명령을 사용하여 마스터 및 서버 역할을 쿼리하세요. 현재 서버의 슬레이브 역할 정보입니다. 🎜🎜마스터-슬레이브 동기화 끄기🎜🎜 replicaof no one 명령을 사용하여 다음을 수행할 수 있습니다. 슬레이브 서버 복사를 중지합니다. 🎜🎜replicaof no one 명령을 실행한 후 서버에서 메인 서버로 변경하게 됩니다. 🎜🎜서버 유형을 변환해도 데이터에는 영향을 미치지 않으며, 이 서버의 데이터는 그대로 유지됩니다. 🎜🎜참고🎜🎜데이터 일관성 문제🎜🎜슬레이브 서버가 완료되고 마스터가 서비스 데이터가 동기화된 후 새 명령이 슬레이브 서버에 비동기적으로 전송됩니다. 이 과정에서 마스터-슬레이브 동기화는 이 비동기 동기화가 발생하기 전에 마스터 서버가 다운되면 데이터 불일치가 발생합니다. 일관성이 없습니다. 🎜🎜슬레이브 읽기 전용🎜🎜기본적으로 복제 모드의 마스터는 쓰기 및 읽기 작업을 모두 수행할 수 있는 반면, 슬레이브는 읽기 작업만 수행할 수 있습니다. 🎜🎜슬레이브 서버에서 config set reporter-read-only no 명령을 실행하여 슬레이브 서버에서 쓰기 모드를 활성화할 수 있지만 다음 사항에 주의해야 합니다. 🎜
  • 슬레이브 서버에서 작성된 데이터는 마스터 서버에 동기화되지 않습니다.
  • 키 값이 동일하면 마스터 서버의 데이터가 슬레이브 서버를 덮어쓸 수 있습니다. /li>
  • 데이터 동기화가 완료되는 동안 슬레이브 서버 데이터가 비워집니다.
🎜복제 명령 변경 사항🎜🎜Redis 5.0 이전에 사용된 복제 명령은 에서 <code>slaveof였습니다. Redis 5.0 이후 복사 명령이 replicaof로 변경되었습니다. 상위 버전(Redis 5+)에서는 replicaof를 사용해야 합니다. , slaveof 명령은 언제든지 삭제될 수 있기 때문입니다. 🎜

센티넬 모드

🎜마스터-슬레이브 복제 모드는 Redis의 다중 시스템 작동의 기반이지만 이는 모드 자체에 치명적인 문제가 있습니다. 마스터 노드가 충돌하면 Redis의 정상적인 사용을 복원하기 위해 수동 개입이 필요합니다. 🎜🎜수동 프로세스를 자동으로 전환하여 Redis가 자동 재해 복구(failoverfailover
)를 수행할 수 있도록 자동 도구인 Redis Sentinel(감시 모드)이 필요합니다. 코드>) 기능. 🎜🎜Sentinel은 마스터 및 슬레이브 서버에서 모니터링 작업을 수행하는 것과 같습니다. 마스터 서버가 다운된 것이 발견되면 해당 규칙이 신속하게 활성화되어 슬레이브 서버를 수동 개입 없이 마스터 서버로 업그레이드하여 더욱 안정적이고 빠르게 만듭니다. 🎜🎜Redis Sentinel의 최소 할당 단위는 마스터 1개와 슬레이브 1개입니다. 🎜🎜Redis의 마스터-슬레이브 동기화 및 센티넬 모드에 대해 이야기해 보겠습니다.🎜 blockquote>🎜Redis Sentinel 빌드🎜🎜 ./src/redis-sentinel sentinel.conf 명령을 사용하세요 code > <code>Sentinel을 시작하려면 시작 시 sentinel.conf 파일을 설정해야 합니다. 이 구성 파일에는 모니터링 마스터 노드 정보가 포함되어야 합니다. 🎜
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisSentinelPool;
import utils.Config;

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

public class SentinelExample {
    // master name
    private static String _MASTER_NAME = "mymaster";

    public static void main(String[] args) {
        // Sentinel 配置信息
        Set<String> set = new HashSet<>();
        // 连接信息 ip:port
        set.add("127.0.0.1:26379");
        // 创建 Sentinel 连接池
        JedisSentinelPool jedisSentinel = new JedisSentinelPool(_MASTER_NAME,
                set, Config.REDIS_AUTH);
        // 获取 Redis 客户端
        Jedis jedis = jedisSentinel.getResource();
        // 设置元素
        String setRes = jedis.set("key", "Hello, redis.");
        System.out.println(setRes);
        // 获取元素
        System.out.println(jedis.get("key"));
    }
}
🎜그 중: 🎜
  • master-name은 모니터링되는 마스터 노드에 이름을 지정하는 것을 의미합니다.
  • ip는 마스터 노드의 IP를 의미합니다.
  • port는 마스터 노드의 포트를 나타냅니다.
  • quorumSentinel의 수를 나타냅니다. 이는 마스터 노드가 오프라인임을 확인합니다. quorum이 1로 설정되면 하나의 Sentinel이 오프라인이라고 판단하는 한 해당 노드임을 확인할 수 있습니다. 정말 오프라인이에요.
  • 🎜마스터 노드 서버 Redis에 비밀번호가 있는 경우 sentinel.conf에는 다음이 포함되어야 합니다: 🎜rrreee🎜Sentinel 클러스터 시작🎜🎜프로덕션 환경에서는 Sentinel 하나만 시작하지 않습니다. >Sentinel code> 안타깝게도 다운되면 자동 재해 복구 서비스를 제공할 수 없게 되므로 고가용성 목적에 부합하지 않으므로 여러 Sentinel을 시작합니다. Redis 서비스의 고가용성을 보장하기 위해 다양한 물리적 시스템에 Sentinel 클러스터를 형성합니다. 🎜

    Sentinel 클러스터를 시작하는 방법은 매우 간단합니다. 위의 단일 서버를 시작하는 방법과 동일합니다. 하나의 메인에 여러 개의 Sentinel을 모니터링하면 됩니다. 서버 노드이므로 여러 Sentinel이 자동으로 서로를 발견하고 Sentinel 클러스터를 형성합니다. Sentinel 集群的方法很简单,和上面启动单台的方式一样,我们只需要把多个 Sentinel 监听到一个主服务器节点,那么多个 Sentinel 就会自动发现彼此,并组成一个 Sentinel 集群。

    Redis의 마스터-슬레이브 동기화 및 센티넬 모드에 대해 이야기해 보겠습니다.

    一般情况下 Sentinel 集群的数量取大于 1 的奇数,quorum 的参数就设置为一半加 1,例如 5 就设置为 3,7 就设置为 4。

    两个概念:主观下线和客观下线。

    Sentinel 集群中,有一个 Sentinel 认为主服务器已经下线时,它会将这个主服务器标记为主观下线(Subjectively DownSDOWN),然后询问集群中的其他 Sentinel,是否也认为该服务器已下线,当同意主服务器已下线的 Sentinel 数量达到 quorum 参数所指定的数量时,Sentinel 就会将相应的主服务器标记为客观下线(Objectively down,ODOWN),然后开始对其进行故障转移。

    主服务竞选规则

    新主节点竞选优先级设置

    redis.conf 中的 replica-priority 选项来设置竞选新主节点的优先级,它的默认值是 100,它的最大值也是 100,这个值越小它的权重就越高。

    新主节点竞选规则

    新主节点的竞选会排除不符合条件的从节点,然后再剩余的从节点按照优先级来挑选。

    存在以下条件的从节点会被排除:

    • 排除所有已经下线以及长时间没有回复心跳检测的疑似已下线从服务器;

    • 排除所有长时间没有与主服务器通信,数据状态过时的从服务器;

    • 排除所有优先级(replica-priority)为 0 的服务器。

    符合条件的从节点竞选顺序:

    • 优先级最高的从节点将会作为新主节点;

    • 优先级相等则判断复制偏移量,偏移量最大的从节点获胜;

    • 如果以上两个条件都相同,选择 Redis 运行时随机生成 ID 最小那个为新的主服务器。

    旧主节点恢复上线

    如果之前的旧主节点恢复上线,会作为从节点运行在主从服务器模式中。

    哨兵工作原理

    首先每个 Sentinel 会以每秒钟 1 次的频率,向已知的主服务器、从服务器和以及其他 Sentinel 实例,发送一个 PING 命令。

    如果最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 所配置的值(默认 30s),那么这个实例会被 Sentinel 标记为主观下线。

    如果一个主服务器被标记为主观下线,那么正在监视这个主服务器的所有 Sentinel 节点,要以每秒 1 次的频率确认主服务器的确进入了主观下线状态。

    如果有足够数量(quorum 配置值)的 Sentinel 在指定的时间范围内同意这一判断,那么这个主服务器被标记为客观下线。此时所有的 Sentinel 会按照规则协商自动选出新的主节点。

    注意:一个有效的 PING 回复可以是:+PONG、-LOADING 或者 -MASTERDOWN。如果返回值非以上三种回复,或者在指定时间内没有回复 PING 命令, 那么 Sentinel 认为服务器返回的回复无效(non-valid)。

    Sentinel 命令操作

    Sentinel 可以监视多台主节点,而不是只能监视一台服务器。想要监视多台主节点只需要在配置文件中设置多个 sentinel monitor master-name ip port quorum 即可,我们通过 master-name 来区分不同的主节点。

    查询所有被监控的主服务器信息

    sentinel masters

    查询某个主节点的信息

    sentinel master master-name

    查看某个主节点的 IP 和端口

    sentinel get-master-addr-by-name master-name

    查询从节点的信息

    sentinel replicas mymastersentinel slaves master-name

    查询 Sentinel 集群中的其他 Sentinel 信息

    sentinel sentinels master-name

    Redis의 마스터-슬레이브 동기화 및 센티넬 모드에 대해 이야기해 보겠습니다.🎜🎜일반 이 경우 Sentinel 클러스터의 개수는 1보다 큰 홀수이고 quorum의 매개변수는 half + 1로 설정됩니다. 예를 들어 5는 3, 7은 4로 설정됩니다. 🎜🎜두 가지 개념: 주관적 오프라인과 객관적 오프라인. 🎜🎜 Sentinel 클러스터의 Sentinel이 메인 서버가 오프라인 상태라고 생각하면 메인 서버를 주관적으로 오프라인으로 표시합니다(주관적으로 다운) >, SDOWN), 그리고 클러스터에 있는 다른 Sentinel에게 서버가 오프라인이라고 생각하는지 물어보세요. Sentinel이 주 서버가 오프라인이라고 동의하면요. 오프라인, 숫자가 quorum 매개변수에 지정된 숫자에 도달하면 Sentinel은 해당 기본 서버를 객관적으로 오프라인(객관적으로 다운, ODOWN)으로 표시합니다. ) 장애 조치를 시작합니다. 🎜🎜<strong><span style="max-width:90%">마스터 서비스 선택 규칙</span></strong>🎜🎜<strong>새로운 마스터 노드 선택 우선순위 설정</strong>🎜🎜<code the>redis.confreplica-priority 옵션은 새 마스터 노드의 우선순위를 설정하는 데 사용되며 기본값은 100이며 최대값도 100입니다. 값이 작을수록 , 우선순위가 높을수록 가중치가 높아집니다. 🎜🎜새로운 마스터 노드 선출 규칙🎜🎜새로운 마스터 노드 선출에서는 조건에 맞지 않는 슬레이브 노드를 제외하고 나머지 슬레이브 노드를 우선순위에 따라 선정합니다. 🎜🎜다음 조건의 슬레이브 노드는 제외됩니다. 🎜
    • 🎜오프라인 상태이고 오랫동안 하트비트 감지에 응답하지 않은 모든 슬레이브 노드를 제외합니다. 🎜
    • 🎜오랜 시간 동안 마스터 서버와 통신하지 않았으며 데이터 상태가 오래된 모든 슬레이브 서버를 제외합니다. 🎜
    • 🎜모든 우선 순위를 제외합니다. 복제본 우선순위 code>)는 0입니다. 🎜
    🎜적격 슬레이브 노드 선택 순서: 🎜
    • 🎜우선순위가 가장 높은 슬레이브 노드가 새 마스터 노드가 됩니다. 🎜
    • 🎜우선순위가 동일하면 복제 오프셋이 결정되며 가장 큰 오프셋을 가진 슬레이브 노드가 승리합니다.🎜
    • 🎜위 두 조건이 동일할 경우 , Redis를 선택하면 새 마스터 서버로 실행될 때 가장 작은 ID를 가진 것을 무작위로 생성합니다. 🎜
    🎜이전 마스터 노드가 다시 온라인 상태가 됩니다.🎜🎜이전 마스터 노드가 다시 온라인 상태가 되면 마스터-슬레이브 서버 모드에서 슬레이브 노드로 실행됩니다. . 🎜🎜Sentinel 작동 방식🎜🎜우선 각 Sentinel은 초당 한 번씩 실행됩니다. , 알려진 마스터 서버, 슬레이브 서버 및 기타 Sentinel 인스턴스에 PING 명령을 보냅니다. 🎜🎜PING 명령에 대한 마지막 유효한 응답이 down-after-milliseconds(기본값 30초)로 구성된 값을 초과하는 경우 이 인스턴스는 Sentinel는 주관적인 오프라인을 표시합니다. 🎜🎜메인 서버가 주관적으로 오프라인으로 표시된 경우, 메인 서버를 모니터링하는 모든 <code>Sentinel 노드는 메인 서버가 실제로 주관적인 오프라인 상태에 진입했는지 초당 1회의 빈도로 확인해야 합니다. . 🎜🎜지정된 시간 범위 내에서 충분한 수의 Sentinel이 이 판단에 동의하는 경우 마스터 서버는 객관적으로 오프라인으로 표시됩니다. 이때 모든 Sentinel은 규칙 협상에 따라 자동으로 새로운 마스터 노드를 선택합니다. 🎜🎜참고: 유효한 PING 응답은 +PONG, -LOADING 또는 -MASTERDOWN일 수 있습니다. 반환 값이 위의 세 가지 응답이 아니거나 지정된 시간 내에 PING 명령에 대한 응답이 없으면 Sentinel은 서버에서 반환된 응답을 다음으로 간주합니다. 유효하지 않습니다(유효하지 않은 코드>). 🎜🎜Sentinel 명령 작동🎜🎜Sentinel은 하나의 서버가 아닌 여러 마스터 노드를 모니터링할 수 있습니다 . 여러 마스터 노드를 모니터링하려면 구성 파일에서 여러 sentinel monitor master-name ip port quorum을 설정하기만 하면 됩니다. master-name을 사용하여 서로 다른 노드를 구별합니다. 것.마스터 노드. 🎜🎜모니터링되는 모든 마스터 서버의 정보 조회🎜🎜센티넬 마스터🎜🎜특정 마스터 노드의 정보 조회🎜🎜 sentinel master master-name🎜🎜마스터 노드의 IP 및 포트 보기🎜🎜sentinel get-master-addr-by-name master-name🎜 🎜 슬레이브 노드 정보 쿼리🎜🎜sentinel 복제본 mymaster 또는 sentinel 슬레이브 마스터 이름🎜🎜Sentinel 클러스터의 다른 Sentinel 정보 쿼리 🎜🎜sentinel sentinels 마스터 이름🎜

    检查可用 Sentinel 的数量

    sentinel ckquorum master-name

    强制故障转移

    sentinel failover master-name

    在线修改配置信息

    Redis 2.8.4 之前如果需要修改 Sentinel 的配置文件,需要重启 Sentinel

    Redis 2.8.4 之后,我们可以在线修改配置文件了。

    增加监视主节点

    sentinel monitor mymaster IP Port Quorum 命令。

    移除主节点的监视

    使用 sentinel remove master-name 命令。

    修改 quorum 参数

    使用 sentinel set master-name quorum n 命令。

    quorum 参数用来表示确认主节点下线的 Sentinel 数量,如果 quorum 设置为 1 表示只要有一台 Sentinel 确认主观下线后,这个主节点就客观(真正地)下线了。

    以上所有对配置文件的修改,都会自动被刷新到物理配置文件 sentinel.conf

    代码实战

    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisSentinelPool;
    import utils.Config;
    
    import java.util.HashSet;
    import java.util.Set;
    
    public class SentinelExample {
        // master name
        private static String _MASTER_NAME = "mymaster";
    
        public static void main(String[] args) {
            // Sentinel 配置信息
            Set<String> set = new HashSet<>();
            // 连接信息 ip:port
            set.add("127.0.0.1:26379");
            // 创建 Sentinel 连接池
            JedisSentinelPool jedisSentinel = new JedisSentinelPool(_MASTER_NAME,
                    set, Config.REDIS_AUTH);
            // 获取 Redis 客户端
            Jedis jedis = jedisSentinel.getResource();
            // 设置元素
            String setRes = jedis.set("key", "Hello, redis.");
            System.out.println(setRes);
            // 获取元素
            System.out.println(jedis.get("key"));
        }
    }

    更多编程相关知识,请访问:编程入门!!

    위 내용은 Redis의 마스터-슬레이브 동기화 및 센티넬 모드에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제