ElastiCache(Redis) 구축
ElastiCache for Redis를 구축할 때 고민해야 하는 것 중 하나가 클러스터 구성입니다.
클러스터 구성에 세 가지 옵션이 있습니다.
- 싱글 클러스터 노드
- 클러스터 모드 없이 Replication만 지원 (클러스터 모드 X )
- 클러스터 모드와 Replication 모두 지원 (클러스터 모드 O)
Redis는 Primary Node와 Replica Node로 구성하는게 일반적이며, 이런 구성을 shard로 여러 벌 준비하여 data parinioning을 수행하는 것이 클러스터 모드(clsuter mode)입니다.
Redis의 쓰임새에 맞게 위 구성 중 하나를 선택해야 합니다. 선택의 기준은 최종 애플리케이션의 신뢰성, 사용성, 확장성에 기인합니다.
ex)
- 주 노드(Primary Node) 문제 발생 → Replica Nodes 사용 → 복제 지연으로 인해 일부 데이터 손실 가능
- 특정 가용 영역에 문제 발생 → Multi-AZ 구성으로 타 가용 영역의 Replica Node 사용
각각의 특징은 다음과 같습니다.
클러스터 모드는 언제 유용합니까?
일단 가용성이 중요한 상용 프로덕션 환경이라면 Replication은 필수적이라 할 수 있습니다. 다만 Replication은 수직 확장만 지원한다는 단점이 있습니다.
클러스터 모드는 위 테이블에서 볼 수 있듯이 샤드를 이용한 수평 확장(scaling)이 가장 큰 특징입니다. 이를 이용해 최대 90개 샤드에서 100TB 용량의 큰 데이터 규모로 스케일 확장이 가능합니다. 이는 새로운 서비스의 워크 로드의 저장 용량 산정이 어려울 경우에 대한 대비도 가능합니다.
read 작업이 많을 때는 하나의 샤드 안에 read replica를 추가하는 방식(최대 5개)을 사용하고 write 작업이 많을 때엔 클러스터 모드를 통해 추가적인 write endpoints(추가적인 primart node)를 새로운 샤드를 통해 얻어오는 방식이 바람직합니다.
데이터 샤딩(Data Sharding)
Redis는 모든 캐시 키가 해시 슬롯(hash slot)에 매핑하는 방식으로 샤딩을 활용한다. 1개의 클러스터는 16,384개의 해시 슬롯을 사용할 수 있고 일반적으로 클러스터 내 총 샤드에 균등하게 배포한다.
이는 동일한 캐시키를 사용하는 데이터는 모든 Redis 노드에 read/write가 가능하다는 의미입니다. 워크 로드가 증가하면 가용성을 확보하고 성능 지연을 줄이기 위해 복수 노드에 워크 로드를 분산합니다. 이때에도 redis 클라이언트는 하나의 endpoint에 접속하며 redis 내부에서 로드를 분산하는 구조입니다.
아래는 캐시키 foo인 데이터를 찾는 알고리즘을 보여줍니다.
e.g.) CRC16(“foo”) mod 16384 = 12182 → 3번째 샤드
AWS 구축
search에서 elasticache를 선택합니다.
redis tab에서 create를 눌러줍니다.
클러스터 모드를 활성화 해줍니다.
일반적인 노드유형을 선택했습니다.
위의 해당 유형으로1개의 샤드에 primary node1, replica node2를 배치했을 경우
아래와 같이 계산이 됩니다.
참고 가격정책: https://aws.amazon.com/ko/elasticache/pricing/
고급 Redis 설정(log, 백업, maintenance)은 defalut로 설정해놓았습니다.이는 상황에 따라 설정 가능합니다.
Bastion 서버를 통해 Redis 접속
먼저 ElastiCache 보안그룹에서의 redis 6379 port와 ecs에서의 인바운드 규칙 작업을 선행해야 합니다.
Bastion 서버에 SSH를 통해서 접속
- pem 파일의 경우 Bastion 인스턴스 생성 시 마지막 단계에서 생성한 Key Pair
- pem 파일이 있는 경로에서 아래 명령어를 실행
- 주소의 경우 Bastion 서버의 퍼블릭 아이피 정보
shpo-api-dev로 들어옵니다.
Bastion 서버에 접속 후 redis cli 설치
# make를 위한 gcc 설치
[bation]$ sudo yum install -y gcc
# redis-cli 다운로드 & 설치
[bation]$ wget http://download.redis.io/redis-stable.tar.gz && tar xvzf redis-stable.tar.gz && cd redis-stable && make
# 모든 위치에서 사용 가능하도록 /user/bin에 파일 복사
[bation]$ sudo cp src/redis-cli /usr/bin
Bastion 서버에서 redis-cli로 ElastiCache 접속
- [기본 엔드포인트] 정보가 funnc-catpre-redis.xxxxxxxxxx.clustercfg.apn2.cache.amazonaws.com:인 경우 아래와 같이 url과 port 번호 설정
redis-cli -h funnc-catpre-redis.xxxxxxxxxx.clustercfg.apn2.cache.amazonaws.com -p 6379
위와 같이 cluster slots를 확인할 수 있습니다.
해당 캐쉬의 데이터 등을 확인하고 컨트롤 하려면 redis-cli 명령어를 통해 할 수 있습니다.
redis 공식 docs를 이용하거나 redis-cli의 help 커멘드로 자세하게 확인할 수 있지만,
https://freeblogger.tistory.com/10 아래의 한국어로 정리되어 있는 글을 첨부해놓겠습니다.
Tuning
위의 tuning options 을 주어 master, replica
aws elasti-cache의 write to master, read from replica로 설정할 수 있습니다. aws elasti-cache의 cluster-mode의 또 하나의 특징은 각 샤드 내부의 노드들을 알고 있는 수퍼 구성 엔드포인트를 제공합니다. ( 다른 모드들은 node를 일일이 하나씩 주입을 시켜줘야 합니다. 물론 aws elasti-cache 관련 library를 사용하면 푸는 방법은 존재합니다. )
Monitoring
위와 같이 cloudwatch를 이용할 수 있습니다.
참고