새 서버를 세우면서 옛 서버의 설정 폴더를 통째로 복사했다. 돌아가긴 했는데 몇 가지가 어긋나 있었다.
Table of contents
Open Table of contents
상황 — 통째로 가져왔다
옮기는 명령은 한 줄이었다.
$ rsync -a old:/etc/app/ /etc/app/
rsync -a 로 옛 서버에서 돌던 그대로 옮기니 빠르고 확실해 보였다.
며칠 뒤 로그가 예상한 자리에 없다는 것을 알게 됐다. 그 사이 규약이 /var/log/<서비스>/ 로 바뀌었는데 옮겨 온 설정은 /app/logs/ 를 가리키고 있었다.
원인 — 항목별 대조
지금 규약과 하나씩 맞춰 봤다.
항목 지금 규약 옮겨 온 것
로그 경로 /var/log/<서비스>/ /app/logs/
설정 파일 이름 <서비스>.yml config.yml
포트 대역 9000~9099 8080
사용자 앱 전용 계정 root
타임존 UTC 저장 KST 저장
로그 경로 부터 타임존 까지 다섯 항목이 전부 달랐다.
전부 옛 서버가 만들어질 당시의 방식이었다. 그 뒤에 규약이 정해졌는데 옛 서버는 그대로 두고 있었던 것이다.
복사가 잘못된 것이 아니라 옛 서버가 규약을 안 따르고 있었다. rsync 는 그 상태를 충실하게 옮겼을 뿐이다.
제약 — 복제되는 어긋남
옛 서버를 규약대로 바꾸는 것은 서비스가 붙어 있어 위험해서 미뤄 두고 있었다.
옛 서버 1대 안 맞음
새 서버 1대 안 맞음 (복사해서)
한 대일 때는 예외 하나였는데 rsync 한 번에 두 대가 됐다.
미뤄 둔 것이 그대로 있는 동안 그것을 기준으로 새 서버가 만들어진다. 안 맞는 서버가 이런 식으로 늘어난다.
고치기 어려워서 미룬 것이 복사를 통해 고칠 것을 더 만드는 셈이다.
조치 — 새로 만들 때 맞췄다
새 서버는 아직 아무도 안 쓰므로 지금 맞추는 것이 가장 쌌다.
# /etc/app/order.yml
log_path: /var/log/order/
port: 9012
user: app
timezone: UTC
order.yml 을 옛 것을 참고하되 값을 하나씩 확인하며 새로 썼다.
시간은 더 걸렸다. 대신 무엇이 왜 그 값인지 알고 넣었고 나중에 물었을 때 답할 수 있게 됐다.
같은 작업인데 언제 하느냐에 따라 드는 값이 크게 다르다. 나중에 맞추자고 미루면 그 서버에도 서비스가 붙어 옛 서버와 같은 처지가 된다.
주의 — 딸려 오는 것들
무엇이 함께 넘어왔는지도 봤다.
$ rsync -a old:/etc/app/ /tmp/check/
$ ls -la /tmp/check/
-rw------- 1 root root ... db_password.txt
-rw-r--r-- 1 root root ... config.yml.bak-20161104
-rw-r--r-- 1 root root ... config.yml.old
drwxr-xr-x 2 root root ... backup/
config.yml.bak-20161104 와 db_password.txt 가 딸려 왔다.
$ grep -rn "password" /tmp/check/ | wc -l
7
password 가 일곱 곳에 있었고 그중 넷은 이미 안 쓰는 값이었다.
안 쓰는 값이라도 유효한 값일 수 있다. 통째로 복사하는 방식은 무엇이 넘어오는지 안 보는 방식이라 이런 것이 그대로 따라온다.
목록을 뽑아 하나씩 보면서 필요 없는 것을 지웠다. 지우기 전에 목록을 남긴 것은 무엇을 지웠는지 나중에 확인하기 위해서였다.
검증 — 심링크가 링크로 남는지
트리 안에 심링크도 있었다.
$ find /tmp/check -type l -exec ls -l {} \;
lrwxrwxrwx ... config.yml -> config.production.yml
옛 서버에서는 config.yml 이 config.production.yml 을 가리키고 있었다.
복사 수단에 따라 링크가 링크로 남기도 하고 가리키는 실체가 복사되기도 한다.
$ rsync -aL # 링크를 따라가 실체를 복사한다
-L 이 붙으면 링크가 아니라 파일이 되고 scp -r 도 링크를 따라간다.
실체로 바뀌면 새 서버에서 config.yml 을 다른 파일로 돌려도 설정이 안 바뀐다. 원래 상황에 따라 다른 파일을 가리키게 해 둔 것이 한쪽으로 고정돼 버린다.
그래서 옮긴 뒤에 find -type l 로 링크가 링크로 남았는지 세는 것을 절차에 넣었다. 옛 서버도 정리 목록에 올렸는데 목록에 없으면 영영 안 맞는 채로 남고 다음에 또 누가 복사해 간다.
정리
- 설정을 통째로 복사하면 그 서버가 안 맞고 있던 것까지 따라온다
- 복사가 잘못된 것이 아니라 원본이 규약 밖에 있었던 것이다
- 지금 규약과 항목별로 대조한다
- 미뤄 둔 어긋남이 복사를 통해 늘어난다
- 아무도 안 쓰는 새 서버가 가장 고치기 싸다
- 미루면 그 서버도 옛 서버와 같은 처지가 된다
- 값을 하나씩 확인하며 새로 쓰면 왜 그 값인지 알게 된다
- 안 쓰는 백업 파일과 옛 비밀번호까지 딸려 온다
- 통째로 복사하는 방식은 무엇이 넘어오는지 안 본다
- 옵션에 따라 심링크가 실체로 바뀐다
- 옮긴 뒤에 링크가 링크로 남았는지 센다
- 안 맞는 옛 서버를 목록에 올린다