programing

Redis - 클러스터를 사용하여 데이터 손실 방지(가십 프로토콜 사용)

padding 2023. 7. 22. 09:30
반응형

Redis - 클러스터를 사용하여 데이터 손실 방지(가십 프로토콜 사용)

우리는 2개의 데이터 센터에 Kubernetes에 Airflow 애플리케이션을 배포하고 싶습니다.

공기 흐름 스케줄 컨테이너는 1분, 5분 및 10분마다 DAG를 생성합니다.이러한 DAG는 공기 흐름 작업자 컨테이너에 할당되는 작업입니다.

공기 흐름 작업자에게 작업을 할당하는 과정에서 공기 흐름 스케줄은 작업에 대한 데이터를 MariaDb(진실의 소스로 간주할 수 있음)와 Redis로 보냅니다.

MariaDB에서 태스크는 상태 중 하나를 가질 수 있습니다.queued', 'running', 'success', 'failed작업이 Redis에 있으면 ' 상태가 됩니다.queued'.

MariaDB는 Flow Schedule에서 작업을 수신할 때 동일하게 유지됩니다.Redis가 대기 중인 특정 작업을 Worker 컨테이너로 넘겨주면 MariaDB는 해당 특정 작업 상태를 '실행 중'으로 변경하고 프로세스 실행을 완료하면 MariaDB의 작업 상태가 '성공'으로 변경됩니다.

실제 문제:

Redis가 실패하면 MariaDB에서 작업을 대기열에 넣었지만 Redis에서 데이터가 손실됩니다.k8s가 새 Redis 서버를 시작하면 이전 작업이 손실됩니다. 즉, 데이터 손실이 발생합니다.

이에 대한 해결책은 무엇일까요?

사용할 수 있습니까?Redis Clustering - Gossip protocol데이터 손실 방지:

가능한 경우 이 프로토콜을 사용하여 이 문제를 해결하는 데 필요한 문서를 제공할 수 있습니다.또는 내 환경과 시나리오에 맞는 제안을 제공합니다.

Redisclustering을 사용하면 도움이 되지만, 백업을 완전히 대체할 수 있는 것은 아니기 때문에 설정하는 것이 다소 번거롭습니다.

귀하의 경우 훨씬 더 간단한 해결책은 리디스크 시작 시 복구 절차를 통합하는 것이라고 생각합니다.MariaDB 진리 소스가 있으므로 영구적인 데이터 손실이 발생하지 않으므로 MariaDB에서 redis 데이터를 복구하는 스크립트를 실행하는 init 컨테이너를 추가할 수 있습니다.

문제를 크게 제한할 수 있는 또 다른 접근 방식은 영구 볼륨을 사용하여 redis 데이터를 정기적으로 메모리 내 상태를 스냅샷할 때 저장하는 것입니다.Redis 노드 포드를 관리하기 위해 Deployment 대신 StatefulSet을 사용하면 재시작/재스케줄링 시 스토리지가 다시 연결되므로 데이터 손실이 발생하지 않습니다(또는 마지막 스냅샷 이후 최소 창).

언급URL : https://stackoverflow.com/questions/52068087/redis-avoid-data-loss-using-cluster-using-gossip-protocol

반응형