인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..

咔咔
풀어 주다: 2020-08-28 17:31:30
원래의
1894명이 탐색했습니다.

Sentinel은 주로 자동 복구가 불가능한 단일 노드 장애에 대한 솔루션을 목표로 합니다. 클러스터는 주로 단일 노드 용량, 동시성 문제 및 선형 확장성에 대한 솔루션을 목표로 합니다. 기사 말미에 원하는 내용이 있습니다!

Foreword

카카가 작성하고 인터뷰 가이드도 작성했습니다. 이 로드맵에 따른 기사에는 아직 추가되지 않은 몇 가지 지식 포인트가 있으며 댓글 섹션에서 뵙기를 기대합니다.

인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..
여기에 그림 설명 삽입

이 글에서는 주로 다음과 같은 측면에서 클러스터를 소개합니다

  • 클러스터 소개
  • 클러스터의 역할
  • 클러스터 구성
  • 수동 및 자동 장애 조치
  • 장애 조치 원칙

이 문서의 구현 환경

  • centos 7.3
  • re dis 4.0
  • redis 작업 디렉터리 /usr /local/redis
  • 모든 작업은 가상 머신 시뮬레이션에서 수행됩니다

1. 클러스터 소개

클러스터는 단일 머신 메모리 제한 및 동시성을 해결하기 위한 것입니다. 마스터-슬레이브 복제에 문제가 있는 경우, 현재 클라우드 서비스 메모리는 256GB입니다. 이 메모리에 도달하면 동시에 데이터 볼륨이 이 지점에 도달하면 Redis는 더 이상 서비스를 제공할 수 없습니다. 기록된 데이터는 매우 커서 버퍼 오버플로가 쉽게 발생하고 노드에서 무제한 전체 복사가 발생할 수 있습니다.

.
인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..
여기에 그림 설명 삽입

그런 다음 단일 머신의 마스터-슬레이브를 다대다 모드로 변경해야 하며 모든 마스터 노드가 함께 연결되어 서로 통신합니다. 이 방법은 단일 시스템의 메모리를 공유할 수 있을 뿐만 아니라 요청을 분산하고 시스템 가용성을 향상시킬 수 있습니다.

그림과 같이: 쓰기 요청이 많을 경우 더 이상 단일 마스터 노드에 명령이 전송되지 않지만, 메모리를 공유하고 많은 수를 피하기 위해 명령이 다양한 마스터 노드에 배포됩니다. 요청의.

그럼 명령어는 어떻게 분류되고 저장되나요? 클러스터 저장소 구조에 대해 자세히 알아봐야 합니다. 인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..

2. 클러스터 기능

  • 단일 머신의 저장 용량을 분산시켜 쉽게 확장할 수 있습니다.
  • 단일 머신의 액세스 요청 전환
  • 시스템 가용성 향상

시스템 가용성 향상 문장을 이해하는 방법 master1이 다운되면 시스템에 미치는 영향을 살펴보겠습니다. 일반 서비스는 아직 제공되지 않습니다.

이때, master1이 다운되면 클러스터는 어떻게 작동하는지 묻는 사람이 있을 것입니다. 이 질문은 아래 장애 조치에서 답변해 드립니다. 이 문제는 원칙 장에서 자세히 설명하겠습니다인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..

3. 클러스터 저장소 구조

1. 저장소 구조

단일 머신 저장소는 사용자가 요청을 시작할 때 키를 자체 메모리에 직접 저장하는 것입니다. 인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..클러스터의 저장 구조는 그리 간단하지 않습니다. 첫째, 사용자가 키 명령을 시작할 때 수행해야 할 작업입니다.

  • 값은 CRC16(키)을 통해 계산됩니다.
  • 이 값을 모듈로 16384로 사용하면 값을 얻게 됩니다. 먼저 28
  • 이 값 28이 공간 위치입니다. 키가 저장되었습니다

