❝많은 친구들이 이미 마스터-슬레이브 복제를 구성했지만 Redis 마스터-슬레이브 복제의 워크플로와 일반적인 문제에 대한 심층적인 이해가 없다고 생각합니다. Kaka는 이번에 컴파일하는 데 이틀을 보냈습니다. 당신을 위한 사본 Redis 마스터-슬레이브 복제에 대한 모든 지식 포인트
Kaka는 이 로드맵에 따라 작성을 준비하면서 로드맵을 편집하고 인터뷰 가이드를 만들었습니다. 기사에 포함되지 않은 지식 포인트도 나중에 댓글로 추가하겠습니다. 1. Redis 마스터-슬레이브 복제란 무엇인가요? 마스터-슬레이브 복제는 이제 두 개의 Redis 서버가 있고 한 Redis의 데이터가 다른 Redis 데이터베이스와 동기화된다는 의미입니다. 전자를 마스터 노드, 후자를 슬레이브 노드라고 합니다. 데이터는 마스터에서 슬레이브로 한 방향으로만 동기화될 수 있습니다.
그러나 실제 과정에서는 마스터-슬레이브 복제를 위해 두 개의 Redis 서버만 보유하는 것은 불가능합니다. 이는 각 Redis 서버를 마스터 노드(마스터)라고 부를 수 있음을 의미합니다.
아래의 경우, 우리의 슬레이브3는 둘 다입니다 마스터의 슬레이브 노드와 슬레이브의 마스터 노드.
먼저 이 개념을 이해하고, 더 자세한 설명을 보려면 아래를 계속 읽어보세요.
현재 독립형 상태인 Redis 서버가 있다고 가정해 보겠습니다.
이 경우 발생하는 첫 번째 문제는 서버 다운타임으로, 이는 데이터 손실로 직결됩니다. 프로젝트가 RMB와 관련이 있다면 그 결과는 상상할 수 있습니다.
두 번째 상황은 메모리 문제입니다. 서버가 하나만 있으면 메모리는 확실히 정점에 도달합니다. 그래서 위의 두 가지 문제에 대응하여 몇 대의 서버를 더 준비하고 마스터-슬레이브 복제를 구성하도록 하겠습니다. 여러 서버에 데이터를 저장합니다. 그리고 각 서버의 데이터가 동기화되었는지 확인하세요. 서버가 다운되더라도 사용자의 이용에는 영향을 미치지 않습니다. Redis는 계속해서 고가용성과 데이터 중복 백업을 달성할 수 있습니다.
이때 마스터와 슬레이브를 어떻게 연결하는지 궁금하신 점이 많을 텐데요. 데이터를 동기화하는 방법은 무엇입니까? 마스터 서버가 다운되면 어떻게 되나요? 걱정하지 말고 문제를 조금씩 해결해 보세요.
위에서 Redis의 마스터-슬레이브 복제를 사용하는 이유에 대해 이야기했는데, 마스터-슬레이브 복제의 역할은 왜 사용되는지 설명하는 것입니다. .
말이 많았으니 먼저 마스터-슬레이브 복제 사례를 먼저 구성한 다음 이야기해 보겠습니다. 그것에 대해 구현 원칙.
redis 저장 경로는 usr/local/redis
로그 및 구성 파일이 저장되는 위치: usr/local/redis/data
먼저 redis6379.conf 및 redis6380.conf라는 두 가지 구성 파일을 구성합니다. 주로 포트를 수정하기 위해 구성 파일을 수정합니다. 보기의 편의를 위해 로그 파일과 영구 파일의 이름은 해당 포트로 식별됩니다. 그런 다음 각각 포트 6379와 포트 6380을 사용하여 두 개의 Redis 서비스를 엽니다. redis-server redis6380.conf
,然后使用redis-cli -p 6380
连接,因为redis的默认端口就是6379所以我们启动另外一台redis服务器直接使用redis-server redis6379.conf
然后直接使用redis-cli
명령을 실행하고 직접 연결하세요. 현재 우리는 두 개의 Redis 서비스를 성공적으로 구성했습니다. 하나는 6380이고 다른 하나는 6379입니다. 이는 단지 데모용입니다. 실제 작업에서는 두 개의 서로 다른 서버에 구성해야 합니다.
먼저 개념이 있어야 합니다. 즉, 마스터-슬레이브 복제를 구성할 때 모든 작업은 슬레이브 노드, 즉 슬레이브에서 동작합니다.
그런 다음 를 실행하면 연결되었다는 의미입니다. <img src="https://img-blog.csdnimg.cn/20200531161251477.png" alt="여기에 이미지 설명 삽입" style="max-width:90%">마스터-슬레이브 복제가 달성되었는지 먼저 테스트해 보겠습니다. 두 개의 <code style="overflow-wrap: break-word; margin: 0px 2px;font-family: " operator mono consolas monaco menlo monospace word-break: break- all color : rgb rgba>을 설정하면 Slave6380 포트를 성공적으로 얻을 수 있습니다. 이는 마스터-슬레이브 복제가 구성되었음을 의미합니다. 그러나 프로덕션 환경의 구현이 세상의 종말은 아닙니다. 나중에 고가용성이 달성될 때까지 마스터-슬레이브 복제가 더욱 최적화될 것입니다. <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:>slaveof 127.0.0.1 6379
,执行完就代表我们连接上了。我们先测试一下看是否实现主从复制。在master这台服务器上执行俩个set kaka 123 和 set master 127.0.0.1
,然后在slave6380端口是可以成功获取到的,也就说明我们的主从复制就已经配置完成了。但是在实现生产环境可不是就这样完事了,后边会在进一步对主从复制进行优化,直到实现高可用。
在使用配置文件启动主从复制之前呢!先需要把之前使用客户端命令行连接的断开,在从主机执行slaveof no one
即可断开主从复制。在哪可以查看从节点已经断开了主节点呢!在主节点的客户端输入命令行info
누구의 슬레이브
도 마스터-슬레이브 복제를 끊을 수 없습니다. 슬레이브 노드가 마스터 노드에서 연결 해제되었는지 어디서 확인할 수 있나요? 마스터 노드의 클라이언트에 명령줄을 입력합니다정보
보기 🎜이 사진은 클라이언트 명령줄을 사용하여 슬레이브 노드를 사용하여 마스터 노드에 연결한 후 클라이언트에서 info
출력된 정보를 보면 Slave0에 대한 정보가 있는 것을 볼 수 있습니다. 이 이미지는 슬레이브 노드에서 실행됩니다slaveof no one
이후에는 info
, 이는 슬레이브 노드가 마스터 노드에서 연결이 끊어졌음을 나타냅니다. 구성 파일에 따라 Redis 서비스를 시작할 때 redis-server redis6380.conf
info
打印的信息,可以看到有一个slave0的一个信息。这个图是在从节点执行完slaveof no one
后,在主节点打印的info
,说明从节点已经跟主节点断开连接了。在根据配置文件启动redis服务,redis-server redis6380.conf
当在从节点重新启动后就可以在主节点直接查看到从节点的连接信息。测试数据,主节点写的东西,从节点还是会自动同步的。
这种方式配置也是很简单,在启动redis服务器时直接就启动主从复制,执行命令:redis-server --slaveof host port
redis-server --slaveof 호스트 포트
🎜마스터 노드의 로그 정보입니다마스터의 연결 정보가 포함된 슬레이브 노드의 정보입니다. 노드 및 RDB 스냅샷 저장.
마스터-슬레이브 복제의 전체 작업 흐름은 다음과 같이 나뉩니다. 세 단계. 각 세그먼트에는 고유한 내부 워크플로우가 있으므로 이 세 가지 프로세스에 대해 설명하겠습니다.
위 그림은 전체 마스터-슬레이브 복제 연결 설정 워크플로입니다. 그런 다음 짧은 단어를 사용하여 위의 작업 흐름을 설명합니다.
연결을 설정하는 과정에서 슬레이브 노드는 마스터의 주소와 포트를 저장하고, 마스터 노드 마스터는 슬레이브 노드의 포트를 저장합니다.
이 그림은 슬레이브 노드가 마스터 노드에 처음 연결될 때 데이터 동기화 프로세스를 자세히 설명합니다.
슬레이브 노드가 마스터 노드에 처음 연결되면 먼저 전체 복사를 수행합니다. 이 전체 복사는 불가피합니다.
전체 복제가 완료된 후 마스터 노드는 복제 백로그 버퍼에 데이터를 보내고, 슬레이브 노드는 bgrewriteaof를 실행하여 데이터를 복원하는데, 이 역시 부분 복제입니다.
이 단계에서는 전체 복사, 부분 복사, 복사 버퍼 백로그 세 가지 새로운 사항이 언급됩니다. 이러한 사항은 아래 FAQ에서 자세히 설명하겠습니다.
마스터 데이터베이스가 수정되어 마스터와 슬레이브 서버의 데이터가 일치하지 않으면 마스터와 슬레이브 데이터가 일치하도록 동기화됩니다. 프로세스는 명령에 대해 전파(Propagate)라고 합니다.
마스터는 수신한 데이터 변경 명령을 슬레이브에 보내고, 슬레이브는 명령을 받은 후 명령을 실행하여 마스터-슬레이브 데이터를 일치시킵니다.
「명령 전파 단계에서 부분 복제」
명령 전파 단계에서 네트워크 연결이 끊어지거나 네트워크 지터로 인해 연결이 끊어집니다(연결 끊김)
이때 마스터 노드는 계속해서 replbackbuffer(복제 버퍼 백로그 영역)에 데이터를 쓰게 됩니다
슬레이브 노드는 계속해서 마스터에 연결(마스터에 연결)을 시도합니다
슬레이브 노드가 자신의 runid와 복제 오프셋을 넣을 때 마스터 노드로 보내고, pysnc 명령을 실행하여 동기화합니다. 마스터는 오프셋이 복사 버퍼 범위 내에 있다고 판단하면 계속 명령을 반환합니다. 그리고 복사 버퍼의 데이터를 슬레이브 노드로 보냅니다.
슬레이브 노드로부터 데이터를 수신하고 bgrewriteaof를 실행하여 데이터를 복원합니다.
이 프로세스는 가장 완벽한 마스터-슬레이브 복제 전체 프로세스 설명입니다. 그럼 각 과정을 간략히 소개하겠습니다
해당 <code style="overflow-wrap: break-word; margin: 0px 2px;font-family: " operator mono consolas monaco menlo monospace word-break: break rgb rgba runid>데이터를 요청합니다. 하지만 여기서는 슬레이브 노드가 처음 연결될 때 마스터 노드의 <code style="overflow-wrap: break-word; margin: 0px 2px; Font-family: " operator mono consolas monaco menlo monospace rgb>runid 및 오프셋
. 따라서 전송된 첫 번째 명령은 은 마스터 노드의 모든 데이터를 원한다는 의미입니다. <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:>psync ? 1 psync runid offset
找对应的runid
索取数据。但是这里可以考虑一下,当从节点第一次连接的时候根本就不知道主节点的runid 和 offset
。所以第一次发送的指令是psync ? 1
意思就是主节点的数据我全要。psync runid offset
2
슬레이브 노드에서 +FULLRESYNC를 수신하고, 마스터 노드의 runid와 오프셋을 저장한 후, 현재 데이터를 모두 지우고, 소켓을 통해 RDB 파일을 수신하고, RDB 데이터 복원을 시작합니다. 🎜🎜🎜🎜전체 복사 후 슬레이브 노드는 마스터 노드의 runid와 오프셋을 획득하고 지침 전송을 시작했습니다
psync runid offset
🎜🎜🎜🎜 마스터 노드는 명령을 수신하고 runid가 일치하는지 확인하고 오프셋이 복사 버퍼에 있는지 확인합니다. 🎜🎜🎜🎜마스터 노드가 runid와 offset 중 하나가 만족되지 않는다고 판단하면 2
계속해서 전체 복사를 수행합니다. 여기서 runid 불일치는 슬레이브 노드를 다시 시작해야만 발생할 수 있습니다. 이 문제는 복제 백로그 버퍼 오버플로로 인해 해결될 예정입니다. runid나 offset 검사를 통과한 경우, 슬레이브 노드의 오프셋이 마스터 노드의 오프셋과 같으면 무시됩니다. runid 또는 오프셋 검사를 통과하고 슬레이브 노드의 오프셋이 오프셋과 다른 경우 +CONTINUE 오프셋(이 오프셋은 마스터 노드에 속함)이 전송되고, 슬레이브 노드 오프셋에서 마스터 노드 오프셋으로의 데이터가 전송됩니다. 복제 버퍼는 소켓을 통해 전송됩니다. 🎜🎜🎜🎜노드로부터 +CONTINUE를 받아 마스터의 오프셋을 저장한 후, 소켓을 통해 정보를 받은 후 bgrewriteaof를 실행하여 데이터를 복원합니다. 🎜🎜🎜🎜🎜 "1~4개는 전체 사본, 5~8개는 부분 사본"🎜🎜마스터 노드 3단계에서 마스터-슬레이브 복제 기간 동안 마스터 노드가 클라이언트 데이터를 수신하면서 마스터 노드의 오프셋이 변경되었습니다. 변경 사항만 각 슬레이브에 전송됩니다. 이 전송 프로세스를 하트비트 메커니즘이라고 합니다.
명령 전파 단계에서는 항상 마스터 노드와 슬레이브 노드 사이에 통신이 있습니다. 마스터 노드와 슬레이브 노드 간의 연결을 온라인 상태로 유지하려면 정보 교환과 유지 관리를 위한 하트비트 메커니즘을 사용해야 합니다.
master heartbeat
"하트비트 단계 중 주의 사항"
데이터 안정성을 보장하기 위해 슬레이브 노드 수가 중단되거나 지연 시간이 너무 높을 때 마스터 노드가 데이터를 보호합니다. 모든 정보 동기화가 거부됩니다.그렇다면 마스터 노드는 장애가 발생한 슬레이브 노드의 수와 지연 시간을 어떻게 알 수 있을까요? 하트비트 메커니즘에서 슬레이브는 매초 perlconf ack 명령을 보냅니다. 이 명령은 오프셋, 슬레이브 노드의 지연 시간 및 슬레이브 노드 수를 전달할 수 있습니다.
먼저 이 실행 ID가 무엇인지 살펴보고 info를 실행해 보겠습니다. 명령을 볼 수 있습니다. 위의 시작 로그 정보를 보면 이를 확인할 수도 있습니다.
Redis는 시작될 때 자동으로 임의 ID를 생성합니다(ID는 시작될 때마다 다르다는 점에 유의해야 합니다). 이는 40개의 임의의 16진수 문자열로 구성되며 Redis 노드를 고유하게 식별하는 데 사용됩니다. .
마스터-슬레이브 복제가 처음 시작되면 마스터는 슬레이브에 runid를 보내고 슬레이브는 마스터의 ID를 저장합니다. info 명령을 사용하여 이를 볼 수 있습니다.
연결이 끊어졌을 때 슬레이브는 이 ID를 마스터로 보냅니다. 슬레이브가 저장한 runid가 마스터의 현재 runid와 동일하면 마스터는 부분 복제를 시도합니다(또 다른 요소). 이 블록을 성공적으로 복사할 수 있는지 여부는 오프셋입니다. 슬레이브가 저장한 runid가 마스터의 현재 runid와 다를 경우 바로 전체 복사가 수행됩니다.
복사 버퍼 백로그는 사용자가 마스터의 명령 레코드를 저장하여 데이터를 수집하는 선입선출 큐입니다. 복사 버퍼의 기본 저장 공간은 1M입니다.
구성 파일에서 수정 가능 버퍼 크기를 제어합니다. 이 비율은 Kaka가 약 30%를 예약한 서버 메모리에 따라 수정될 수 있습니다. <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:>repl-backlog-size 1mb
来控制缓冲区大小,这个比例可以根据自己的服务器内存来修改,咔咔这边是预留出了30%左右。
「复制缓冲区到底存储的是什么?」
当执行一个命令为set name kaka
「복사 버퍼에 정확히 무엇이 저장되어 있나요?」
이름 설정
, 영구 파일 보기를 볼 수 있습니다그러면 복사 백로그 버퍼는 영구 데이터로 저장되며 바이트로 구분됩니다. 자체 오프셋. 이 오프셋도 복제 오프셋(offset)입니다
🎜"그럼 왜 복제 버퍼 백로그가 전체 복제를 일으킬 수 있다고 하는 걸까요?"🎜🎜🎜명령 전파 단계에서 마스터 노드는 수집된 데이터를 복제 버퍼에 저장하게 됩니다. 그런 다음 슬레이브 노드로 전송됩니다. 여기서 문제가 발생하는데, 마스터 노드에 있는 데이터의 양이 순간적으로 너무 많아 복제 버퍼의 메모리를 초과하게 되면 일부 데이터가 압착되어 마스터 노드와 슬레이브 노드 사이의 데이터 불일치가 발생하게 됩니다. . 전체 사본을 만들려면 버퍼 크기를 무리하게 설정하면 무한 루프가 발생할 수 있습니다. 슬레이브 노드는 항상 전체를 복사하고 데이터를 지우고 전체를 복사합니다. 🎜마스터 노드 복제 오프셋은 슬레이브 노드에 레코드를 한 번 보내고, 슬레이브 노드가 레코드를 한 번 받는 것입니다.
정보 동기화, 마스터 노드와 슬레이브 노드의 차이 비교, 슬레이브 연결 끊김 시 데이터 사용량 복원 등에 사용됩니다.
이 값은 복사 버퍼 백로그 영역의 오프셋입니다.
마스터 노드가 재시작되면 runid 값이 변경됩니다. 이로 인해 모든 슬레이브 노드가 완전히 복제됩니다.
이 문제에 대해 생각할 필요는 없습니다. 시스템이 어떻게 최적화되어 있는지 알면 됩니다.
마스터-슬레이브 복제가 설정된 후 마스터 노드는 생성된 전략은 runid와 동일하며 길이는 41비트, runid 길이는 40비트입니다. 슬레이브 노드.
마스터 노드에서 shutdown save 명령이 실행되면 RDB 지속성이 수행되고 runid와 오프셋이 RDB 파일에 저장됩니다. redis-check-rdb 명령을 사용하여 이 정보를 볼 수 있습니다.
마스터 노드가 재시작된 후 RDB 파일을 로드하고, 파일에 있는 repl-id와 repl-offset을 메모리에 로드합니다. 모든 슬레이브 노드가 이전 마스터 노드로 간주되는 경우에도 마찬가지입니다.
네트워크 환경이 좋지 않아 슬레이브 노드 네트워크가 중단됩니다. 복제 백로그 버퍼 메모리가 너무 작아서 데이터 오버플로가 발생하고 슬레이브 노드 오프셋이 경계를 넘으면서 전체 복제가 발생합니다. 이로 인해 전체 복사가 반복될 수 있습니다.
해결책: 복제 백로그 버퍼 크기 수정: repl-backlog-size
설정 제안: 마스터 노드가 슬레이브 노드에 연결하는 데 걸리는 시간을 테스트하고 마스터 노드에서 생성된 평균 총 명령 수를 얻습니다. per second write_size_per_second
복제 버퍼 공간 설정 = 2 * 마스터-슬레이브 연결 시간 * 초당 마스터 노드에서 생성되는 총 데이터 양
마스터 노드를 사용하거나 슬레이브 노드에서 자주 연결하는 경우. 이러한 상황의 결과로 버퍼, 대역폭, 연결 등을 포함하되 이에 국한되지 않는 마스터 노드의 다양한 리소스가 심각하게 점유됩니다.
마스터 노드 자원이 심각하게 점유되는 이유는 무엇인가요?
하트비트 메커니즘에서 슬레이브 노드는 매초 마스터 노드에 replconf ack 명령을 보냅니다. 슬레이브 노드에서 느린 쿼리가 실행되어 CPU를 많이 차지했습니다. 마스터 노드는 1초마다 복제 타이밍 함수인 ReplicationCron을 호출하고, 이후 슬레이브 노드는 오랫동안 응답하지 않습니다.
해결책:
슬레이브 노드 시간 초과 해제 설정
매개변수 설정: repl-timeout
이 매개변수의 기본값은 60초입니다. 60초 후에 슬레이브를 해제합니다.
네트워크 요인으로 인해 여러 슬레이브 노드의 데이터가 일치하지 않습니다. 이 요인을 피할 수 있는 방법은 없습니다.
이 문제에 대한 해결책은 두 가지가 있습니다.
첫 번째 데이터는 일관성이 뛰어나고 Redis 서버를 구성해야 하며, 읽기와 쓰기 모두에 하나의 서버를 사용해야 합니다. 이 방법은 소량의 데이터로 제한되며, 일관성이 높아야 합니다.
두 번째는 마스터-슬레이브 노드의 오프셋을 모니터링하는 것입니다. 슬레이브 노드의 지연이 너무 크면 슬레이브 노드에 대한 클라이언트의 액세스가 일시적으로 차단됩니다. 매개변수를slave-serve-stale-data yes|no로 설정합니다. 이 매개변수가 설정되면 info Slaveof와 같은 몇 가지 명령에만 응답할 수 있습니다.
이 문제는 클라이언트에서 사용 가능한 노드 목록을 직접 유지 관리하며, 슬레이브 노드가 실패하면 다른 노드로 전환하여 작업합니다. .
이 문서에서는 주로 마스터-슬레이브 복제가 무엇인지, 마스터-슬레이브 복제 작업의 세 가지 주요 단계, 워크플로 및 부분 복제의 세 가지 핵심에 대해 설명합니다. 명령 전파 단계 중 하트비트 메커니즘. 마지막으로 마스터-슬레이브 복제의 일반적인 문제에 대해 설명합니다.
이 기사는 작성하는 데 이틀이 걸렸습니다. 이것은 Kaka가 최근 작성한 기사 중 가장 긴 기사입니다. 앞으로 Kaka가 게시하는 기사는 단일 문제를 설명하기 위해 여러 기사를 게재하지 않을 것입니다. 한 글로 모두 마치겠습니다. 카카의 지식 포인트가 증가함에 따라 불완전한 지식 포인트나 잘못된 지식 포인트도 개선됩니다. 이 글은 주로 카카 리뷰의 편의를 위한 것입니다. 질문이 있으시면 댓글 섹션을 참조하세요.
Kaka는 모두가 함께 소통하고 배울 수 있기를 바랍니다. 잘못된 점이 있으면 지적해도 됩니다.
❝배움에 대한 끈기, 블로그에 대한 끈기, 공유에 대한 끈기는 카카가 경력 이후부터 늘 지켜온 신념입니다. 거대한 인터넷에 올라온 카카의 글이 조금이나마 도움이 되기를 바랍니다.
❞
추천: "redis 튜토리얼"
위 내용은 Redis 마스터-슬레이브 복제 원칙 및 일반적인 문제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!