라즈베리 파이에 Redis 를 올렸는데 컨테이너 여럿이 같이 도는 환경이었다. redis.conf 기본 설정에서 열 개쯤을 바꿨고 나중에 왜 이렇게 했는지가 나올 것이 뻔했다.
Table of contents
Open Table of contents
조치 — 값과 근거를 함께
바꾼 것들을 값과 근거를 나란히 둔 표로 정리했다. bind 와 protected-mode 와 save 와 maxmemory 와 maxmemory-policy 와 lazyfree-lazy-eviction 과 io-threads 와 경고 억제가 들어갔다.
값만 있으면 나중에 알아볼 수 없고 근거가 있어야 그것을 바꿀지 말지 판단할 수 있다. 표를 만드는 과정에서 근거가 애매한 항목이 어느 것인지도 함께 드러났다.
원인 — 이유가 둘인 설정
save "" 로 영속화를 끈 것이 특히 설명이 필요했다. 두 가지 방법이 있었는데 기본대로 RDB 를 켜 두는 것과 끄는 것이다. 뒤쪽을 골랐다. 이유는 둘이었다.
용도가 캐시와 세션이라 날아가도 다시 만들면 된다는 것이 하나이고 Redis 공식 문서대로 RDB 는 fork() 로 자식 프로세스를 만들어 스냅숏을 뜨므로 메모리가 적은 환경에서 부담이 된다는 것이 다른 하나다. 대신 재시작하면 세션이 전부 날아가 사용자가 다시 로그인해야 하는 것을 감수했다. 용도만 적으면 반쪽이고 성능 쪽 이유도 함께 적어야 한다.
주의 — 공존에서 나온 제한
maxmemory 와 io-threads 는 이 서비스가 혼자 쓰는 것이 아니라서 정한 값이다. 보드 전체 메모리와 코어 중 일부만 할당한 것이다.
이 값이 최적이라서가 아니라 여럿이 나눠 쓰니 이만큼이라는 뜻이다. 그것을 안 적으면 나중에 왜 이렇게 작게 잡았는지 의아해하며 올리게 되고 그러면 다른 것이 죽는다.
검증 — 용도별 최소 권한
ACL 을 쓰면서 권한을 둘로 나눴는데 앱 연결용은 +@all 이고 헬스체크용은 ACL SETUSER 로 +ping 하나만 허용했다. 헬스체크는 살았는지만 확인하면 되므로 데이터를 읽을 필요가 없다.
전부 막고 확인용 명령 하나만 여는 형태라 그 계정이 유출돼도 아무것도 못 한다. 용도별로 권한을 최소화한 것이다.
배경 — 태그와 환경 정보
기본 설정 파일이 수백 줄이라 어느 것이 바꾼 항목인지 구분이 안 됐다. 그래서 저장소에 있는 redis.conf.example 에 # CUSTOM: 태그를 달아 grep 하면 커스텀 항목만 나오게 했다.
실제 파일이 아니라 예제에 단 것은 실제 파일이 배포마다 생성될 수 있고 예제는 이력이 남으며 다음 사람이 예제를 보고 만들기 때문이다. 마지막으로 보드 사양과 공존 상황과 아키텍처와 버전을 함께 적었는데 같은 값이 다른 환경에서는 틀릴 수 있으므로 옮길 때 다시 정해야 한다는 것을 알리기 위해서였다.
정리
- 커스텀 설정은 값과 근거를 표로 정리한다
- 한 설정에 이유가 둘 이상이면 다 적는다
- 제한 값이 공존 때문이면 그것을 밝힌다
- 안 밝히면 나중에 올려서 다른 것을 죽인다
- 용도별로 권한을 최소화한다
- 긴 설정 파일에는 태그를 달아 커스텀 항목을 구분한다
- 의도는 저장소에 있는 예제에 적는다
- 환경 정보를 같이 적어야 옮길 때 다시 정하게 된다