2022-04-11-TIL
Today I Learned
Redis Cluster and Sentinel
Redis를 한 대로 운영하면 그 서버가 죽는 순간 서비스가 멈춘다. 이를 막는 운영 방식이 Sentinel과 Cluster인데, 둘은 푸는 문제가 다르다.
Redis Sentinel 문서는 Sentinel을 Redis Cluster를 쓰지 않을 때 고가용성을 제공하는 방법으로 소개한다. Sentinel이 하는 일은 네 가지다.
- 모니터링: master와 replica가 정상 동작하는지 계속 확인한다.
- 알림: 문제가 생기면 관리자나 다른 프로그램에 API로 알린다.
- 자동 장애 조치(failover): master가 정상이 아니면 replica 하나를 master로 승격하고, 나머지 replica가 새 master를 따르게 재설정한다.
- 설정 제공자: 클라이언트는 Sentinel에 현재 master 주소를 묻고, 장애 조치가 일어나면 Sentinel이 새 주소를 알려 준다.
즉 Sentinel 구성에서 데이터는 master 한 대에 모두 있고, replica는 복제본이다. 쓰기 용량은 master 한 대의 한계를 넘지 못한다.
Redis Cluster 문서에 따르면 Cluster는 데이터를 여러 Redis 노드에 자동으로 샤딩한다. 키 공간은 16384개의 해시 슬롯으로 나뉘고, 각 master 노드가 슬롯 일부를 맡는다. 각 master에 replica를 붙이면 일부 노드가 실패해도 동작을 이어 갈 수 있다. 대신 여러 키를 한 번에 다루는 연산은 키가 같은 슬롯에 있을 때만 가능하다. user:{123}:profile, user:{123}:account처럼 중괄호 안의 해시 태그가 같으면 같은 슬롯에 들어간다.
| 구분 | Sentinel | Cluster |
|---|---|---|
| 목적 | 고가용성(장애 조치) | 수평 확장(샤딩) + 고가용성 |
| 데이터 분산 | 하지 않는다 (master 한 대) | 해시 슬롯 16384개로 나눈다 |
| 다중 키 연산 | 제약 없음 | 같은 슬롯의 키끼리만 |
데이터가 한 대의 메모리에 충분히 들어가고 장애 대비가 목적이면 Sentinel, 데이터나 쓰기량이 한 대를 넘어서면 Cluster를 고려한다.
- https://velog.io/@always/Redis-%EC%9A%B4%EC%98%81-%EB%B0%A9%EC%8B%9D-Cluster-vs-Sentinel-%EC%96%B4%EB%96%A4-%EA%B2%83%EC%9D%84-%EC%84%A0%ED%83%9D%ED%95%B4%EC%95%BC-%ED%95%A0%EA%B9%8C
AWS Instance Types
EC2 인스턴스 타입 이름은 규칙이 있다. AWS 문서에 따르면 이름은 인스턴스 패밀리와 크기로 이루어진다. 패밀리의 첫 글자는 시리즈, 그다음 숫자는 세대, 그 뒤의 글자는 옵션이고, 점(.) 뒤가 크기다.
1
2
3
4
5
c7gn.4xlarge
c : 시리즈 (Compute optimized)
7 : 세대
gn : 옵션 (g = Graviton 프로세서, n = 네트워크/EBS 최적화)
4xlarge : 크기
자주 보는 시리즈는 M(범용), C(컴퓨팅 최적화), R(메모리 최적화), T(버스터블 성능), I(스토리지 최적화), P와 G(GPU)다. 옵션의 a는 AMD, g는 AWS Graviton(Arm), i는 Intel 프로세서, d는 인스턴스 스토어 볼륨이 붙어 있다는 뜻이다. 웹 서버처럼 자원을 고르게 쓰는 워크로드는 범용(M)에서 시작하고, 모니터링 지표를 보고 CPU나 메모리 쪽으로 옮기는 식으로 고른다.
- https://lovefor-you.tistory.com/414
- https://aws.amazon.com/ko/ec2/instance-types/
DTO 사용범위
DTO를 어느 계층까지 쓸지는 정답이 없는 주제다. 마틴 파울러가 말하는 DTO는 원격 호출 횟수를 줄이려고 데이터를 묶어 보내는 객체이므로, 원래 의미대로라면 프레젠테이션 계층과 외부 사이의 경계에서 쓰인다.
실제로는 두 가지 선택지가 자주 논의된다.
- 컨트롤러에서 DTO와 도메인 객체를 변환하고, 서비스는 도메인 객체만 주고받는다. 서비스가 웹 요청 형식에 묶이지 않는다.
- 서비스가 요청 DTO를 받아 응답 DTO를 돌려준다. 컨트롤러가 얇아지고, 트랜잭션 안에서 지연 로딩 필드를 DTO로 옮길 수 있다.
어느 쪽이든 중요한 것은 엔티티가 컨트롤러 밖으로 나가 API 응답 형식이 되지 않게 하는 것, 그리고 한 프로젝트 안에서 기준을 통일하는 것이다.
- https://tecoble.techcourse.co.kr/post/2021-04-25-dto-layer-scope/
컨플루언스 템플릿 매크로
Confluence의 Create from Template 매크로는 페이지에 버튼을 하나 만들고, 누르면 지정한 템플릿 내용이 채워진 새 페이지 편집기를 연다. 매크로를 넣을 때 사용할 템플릿(또는 블루프린트), 버튼에 표시할 이름, 새 페이지가 만들어질 스페이스를 지정한다.
회의록, 장애 보고서, 주간 보고처럼 형식이 정해진 문서를 모아 두는 페이지에 이 버튼을 두면, 작성자가 템플릿을 찾아다닐 필요 없이 같은 형식으로 문서를 만들 수 있다.
- https://www.lesstif.com/ats/create-from-template-113345750.html
Boolean to Y/N
레거시 DB에서는 boolean 대신 CHAR(1) 컬럼에 'Y', 'N'을 저장하는 경우가 많다. 엔티티 필드는 boolean으로 다루고 DB에는 Y/N으로 저장하려면 변환이 필요하다.
Hibernate 6은 이를 위한 YesNoConverter를 제공한다. Javadoc에 따르면 Boolean을 'Y' 또는 'N'으로 변환하는 AttributeConverter다. 같은 방식으로 'T'/'F'를 쓰는 TrueFalseConverter도 있다(Hibernate 사용자 가이드).
1
2
@Convert(converter = org.hibernate.type.YesNoConverter.class)
private boolean active;
Hibernate에 묶이지 않으려면 JPA 표준 AttributeConverter<Boolean, String>를 직접 구현해 @Convert로 지정하면 된다.
- https://thorben-janssen.com/hibernate-tips-how-to-map-a-boolean-to-y-n/
댓글
아직 댓글이 없습니다