일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 프로그래머스 등굣길
- 백준 1034 램프 파이썬
- 등굣길 파이썬
- 램프 파이썬
- 백준 2146 다리 만들기
- 순위 파이썬
- 가장 긴 팰린드롬 파이썬
- 게임 개발 파이썬
- 트리의 지름 파이썬
- 프로그래머스 베스트앨범
- 백준 2352 반도체 설계 파이썬
- 가장 긴 바이토닉 부분 수열 파이썬
- SQL SERVER 장비교체
- 역사 파이썬
- 프로그래머스 여행경로
- 다중 컬럼 NOT IN
- 백준 1043 거짓말 파이썬
- 프로그래머스 가장 긴 팰린드롬
- 백준 1516 게임 개발
- 백준 11054.가장 긴 바이토닉 부분 수열
- 프로그래머스 순위 파이썬
- 백준 1613 역사
- 반도체 설계 파이썬
- 다리 만들기 파이썬
- 프로그래머스 순위
- 백준 1167 트리의 지름 파이썬
- 베스트앨범 파이썬
- 백준 1238 파티 파이썬
- SQL SERVER MIGRATION
- SWEA
- Today
- Total
공부, 기록
[REDIS] Redis의 복제와 클러스터 본문
Redis 복제 개념 이해
복제
- 복제란 레디스의 데이터를 거의 실시간으로 다른 레디스 노드에 복사하는 작업입니다. 원본을 Master라고 복제본 노드를 Replica라고 합니다.
- 레디스는 비동기 복제입니다.
- 다중 슬레이브 구성이 가능합니다.
- 마스터를 시작한 후 복제서버를 시작하고 데이터 동기화를 확인이 필요합니다.
- 레디스 2.6 부터 기본적으로 복제서버는 쓰기는 할 수 없고, 조회만 가능합니다. replica-read-only 파라미터로 변경 가능합니다.
- Master, Replica Node에서 info replication 명령어를 통하여 확인이 가능합니다.
복제 동기화 방식
전체 동기화(full synchronization) : 전체 데이터를 동기화하는 방식
- Disk-to-Disk: 마스터는 메모리에 있는 전체 데이터를 디스크에 파일로 저장후 전송한다.
복제본은 데이터를 받아 디스크에 파일로 저장한 다음 메모리에 적재(로딩)한다.
버전 6.x까지 기본 동작 - Memory-to-Disk: 마스터는 메모리에 있는 전체 데이터를 소켓으로 복제본에 바로 전송한다.
복제본은 데이터를 받아 디스크에 파일로 저장한 다음 메모리에 적재(로딩)한다.
버전 7.0부터 기본 동작 - Memory-to-Memory: 마스터는 메모리에 있는 전체 데이터를 소켓으로 복제본에 바로 전송한다.
복제본은 데이터를 받아 바로 메모리에 적재(로딩)한다.
6.0부터 사용 가능, 메모리를 2배로 사용하므로 사용상 주의가 필요하다.
Disk-to-Disk
- 마스터는 Fork를 사용해 백그라운드로 RDB파일에 데이터를 저장합니다.
- 데이터를 저장하는 동안 마스터에 새로 들어온 명령들은 처리 후 복제버퍼에 저장됩니다.
- RDB 파일 저장이 완료되면, 마스터는 파일을 복제서버에게 전송합니다.
- 복제서버는 파일을 받아 디스크에 저장하고, 메모리로 로드합니다.
- 마스터는 버퍼에 저장된 명령을 복제서버에게 전송합니다.
Memory-to-Disk
- 복제서버는 받은 데이터를 RDB 파일에 저장합니다.
- 마스터의 자식 프로세스가 RDB 데이터를 소켓을 통해서 복제 서버에게 직접 쓰는 방식
Memory-to-Memory
- 복제서버에 rdb 파일을 생성하지 않습니다. Redis 버전 6.0부터 지원됩니다.
- 만약의 사태에 대비해서 기존 데이터를 메모리(RAM)에 보존합니다.
- 복제가 성공하면 RAM에 보존한 데이터는 지웁니다. 복제가 실패하면 RAM에 보존한 데이터로 복구합니다.
- 이 경우 기존 데이터 + 새 데이터 만큼 메모리(RAM)이 필요하므로 충분한 메모리가 있어야 합니다.
부분 동기화(Partial resynchronization) : 복제가 중단된 후 실행되었을 때 일부 누락 데이터를 동기화 하는 방식
- 마스터와 복제서버는 각 서버의 run id 와 replication offset을 가지고 있습니다.
- 마스터와 복제서버간 네트워크가 끊어지면 마스터는 복제서버에 전달할 데이터를 backlog-buffer에 저장합니다.
- 다시 연결되었을 때 backlog-buffer가 넘치지 않았으면 run id와 offset을 비교해서 그 이후 부터 동기화를 합니다.
- 마스터의 backlog-buffer가 넘치거나 마스터나 복제서버 중 한쪽이 재시작했을 경우에는 전체 동기화를 합니다.
RDB 파일 생성에서 REDIS의 사용 메모리의 2배만큼 메모리가 증가하는 것으로 알고 있었는데
RDB 생성으로 인하여 항상 사용 메모리의 2배를 사용하는 것은 아니고
BGSAVE를 진행하는 동안 WRITE, UPDATE 등의 추가적인 메모리 내용의 변경이 발생할 경우 그 부분에 대하여 메모리 사용량이 증가 .
복제 설정 방법
Replica Node 서버의 conf 파일에 replicaof <masterip> <masterport> 를 추가하여 복제를 구성합니다.
replicaof 'ip' 'port' 명령어를 통해 복제를 연결합니다.
Master
replicaof no one : 자신을 마스터 노드로 변경합니다.
slaveof no one : 복제 서버를 마스터로 승격시킵니다.
Replica
replicaof 'ip' 'port' : 복제 연결을 설정합니다.
slaveof 'ip' 'port' : 복제 연결을 설정합니다.
복제 확인 방법
ROLE : Master, Slave 여부 파악
INFO 명령어의 REPLICATION 부분
ALL
master_repl_offset : 복제 OFFSET 정보
repl_backlog_active : Master = 1 Slave = 0
repl_backlog_size : repl-backlog-size 설정값. 부분 동기화에 사용되는 버퍼 사이즈.
repl_backlog_first_byte_offset : repl_backlog OFFSET 정보
repl_backlog_histlen : repl_backlog 길이
Master
connected_slaves : 마스터일 경우 연결된 슬레이브 수
slave0:ip=127.0.0.1,port=5002,state=online,offset=1818050955,lag=0 :연결된 슬레이브 정보, 슬레이브 수 만큼 표시된다.
Slave
master_host : 마스터 노드 IP
master_port : 마스터 노드 Port
master_link_status : 마스터 노드와 연결 상태 정상 up, 비정상 down
주위: 슬레이브 노드를 시작한 후 AOF/RDB 파일을 로딩하는 동안, 마스터와 Full Sync 하는 동안 down으로 표시된다. Full Sync가 완료되면 up으로 표시된다.
master_link_down_since_seconds : 링크가 다운된 후 경과 시간을 초로 보여준다.
master_last_io_seconds_ago : 디폴트로 10초에 한번씩 ping 확인을 하므로 0~10사이의 값이다. 이 값이 10보다 크면 마스터와 통신을 하지 못하는 상태가 지속되는 것. master_link_status:down 이면 -1로 표시된다.
master_sync_in_progress : 마스터 노드와 Sync 중이면 1.
master_sync_left_bytes : Sync를 완료할때까지 남아있는 바이트, 슬레이브 입장에서는 받아야할 데이터 크기.
master_sync_last_io_seconds_ago : Sync동안 마지막으로 데이터를 받은 이후 시간(초) master_sync_left_bytes가 0 이 되면 이 값은 증가하기 시작한다. 이 값이 증가하는 동안 받은 RDB 파일을 로딩하는 중이다.
slave_repl_offset : 슬레이브 노드의 복제 OFFSET
slave_priority : 장애조치 우선순위. 숫자가 낮을 수록 우선순위가 높다. 장애조치에서 제외하려면 0으로 설정
slave_read_only : 1일 경우 Read만 가능 0이면 저장/변경/삭제명령 수행이 가능하다.
상황 별 복제 작업
- 신규 복제셋 구성
- Slave 노드에서 replicaof 'ip' 'port' : 명령어를 통하여 복제 연결
conf 파일에는 자동으로 반영이 진행됩니다.
- Slave 노드에서 replicaof 'ip' 'port' : 명령어를 통하여 복제 연결
- 기존 복제셋에 슬레이브 추가
- Slave 노드에서 replicaof 'ip' 'port' : 명령어를 통하여 복제 연결
conf 파일에는 자동으로 반영이 진행됩니다.
- Slave 노드에서 replicaof 'ip' 'port' : 명령어를 통하여 복제 연결
- 수동 장애조치
- Slave 노드에서 replicaof no one 명령어 실행
- 복제가 중단이 된 경우
- 일시적인 중단이라면 backlog-buffer에 따라서 부분 동기화가 진행될 것으로 예상됩니다.
- 노드가 다운된 후 올라올 경우 전체 동기화로 진행될 것으로 예상됩니다.
Redis Cluster 개념 이해
클러스터 개요
Redis Cluster : 데이터를 자동으로 여러 Redis 노드에 나누어 저장하며(Sharding) HA를 지원하는 기술.
과반수의 Master 노드가 죽는 경우 클러스터가 중단 됩니다.
dataset을 Hashslot으로 여러 노드들에 데이터가 매핑됩니다.
클러스터 동작 방식
- 자체적인 바이너리 프로토콜을 통해 node-to-node로 통신을 한다.
- 각 노드들은 클러스터에 속한 다른 노드들의 정보를 모두 갖고 있는다.
- 최소 마스터 개수는 3대 이상 구성을 권고한다.
클러스터 구성 옵션
config 파일에서 수정
- cluster-enabled yes : yes로 하면 cluster mode로 시작. no로 하면 standalone mode로 시작합니다.
- cluster-config-file /path/nodes.conf : 이 파일은 클러스터의 상태를 기록하는 바이너리 파일로 클러스터의 상태가 변경될때 마다 상태를 기록합니다.
- cluster-node-timeout 3000 : 레디스 노드가 다운되었는지 판단하는 시간입니다. node의 과반수가 down 상태로 체크할 경우 slave를 master로 승격하는 failover 처리를 시작하며 단위는 millisecond 입니다.
- cluster-slave-validity-factor : master와 slave node 간의 체크가 오랫동안 단절된 상태면 해당 slave는 승격 대상에서 제외. 이때 승격 대상에서 제외하는 판단 기준의 시간을 설정.
계산식 : (cluster-node-timeout * cluster-slave-validity-factor) + repl-ping-slave-period- repl-ping-slave-period : 복제 서버에서 마스터 서버로 ping을 날려 down 여부를 인식하는 시간
- cluster-migration-barrier : master에 연결되어 있어야 하는 최소 slave의 수 (기본값=1)
- cluster-require-full-coverage : cluster의 일부 node가 다운된 경우 클러스터의 상태를 결정합니다.
- yes : slave가 없는 master가 다운되면 cluster 전체가 중지
- no : slave가 없는 master가 다운되더라도 cluster는 유지. 다운된 master의 슬롯에서만 에러가 발생.
- 일부 데이터가 유실돼도 괜찮으면 no, 데이터의 정합성이 중요하다면 yes를 선택.
- no로 설정하더라도 절반 이상의 node가 down 되면 cluster는 중지됩니다.
클러스터 상태 확인
CLUSTER INFO
- cluster_state: 클러스터 상태를 나타낸다. ok는 명령을 처리할 수 있는 상태이다. fail은 명령을 처리할 수 없는 상태이다.
- cluster_slots_assigned: 레디스 서버에 할당된 슬롯의 개수이다. 레디스 클러스터는 16384개의 슬롯이 있다.
- cluster_slots_ok: 할당된 슬롯의 개수이다.
- cluster_slots_pfail: 일시적으로 접속할 수 없는 노드에 할당된 슬롯 수이다.
- cluster_slots_fail: 다운된 서버에 할당된 슬롯 수이다.
- cluster_known_nodes: 슬레이브를 포함해서 클러스터에 연결된 모든 노드 수이다.
- cluster_size: 슬롯이 할당된 마스터 서버 수이다.
- cluster_current_epoch: 현재 클러스터의 에포크 번호. 에포크는 클러스터 상태 변경이 있을 때마다 증가하는 숫자로, 클러스터의 버전을 추적하는 데 사용
- cluster_my_epoch: 해당 노드의 에포크 번호
- cluster_stats_messages_sent: 클러스터 노드 간 바이너리 버스를 통해 전송된 메시지 수
- cluster_stats_messages_received: 클러스터 노드 간 바이너리 버스를 통해 수신된 메시지 수.
클러스터 페일오버
- 복제본이 있는 경우
- 마스터 노드가 다운되면 복제본 노드가 마스터로 승격됩니다.
- 이후 이전 마스터 노드가 시작되면 복제본으로 변경됩니다.
- 복제본이 없는 경우
- cluster-require-full-coverage 옵션에 따라 클러스터 작동 여부가 달라집니다.
- 해당 노드 없이 작동되는 경우 노드가 가지고 있던 슬롯을 제외하고는 정상적으로 동작합니다.
- 다운된 노드를 클러스터에서 제거한 뒤 할당되어 있던 슬롯을 addslots 명령어를 통하여 다른 노드로 할당합니다.
- 노드가 정상화된 경우 클러스터에 추가한 뒤 reshard를 진행합니다.
참고
'공부 > DATABASE' 카테고리의 다른 글
[PostgreSQL] Aurora PostgreSQL의 Shared Buffer 기본값 (0) | 2024.09.15 |
---|---|
[AWS] Aurora 공부 3 (모니터링) (0) | 2024.09.15 |
[AWS] ElastiCache 란? (0) | 2024.09.15 |
[AWS] RDS 스냅샷 (0) | 2024.09.15 |
[postgreSQL] 인덱스 스캔 방법 (0) | 2024.08.25 |