Redis

Redis - Pipelining

MIN우 2024. 2. 11. 21:48
728x90

 

Redis하면 뭐가 떠오를까 ?

- 캐시이므로 빠른 성능

- key-value

- 인메모리 db

- Single thread

- atomic

 

 

Single thread vs Multi Thread

redis는 부분적으로 Single thread와 Multi Thread를 함께 사용한다.
클라이언트로 부터 전송된 네트워크를 읽는 부분과 전송하는 부분 Multi Thread로 구현되어있으며
우리가 redis에 요청한 명령을 실행하는 부분은 Single thread로 구현되어 있다.
때문에 single thread의 장점인 Atomic한 요청 처리가 가능한 것이다.

 

  • I/O : 네트워크 connection
  • Event Loop : 명령 실행부분

위와 같은 방식을 활용한다면 클라이언트가 네트워크 패킷을 여러번 보냈을 때 Redis는 각 요청의 응답을 기다리지 않고 일괄 처리하게 되는데 이는 네트워크 오버헤드를 줄이면서 시스템의 전체 처리량을 향상시킨다는 이유였다. (이러한 방식을 Pipelining이라 부르는 것 같다.)
해당 구조를 택하면서 Redis의 성능이 2배이상 좋아졌다고 한다.

더 궁금해서 찾아봤다.

 

파이프라이닝은 네트워크 통신에서 발생하는 지연을 줄이고 처리량을 향상시키는 방법이라고 한다.  이를 활용하면 

네트워크 오버헤드를 줄이고 클라이언트와 서버가 효율적인 통신이 가능하다고한다.

 

일반적으로 클라이언트가 Redis서버로 여러개의 요청을 보낼 때 각각의 요청에 대해 네트워크 오버헤드가 발생하고, 이러한 오버헤드는

TCP연결설정,데이터 전송,응답 수신 등의 과정에서 발생한다. 파이프라이닝을 사용하게되면 여러개의 데이터를 일괄적으로 처리하고 서버는 모든 요청을 순차적으로 처리하고 응답을 일괄적으로 함으로 네트워크 오버헤드를 줄이고 효율적인 통신을 할 수 있다.

 

 

Redis Transaction이란?

여러 가지 명령어들을 처리하는 하나의 단위로 multi로 트랜잭션을 시작하고 exec를 통해 명령어들을 수행시켜 결괏값을 반환받습니다.

기존 RDB의 트랜잭션과는 조금 다른 의미를 가지고 있습니다.

 

Redis pipeline이란?

명령어들을 모아서 한번에 서버로 전송시켜 네트워크 오버헤드를 줄이는 방안입니다.

 

 

Transaction과 Pipeline

두 방법 모두 서버에 명령을 한 번만 보내는데 차이에 대해 조금 불확실하게 느껴집니다.

transaction을 활용하면 모든 명령은 pipelining 되고 EXEC가 실행되면 모든 명령이 함께 실행되므로 항상 여러 명령의 원자성을 유지합니다.

 

transaction과 pipelining은 어떻게 다를까요?

 

Pipeline을 처리하는 동안에는 중간에 다른 명령을 실행할 수 있다.

redis의 명령어를 처리하는 부분은 single thread여서 각각의 명령어들을 항상 원자적입니다.

하지만 서로 다른 클라이언트에서 주어진 두 명령은 번갈아 가며 순차적으로 실행될 수 있습니다.

하지만 multi/exec 사이에 존재하는 명령어들은 다른 클라이언트가 명령을 실행하지 않도록 보장합니다.

중간에 다른 클라이언트의 명령이 실행되지 않기 때문에 너무 오래걸리는 트랜잭션을 사용하지 않도록 주의해야 합니다.

 

pipeline으로 처리하는 동안에는 다른 클라이언트의 작업을 처리할 수 있습니다.

즉, 클라이언트가 5개의 요청이 담긴 pipeline 2개를 보내면 각 pipeline의 명령은 순차적으로 실행되지만 2개의 pipeline이 번갈아가면서 수행될 수 있습니다.

 

Redis 클러스터를 구축한 후 샤딩했을 경우

 

Redis 클러스터는 여러 개의 노드에 데이터를 분산하여 저장하고 관리하는 분산 시스템입니다. 하지만 Redis 클러스터에서 데이터가 중복으로 저장되지는 않습니다. 대신, Redis 클러스터는 데이터의 일관성을 유지하기 위해 내부적으로 데이터 샤딩(sharding)을 수행하여 각 노드에 데이터를 분산 저장합니다.

데이터가 Redis 클러스터에 저장될 때, 클러스터는 데이터를 적절한 해시 함수를 사용하여 키(key)를 파티션(partition)으로 변환하고, 각 파티션에 대해 적절한 노드에 배치합니다. 이러한 과정을 통해 각 데이터는 단일 노드에만 저장되며 중복으로 저장되지 않습니다.

또한 Redis 클러스터는 일관성 유지를 위해 내부적으로 몇 가지 복제(replication) 메커니즘을 사용합니다. 이를 통해 데이터 손실이나 장애 시에도 데이터를 보호하고 가용성을 유지할 수 있습니다. 따라서 Redis 클러스터를 통해 데이터가 중복으로 저장되는 것이 아니라 안전하게 분산되고 관리됩니다.

 

 

728x90