이제 이 키를 어느 Redis 저장 공간에 저장해야 할까요?라는 질문이 생깁니다. 인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..

사실 Redis는 클러스터가 시작된 후 이미 저장 공간을 분할했습니다16384 복사본, 각 호스트는 부분을 저장합니다. 16384份,每台主机保存一部分。

这里需要注意的是我给每个redis存储空间里边的编号就相当于一个小的存储空间(专业术语“哈希槽”

여기서 주목해야 할 점은 제가 각 redis 저장 공간에 부여한 숫자가 작은 저장 공간과 동일하다는 것입니다(전문 용어인 "해시 슬롯")은 건물 내부의 숫자로 이해하실 수 있으며, 건물은 전체 저장 공간을 의미합니다. redis. 각 주택의 수는 저장 공간에 해당합니다. 이 저장 공간에는 해당 키를 저장하는 특정 영역이 있으며 이는 위 사진의 모델을 촬영한 후의 위치가 아닙니다.

화살표로 표시된 28은 이 지역에 28이 저장된다는 의미입니다. 이 집에는 29, 30, 31 등이 저장될 수 있습니다. 🎜

인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..이제 질문이 생깁니다. 기계를 추가하거나 제거하면 어떻게 해야 할까요? 말하려면 그림을 보고, 설명하기 위해 그림을 사용할 수 있다면 단어를 사용하지 마십시오.

새 머신을 추가한 후 다른 세 개의 저장 공간에서 특정 슬롯이 새 머신에 할당됩니다. 여기에서 새 머신에 넣을 슬롯 수를 설정할 수 있습니다.

마찬가지로, 머신을 축소한 후에는 제거된 슬롯이 다른 기존 머신에 다시 할당됩니다. 새 노드를 추가하는 것과 마찬가지로 노드 수신 슬롯을 지정할 수 있습니다.

노드를 추가하거나 제거하는 것은 슬롯이 저장되는 위치를 변경하는 것입니다. 인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..클러스터의 스토리지 구조를 이해한 후에는 또 다른 질문인 클러스터의 내부 통신을 어떻게 설계해야 하는지 설명해야 합니다! 값이 나오고, 키가 얻어지며, 데이터를 어디서 얻을 수 있는지, 아래에서 이 질문을 살펴보겠습니다.

2. 통신 설계

클러스터의 각 노드는 특정 기간에 다른 노드에 핑 메시지를 보내고, 다른 노드는 응답으로 퐁을 반환합니다. 일정 시간이 지나면 모든 노드는 클러스터에 있는 모든 노드의 슬롯 정보를 알게 됩니다.

아래 그림과 같이 노드가 3개라면 16384 해시 슬롯은 3개 부분으로 나누어집니다.

각각 0-5500, 5501-11000, 11001-16384입니다.

사용자가 키 요청을 시작하면 클러스터는 요청을 어떻게 처리합니까?

아래 사진의 검은색 박스는 클러스터 내 모든 노드의 슬롯 정보를 나타내며, 그 안에는 이외에도 많은 정보가 담겨 있습니다. 인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..

그림과 같이 사용자가 키를 요청하면 redis는 키를 받은 후 키의 슬롯 위치를 계산하고 슬롯 위치를 기준으로 해당 노드를 찾습니다.

접속된 슬롯이 노드 자체에 있는 경우 그러면 키에 해당하는 데이터가 직접 반환됩니다.

그렇지 않으면 이동 리디렉션 오류가 응답되고 올바른 노드가 클라이언트에 반환됩니다.

그런 다음 키 명령을 다시 보냅니다

인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..
여기에 그림 설명 삽입

4. 클러스터 구성

1. 구성 파일 수정

인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..결제만 하세요 주의 서클 안의 구성 정보를 클릭하세요

  • cluster-enabled yes: 클러스터 모드 켜기
  • cluster-config-file node-6379.conf: 클러스터 구성 파일
  • clustre-node-timeout 10000: 노드 시간 초과, 테스트 편의를 위해 여기에 표시 , 10초로 설정되어 있습니다
인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..
여기에 그림 설명 삽입

2. 6개 노드의 구성 파일을 빌드하고 모두 시작하세요

Kaka는 쉽게 명령을 제공합니다. sed 's/6379/6380 /g' 6379-redis.conf > 6380-redis.confsed 's/6379/6380/g' 6379-redis.conf > 6380-redis.conf

按照这样的方式创建出来6个不同端口的配置文件

인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..随便打开一个配置文件查看,检测是否替换成功인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..为了查看日志信息方便,全部使用前台启动。并且查看服务是否都正常启动,执行命令ps -ef | grep redis

이런 방식으로 6개의 서로 다른 포트에 대한 구성 파일을 생성하세요

인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..여기에 이미지 설명 삽입구성 파일을 열어 교체가 성공했는지 확인하세요여기에 그림 설명 삽입로그 정보를 보려면 모두 사용하세요. 프런트 데스크를 시작합니다. 그리고 서비스가 정상적으로 시작되었는지 확인하려면 ps -ef | grep redis

🎜시작 후 추가 클러스터 로고가 있는 것을 볼 수 있는데 이는 모두 클러스터의 노드임을 의미합니다. 🎜모든 노드가 시작되었습니다. 클러스터 시작 지침은 Ruby를 기반으로 해야 합니다(Kaka는 redis 버전 4.0을 사용합니다). 함께 설치해 볼까요🎜

3. 安装ruby

执行命令<code style="overflow-wrap: break-word; margin: 0px 2px; font-family: " operator mono consolas monaco menlo monospace word-break: break-all color: rgb background: rgba padding: border-radius: height: line-height:>wget https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.1.tar.gz

解压:tar -xvzf ruby-2.7.1.tar.gz 根据自己下载的版本来解压

安装:./configure | make | make install这三个指令一气呵成。

查看ruby和gem版本:ruby -v

解压:tar -xvzf ruby-2.7.1.tar.gz 根据自己下载的版本来解压🎜🎜安装:这三个指令一气呵成。🎜🎜查看rubyhwagem版本:<code style="overflow-wrap: break-word; margin: 0px 2px;font-family: " operator mono consolas monaco menlo rgba>ruby -v🎜
인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..
여기에 그림 설명 삽입

4. 클러스터 시작

클러스터 실행 명령은 /usr/local/redis/src/redis-trib.rb/usr/local/redis/src/redis-trib.rb

注意如果需要直接使用redis-trib.rb命令,需要ln到bin目录下,否则就必须使用./redis-trib.rb的方式。

如果按照步骤走,这里会出现一个错误인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..执行gem install redis很不幸的是在这里也会出现错误。인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..随后需要安装yum install zlib-develyum install openssl-devel

./redis -trib.rb 방식. 🎜🎜단계를 따르면 여기에 오류가 나타납니다여기에 이미지 설명 삽입실행gem install redis안타깝게도 여기서도 오류가 발생합니다. 여기에 이미지 설명 삽입나중에 설치해야 합니다yum install zlib-develyum install openssl-devel🎜

安装完成后,여기/ruby-2.7 .1/ext/openssl/ruby-2.7.1/ext/zlib  分别执行ruby extconf.rb并且执行make | make install/ruby-2.7.1/ext/openssl/ruby-2.7.1/ext/zlib  分别执行ruby extconf.rb并且执行make | make install

然后在执行gem install redis就OK인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..这时在回头来执行./redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..「信息解读」

创建集群,并且给6个节点分配哈希槽,后三个节点配置为前三个节点的从节点인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..显示每个节点的哈希槽信息和节点ID,最后一步需要输入yes인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..然后在执行gem install redis就OK인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..这时在回头来执行./redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..「信息解读」인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..创建集群,并且给6个节点分配哈希槽,后三个节点配置为前三个节点的从节点인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..显示每个节点的哈希槽信息和节点ID,最后一步需要输入

来到data目录下查看配置文件的变化.点的运行日志」🎜🎜

여기에 제공된 주요 정보는 클러스터 상태 변경됨: ok 클러스터 상태는 정상입니다인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..

5. 클러스터 설정 및 데이터 수집

데이터를 직접 설정하면 오류가 보고되고 슬롯 네임키 변환 후 위치는 5798 이고, IP ​​주소와 포트번호가 부여됩니다. 인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..명령을 사용해야 합니다redis-cli -c

값을 설정할 때 5798 슬롯으로 리디렉션하라는 메시지가 표시됩니다.인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..다음 단계는 데이터를 얻는 것이고, 노드는 자동으로 전환됩니다. 인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..

5. 장애 조치 over 1. 클러스터 슬레이브 노드는 위의 클러스터 시작 정보로 오프라인으로 이동합니다. 포트 6383은 6379의 슬레이브 노드라는 것을 알고 있습니다. 다음 단계는 6383을 오프라인으로 전환하여 6379의 로그 정보를 보는 것입니다.

6379는 연결 6383이 끊어졌음을 보고하고 실패로 표시하여 사용할 수 없음을 나타냅니다. 현재 클러스터는 여전히 정상적으로 작동하고 있습니다.

「요약: 오프라인 슬레이브 노드는 클러스터에 영향을 미치지 않습니다」인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..포트 6383이 온라인이 되면 모든 노드가 실패 표시를 지웁니다인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..

2. 클러스터 마스터 노드가 오프라인이 됩니다

마스터 노드 6379를 수동으로 오프라인시키고 슬레이브 노드 6383의 로그 정보를 확인한다. 이때, 6383 노드는 총 10번 동안 6379에 계속 접속하게 된다. 그렇다면 왜 10번인가! 이는 우리가 구성한 매개변수를 기반으로 합니다으로 결정됩니다. 다음은 우리에게 보내는 메시지입니다. 시간이 만료될 때까지 1초에 한 번씩 연결하고 장애 조치를 시작하세요.

이때, 6383은 Failover 선거에 성공했고, 슬레이브는 뒤집어서 마스터 노드가 되었습니다. 여기에 이미지 설명 삽입이때 클러스터의 노드 정보를 확인하려면 클러스터 노드 cluster-node-timeout 10来决定的,这里给我们一个信息就是一秒连接一次

直到时间到期后,开始故障转移。

这时6383在故障转移选举中胜任,翻身奴隶把歌唱,成为了主节点。인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..此时在查看一下集群的节点信息,命令cluster nodes

여기에는 4개의 마스터 노드가 있지만 마스터 노드 중 하나는 오프라인 상태입니다.

인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다.."6379 원래 마스터 노드가 온라인 상태가 됩니다."

6379가 온라인 상태가 되면 모든 노드도 실패 정보를 지웁니다.

그리고 이때 6379는 6383의 슬레이브 노드로 변경됩니다. 인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..

3. 새 마스터 노드를 추가합니다

새 두 포트 6385 및 6386에서 새 명령을 실행합니다인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다.../redis-trib.rb add-node 127.0.0.1:6385 127.0.0.1:6379, 여기에 전송되는 내용 is Meet message./redis-trib.rb add-node 127.0.0.1:6385 127.0.0.1:6379,这里发送的就是meet消息

执行add-node命令,第一个参数为新节点的ip+端口   第二个参数为已存在集群中的节点。根据下图我们就可以看到新增的节点已经存在集群中了。

「注意:虽说6385已经成为集群中的节点了,但是跟其它节点有区别。它没有数据,也就是没有哈希槽」인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..接下来我们就需要把集群中的某些哈希槽分配到这个新节点上,分配结束后这个节点才会成为真正意义上的主节点

执行命令./redis-trib.rb reshard 127.0.0.1:6385

会提示转移多少个哈希槽并填写接收节点的id

最后一步询问是否从所有节点中转移:咔咔使用的是all

add-node 명령을 실행합니다. 첫 번째 매개변수는 새 노드의 ip+port이고 두 번째 매개변수는 클러스터에 이미 존재하는 노드입니다. 아래 그림을 보면 새로 추가된 노드가 클러스터에 이미 존재하는 것을 확인할 수 있습니다. 🎜🎜"참고: 6385는 클러스터의 노드가 되었지만 다른 노드와 다릅니다. 데이터가 없습니다. 즉, 해시가 없습니다. 슬롯 》여기에 이미지 설명 삽입다음으로 이 새 노드에 클러스터의 일부 해시 슬롯을 할당해야 합니다. , 이 노드가 실제 마스터 노드가 됩니다🎜🎜./redis-trib.rb reshard 127.0.0.1:6385🎜🎜는 전송할 해시 슬롯 수를 묻는 메시지를 표시하고 수신 노드의 id🎜🎜 마지막 단계에서는 모든 노드에서 전송할지 여부를 묻습니다. 코드 스타일="overflow-wrap: break-word; 여백: 0px 2px; 글꼴 계열: "Operator Mono", Consolas, Monaco, Menlo, monospace; word-break: break-all; 색상: rgb(53 , 148, 247); 배경: rgba(59, 170, 250, 0.1); 테두리 반경: 2px;">모두🎜

사용 지침: 클러스터 노드 노드 6385에는 이미 세 가지 범위의 해시 슬롯이 있습니다.여기에 이미지 설명 삽입cluster nodes查看,6385的这个节点就已经拥有三个范围的哈希槽了인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..

「主节点已经新增好了,接下来就需要给6385这个主节点配置一个从节点6386」

命令:./redis-trib.rb add-node --slave --master-id dcc0ec4d0c932ac5c35ae76af4f9c5d27a422d9f 127.0.0.1:6386 127.0.0.1:6385

master-id是6385的id,第一个参数为新节点的ip+端口    第二个为指定的主节点ip+端口인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..

4. 手动故障迁移

当想对集群中的主节点进行升级的话可以手动执行故障转移到从节点,避免集群可用性受影响。

在从节点执行命令:cluster failover

"메인 노드가 추가되었습니다. 마스터 노드 6385에 대해 슬레이브 노드 6386을 구성하려면"

Command: ./redis-trib.rb add-node --slave --master-id dcc0ec4d0c932ac5c35ae76af4f9c5d27a422d9f 127.0.0.1:6386 127.0.0.1:6385

master- ID는 다음의 ID입니다. 6385. 첫 번째 매개변수는 새 노드의 IP+포트입니다. 두 번째 매개변수는 지정된 마스터 노드의 IP+포트입니다.

4. 수동 장애 조치

클러스터하려는 경우 마스터 노드를 업그레이드하는 경우 클러스터 가용성에 영향을 주지 않도록 슬레이브 노드에 대한 장애 조치를 수동으로 수행할 수 있습니다. 🎜🎜슬레이브 노드에서 명령을 실행합니다: 🎜🎜🎜「실행 프로세스」🎜🎜🎜노드 정보를 보면 6386번 노드가 호스트 포인트가 된 것을 확인할 수 있습니다. 🎜🎜클러스터 장애 조치 명령이 슬레이브 노드로 전송되면 슬레이브 노드는 CLUSTERMSG_TYPE_MFSTART 패킷을 마스터 노드로 보냅니다. 슬레이브 노드는 마스터 노드에 액세스 중지를 요청하여 두 노드의 데이터 오프셋이 일관되도록 합니다. 🎜<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">이때, 클라이언트는 우리가 제거한 마스터 노드에 연결하지 않을 것입니다. 동시에 마스터 노드는 슬레이브 노드로 복제 오프셋을 전송하고, 슬레이브 노드가 복제 오프셋을 얻은 후 장애 조치(failover)를 시작합니다. 클라이언트가 이전 마스터를 잠금 해제하고 새 마스터 노드에 다시 연결하는 경우 마스터 노드가 구성 전환을 수행합니다. <img src="https://img-blog.csdnimg.cn/20200610003331891.png" alt="인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다.." style="max-width:90%"></p> <h1 data-tool="mdnice编辑器" style="margin-top: 30px; margin-bottom: 15px; padding: 0px; color: black; font-size: 25px;"> <span class="prefix" style="color: rgb(64, 184, 250); display: none;"></span><span class="content" style="display: inline-block; color: rgb(64, 184, 250);"> 6. Failover 원칙 </span><span class="suffix" style="display: inline-block; color: rgb(64, 184, 250);"></span> </h1> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">위에서 마스터 노드가 오프라인 상태가 된 후 슬레이브 노드가 마스터 노드가 되는 과정을 테스트했습니다. </p> <h2 data-tool="mdnice编辑器" style="margin-top: 30px; margin-bottom: 15px; padding: 0px; color: black; font-size: 22px; border-bottom: 4px solid rgb(64, 184, 250);"> <span class="prefix" style="display: flex; width: 20px; height: 20px; background-size: 20px 20px; background-image: url(https://my-wechat.mdnice.com/fullstack-1.png); margin-bottom: -22px;"></span><span class="content" style="display: flex; color: #40B8FA; font-size: 20px; margin-left: 25px;">1. 결함 발견부터 확인까지 </span><span class="suffix" style="display: flex; box-sizing: border-box; width: 200px; height: 10px; border-top-left-radius: 20px; background: RGBA(64, 184, 250, .5); color: rgb(255, 255, 255); font-size: 16px; letter-spacing: 0.544px; justify-content: flex-end; float: right; margin-top: -10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></span> </h2> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">클러스터의 각 노드는 정기적으로 다른 노드에 핑 메시지를 보내고 수신자는 퐁으로 응답합니다. </p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">클러스터 노드 제한 시간 내에 ping 메시지가 계속 실패하면 수신 노드는 주관적으로 오프라인인 pfail 상태로 표시됩니다. </p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">이 오프라인 상태가 매우 익숙합니까? 네, 이는 파수꾼이 마스터 노드의 이상 여부를 판단하는 것과 다소 유사합니다. Sentinel은 마스터 노드에서 문제를 감지하면 마스터 노드를 객관적으로 오프라인(s_down)으로 표시합니다. 갑자기 주제넘었다는 걸 깨달아 당황스럽네요...</p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;"><img src="https://img-blog.csdnimg.cn/20200611115937845.png" alt="인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다.." style="max-width:90%"> 센티넬에 대해 언급하자면, 센티넬이 마스터노드가 이상하다고 생각하면 주관적으로 오프라인으로 표시되는데, 다른 센티넬이 어떻게 동의할 수 없나요? 당신이 말하는 것을 말하십시오. 그들은 모두 비정상적인 마스터 노드에 연결을 시도할 것이며, 절반 이상의 센티널이 마스터 노드가 비정상이라고 판단하면 객관적으로 마스터 노드를 직접 오프라인 상태로 만들 것입니다. </p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">마찬가지로 클러스터는 단순히 노드 때문에 오프라인 상태라고 판단하지 않습니다. 클러스터 내의 노드는 지속적으로 결함이 있는 노드의 오프라인 피드백을 수집하여 로컬에 저장합니다. 결함이 있는 노드 오프라인 보고서. 클러스터 마스터 노드의 절반 이상이 주관적으로 오프라인으로 표시되면 상태가 객관적으로 오프라인으로 변경됩니다. </p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">마지막으로 실패 메시지가 클러스터에 브로드캐스트되어 모든 노드에 실패한 노드를 객관적으로 오프라인으로 표시하도록 알립니다. </p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">예: 노드 A는 노드 B에 핑을 보낸 후 통신 이상 후 노드 B를 실패로 표시합니다. 이후 노드 A는 계속해서 노드 C에 핑을 보내고 노드 B의 실패 정보를 전달합니다. 그런 다음 노드 C는 저장합니다. 오프라인 보고서의 노드 B에 결함이 있습니다. 오프라인 보고서 수가 해시 슬롯이 있는 마스터 노드 수의 절반보다 크면 객관적으로 오프라인 상태가 되도록 시도합니다. </p> <h2 data-tool="mdnice编辑器" style="margin-top: 30px; margin-bottom: 15px; padding: 0px; color: black; font-size: 22px; border-bottom: 4px solid rgb(64, 184, 250);"> <span class="prefix" style="display: flex; width: 20px; height: 20px; background-size: 20px 20px; background-image: url(https://my-wechat.mdnice.com/fullstack-1.png); margin-bottom: -22px;"></span><span class="content" style="display: flex; color: #40B8FA; font-size: 20px; margin-left: 25px;">2. 결함 복구(이제부터 슬레이브 노드가 뒤집어지고 슬레이브가 노래합니다) </span><span class="suffix" style="display: flex; box-sizing: border-box; width: 200px; height: 10px; border-top-left-radius: 20px; background: RGBA(64, 184, 250, .5); color: rgb(255, 255, 255); font-size: 16px; letter-spacing: 0.544px; justify-content: flex-end; float: right; margin-top: -10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></span> </h2> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;"> 결함 노드가 객관적으로 오프라인으로 정의되면 결함 노드의 모든 슬레이브 노드가 책임을 집니다. 결함 복구. </p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">오류 복구는 슬레이브 노드가 예정된 작업을 통해 호스트 포인트가 객관적으로 오프라인임을 발견한 후 실행되는 오류 복구 프로세스입니다. </p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;"><strong style="color: rgb(53, 148, 247);"> 『1. 자격 확인』</strong></p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">모든 슬레이브 노드는 마스터 노드와의 마지막 연결 시간을 확인합니다. 연결 해제 시간이 Cluster-node-time*cluster-slave-validity-factor보다 길면 없습니다. 장애 조치. </p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;"><strong style="color: rgb(53, 148, 247);"> 『2. 선거 준비 시간』</strong></p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">먼저 선거 준비 시간이 있는 이유에 대해 이야기해 보겠습니다. </p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">자격 확인 후 여러 개의 슬레이브 노드가 있는 경우 우선 순위를 지원하기 위해 서로 다른 지연 선택 시간을 사용해야 합니다. 여기서 우선순위는 복제 오프셋을 기준으로 오프셋이 클수록 장애가 발생한 마스터 노드 사이의 지연 시간이 줄어들고 마스터 노드를 교체할 확률이 높아집니다. </p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">주된 기능은 최고의 데이터 일관성을 가진 노드가 먼저 선거를 시작하도록 하는 것입니다.</p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;"><strong style="color: rgb(53, 148, 247);">「3. 선거 투표」</strong></p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">redis 클러스터의 투표 메커니즘은 리더십 선거에 슬레이브 노드를 사용하지 않습니다. 이것을 보초와 혼동합니다. 클러스터의 투표 메커니즘은 슬롯을 보유한 호스트 포인트를 기반으로 합니다. </p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">실패한 노드의 슬레이브 노드는 투표를 요청하기 위해 슬롯을 보유하고 있는 모든 마스터 노드에 FAILOVER_AUTH_REQUEST 패킷을 브로드캐스트합니다. </p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">마스터 노드가 FAILOVER_AUTH_ACK로 투표에 응답하면 NODE_TIMEOUT * 2 기간 동안 다른 슬레이브 노드에 투표할 수 없습니다</p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">슬레이브 노드가 절반 이상의 표를 얻은 후 장애 복구 단계로 진행됩니다</p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;"><strong style="color: rgb(53, 148, 247);"> 『4. Failover』</strong></p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">성공적으로 선출된 슬레이브 노드는 복제를 취소하고 마스터 노드가 됩니다</p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">슬레이브 노드를 삭제합니다. 실패한 노드를 교체하고 실패한 노드를 교체합니다. 노드의 슬롯은 자신에게 맡겨집니다. </p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;"> 자신의 퐁 메시지를 클러스터에 브로드캐스팅하여 호스트에 포인트 변경을 알리고 실패한 노드의 슬롯 정보를 인수합니다. </p> <h1 data-tool="mdnice编辑器" style="margin-top: 30px; margin-bottom: 15px; padding: 0px; color: black; font-size: 25px;"> <span class="prefix" style="color: rgb(64, 184, 250); display: none;"></span><span class="content" style="display: inline-block; color: rgb(64, 184, 250);">당신이 원하는 SSH 배경! ! ! </span><span class="suffix" style="display: inline-block; color: rgb(64, 184, 250);"></span> </h1> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">완성하는 데 이틀이 걸린 redis sentinel 기사를 작성했는데, 기사 자체에 초점이 없는 것으로 나타났습니다. 아! 편집자 마음이 아프다</p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">모두의 요구에 부응하기 위해 카카는 마지못해 밝고 눈부신 배경을 설정하는 방법에 대해 이야기한다. <img src="https://img-blog.csdnimg.cn/20200606143348504.png" alt="인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다.." style="max-width:90%">카카가 사용하는 도구는 xsheel입니다<img src="https://img-blog.csdnimg.cn/20200606144258982.png" alt="인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다.." style="max-width:90%">도구 선택 옵션을 열어주세요<img src="https://img-blog.csdnimg.cn/20200606144431679.png" alt="인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다.." style="max-width:90%">그러면 투명한 창이 보이면 xsheel 투명도를 설정할 수 있습니다. <img src="https://img-blog.csdnimg.cn/20200606144516640.png" alt="인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다.." style="max-width:90%"> 그렇죠! 맞습니다. 이것이 데스크탑 배경입니다. 설정을 시작할 준비가 되셨습니까? 설정하고 글을 읽어보신 후 다시 오시면 어떨까요? Kaka는 또한 기술적 포인트를 제공하고 오류를 수정하기 위해 각계각층의 전문가가 필요합니다. </p> <blockquote data-tool="mdnice编辑器" style="font-size: 0.9em; overflow: auto; padding-top: 10px; padding-bottom: 10px; padding-right: 10px; margin-bottom: 20px; margin-top: 20px; text-size-adjust: 100%; line-height: 1.55em; border-radius: 6px; color: rgb(89, 89, 89); box-sizing: inherit; border-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-color: rgba(64, 184, 250, 0.4); border-image: initial; background: rgba(64, 184, 250, 0.1);"> <span style="color: RGBA(64, 184, 250, .5); font-size: 34px; line-height: 1; font-weight: 700;">❝</span><p style="padding-top: 8px; padding-bottom: 8px; font-size: 14px; word-spacing: 2px; margin-top: 0px; margin-bottom: 0px; line-height: 26px;">배움에 대한 끈기, 블로깅에 대한 끈기, 공유에 대한 끈기는 카카가 경력 이후부터 지켜온 신념입니다. 거대한 인터넷에 올라온 카카의 글이 여러분에게 조금이나마 도움이 되기를 바랍니다. 다음 호에는 당신이 있습니다.</p> <span style="float: right; color: RGBA(64, 184, 250, .5);">❞ </span> </blockquote>

추천: "redis 튜토리얼"

위 내용은 인터뷰에서 Redis 클러스터에 대해 질문을 받았는데 고문을 당해 죽었습니다..의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