Skip to content

Commit 7f8019a

Browse files
committed
2주차
1 parent c2d1f94 commit 7f8019a

3 files changed

Lines changed: 170 additions & 0 deletions

File tree

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
리눅스와 상호작용하는 방법: 1) 쉘에서 수동으로 명령어 입력 2) 스크립트를 사용한 자동화
2+
터미널
3+
- 텍스트로 된 UI를 제공하는 프로그램
4+
- 커서, 화면 처리, 잠재적 색상 지원이 가능하도록 이스케이스 시퀀스 혹은 이스케이프 코드를 지원
5+
6+
셸: 스트림을 통해 입력, 출력을 처리, 변수 지원, 사용 가능한 내장 명령이 몇 가지고 있고, 명령 실행 및 상태를 처리하고, 일반적으로 대화식 사용과 스크립트를 모두 지원
7+
8+
스트림
9+
- 셸은 입력과 출력을 위한 stdin, stdout, stderr FD를 모든 프로세스에 제공
10+
- FD는 화면과 키보드에 각각 연결되어 있음. 특별한 재지정이 없으면 셸에 입력하는 명령은 키보드에서 입력(stdin)을 가져오고, 출력(stdout)을 화면에 전달
11+
- `>` 나 `<` 를 통해서 프로세스의 출력 스트림을 재지정 가능
12+
13+
변수
14+
- 환경변수와 셸 변수
15+
- `export`로 환경변수 만들기 / `set`으로 변수 만들기
16+
17+
종료상태
18+
- 명령 실행 완료를 명령 호출자에게 알림
19+
- 리눅스 명령은 종료될 때 상태를 반환 - 0이면 정상 종료, 1이면 비정상 종료
20+
21+
모던 리눅스 명령어
22+
- https://github.com/ibraheemdev/modern-unix
23+
- 꽤 쓸만한 명령어들이 많이 보임
24+
25+
인간친화적인 셸
26+
- 피시셸, z셸 등등
27+
28+
터미널 멀티플렉서
29+
- 여러 개의 창으로 터미널을 오버레이 하는 방법(터미널 I/O를 다중화)
30+
- 창이 여러 개 필요 / 터미널을 닫거나 원격 접속 끝내도 계속 사용 / 모든 세션을 보거나 탐색, 필요시 확대 축소
31+
- screen, tmux 등을 사용
32+
33+
스크립팅
34+
- 이식 가능한 배시 스크립트
35+
- 실행될 환경에 암시적이든 명시적이든 너무 많은 가정을 하지 않는다는 것
36+
- 다양한 시스템(셸, 리눅스 배포판 등)에서 실행 가능
37+
- 물론 같은 셸이라고 하더라도 버전에 따라서 모든 기능이 동일한 방식으로 동작하지 않을 수 있음
38+
- 우수 사례
39+
- 빠르고 요란하게 실패해야 함. 에러 처리도 유의
40+
- 민감 정보 유출 조심, 하드코드 금지
41+
- 입력값 정리
42+
- 의존성 확인
43+
- 문서화, 버전 관리, 테스트
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
# 13장: 콘텐츠 배포 네트워크 설계하기
2+
## CDN의 장단점
3+
- 장점:
4+
- 낮은 지연 시간
5+
- 확장성: 서드파티를 사용하면 자사 시스템을 확장하지 않아도 됨
6+
- 낮은 단위 비용: 더 많은 트래픽일수록 CDN에서 대량 할인
7+
- 높은 처리량 / 높은 가용성
8+
- 단점:
9+
- 추가적인 DNS 조회 / 추가적인 실패 지점
10+
- 트래픽이 적은 경우 높은 단위 비용
11+
- CDN 마이그레이션
12+
- 특정 지역에 새로운 CDN으로
13+
- 회사 망함
14+
- CDN이 SLA를 제대로 이행하지 않아서
15+
- 보안과 프라이버시 우려, JS 라이브러리에 악성 코드를 삽입할 수 있음
16+
- 일부 국가나 조직에서 특정 CDN의 IP를 차단할 수 있음
17+
18+
## CDN 인증과 권한 부여 단계
19+
- CDN은 각 사용 업체에게 비밀 키를 발급하고, 이 비밀 키로 접근 토큰을 생성할 수 있는 SDK나 라이브러리를 제공
20+
21+
```mermaid
22+
sequenceDiagram
23+
actor User as 사용자
24+
participant Client as 클라이언트
25+
participant Service as 우리 서비스
26+
participant SDK as CDN SDK/라이브러리
27+
participant Store as 토큰 저장소
28+
participant CDN as CDN
29+
30+
User->>Client: 인증 요청
31+
Client->>Service: 로그인/인증 요청
32+
Service->>SDK: 접근 토큰 생성 요청<br/>비밀 키, CDN URL, 만료 기한,<br/>Referrer, 허용 IP, 허용 국가/지역
33+
SDK-->>Service: CDN 접근 토큰
34+
Service->>Store: 토큰 저장<br/>필요하면 암호화 후 저장
35+
Service-->>Client: 접근 토큰 반환
36+
37+
Client->>Service: CDN 자산 URL 요청
38+
Service->>Service: 접근 토큰으로 CDN URL 서명
39+
Service-->>Client: 서명된 CDN URL
40+
Client->>CDN: GET 서명된 URL<br/>Referrer 헤더 포함
41+
CDN->>CDN: 토큰, 만료 기한, Referrer,<br/>IP, 국가/지역 정책 검증
42+
alt 접근 허용
43+
CDN-->>Client: CDN 자산 반환
44+
else 접근 거부
45+
CDN-->>Client: 403 Forbidden
46+
end
47+
```
48+
49+
- 토큰 삭제는 비동기적으로 처리할 수 있고, 로그아웃이 자주 일어나는 이벤트가 아니므로 동기적으로 처리할 수도 있음
50+
- 비동기 삭제를 사용하면 CDN 업체에 일시적인 문제가 생겼을 때 토큰이 삭제되지 않을 수 있음
51+
52+
```mermaid
53+
sequenceDiagram
54+
actor User as 사용자
55+
participant Client as 클라이언트
56+
participant Service as 우리 서비스
57+
participant Store as 토큰 저장소
58+
participant Queue as 이벤트 큐
59+
participant Worker as 토큰 삭제 워커
60+
participant CDN as CDN
61+
62+
User->>Client: 로그아웃
63+
Client->>Service: 로그아웃 요청
64+
Service->>Store: 로컬 토큰 삭제/무효화
65+
66+
alt 비동기 삭제
67+
Service->>Queue: CDN 토큰 삭제 이벤트 발행
68+
Service-->>Client: 로그아웃 완료
69+
Queue-->>Worker: 삭제 이벤트 전달
70+
Worker->>CDN: 토큰 삭제 요청
71+
alt CDN 삭제 성공
72+
CDN-->>Worker: 삭제 완료
73+
else CDN 일시 장애
74+
CDN-->>Worker: 실패
75+
Worker->>Queue: 재시도 예약
76+
end
77+
else 동기식 차단 삭제
78+
Service->>CDN: 토큰 삭제 요청
79+
alt CDN 삭제 성공
80+
CDN-->>Service: 삭제 완료
81+
Service-->>Client: 로그아웃 완료
82+
else CDN 일시 장애
83+
CDN-->>Service: 실패
84+
Service-->>Client: 로그아웃 실패 또는 지연 응답
85+
end
86+
else 실패 케이스 허용
87+
Service-->>Client: 로그아웃 완료
88+
Note over Service,CDN: CDN 토큰은 만료 기한까지 일시적으로 유효할 수 있음
89+
end
90+
```
91+
92+
키교체
93+
- 고객의 키를 주기적으로 교체
94+
- 모든 시스템에 전파되는 데 시간이 걸리므로 일정시간 이전 키와 새 키 모두 사용 가능
95+
96+
## 상위 수준의 아키텍처
97+
### 저장소 서비스
98+
- 대용량 파일 저장이라 DB를 사용 X 파일은 호스트의 파일 시스템에 저장
99+
- 가용성, 내구성을 위해 복제가 필요
100+
- 각 파일을 여러 호스트에 할당해야 함
101+
- 가용성 모니터링과 메타데이터 서비스를 업데이트하고 대체 노드를 프로비저닝하는 장애 조치 프로세스 필요
102+
103+
클러스터 내부: (주키퍼를 클러스터 내부 관리자로 포함하는) HDFS 같은 분산 파일 시스템
104+
- 주키퍼가 리더 선출 관리, 파일, 리더, 팔로워 간의 매핑 유지
105+
106+
클러스터 외부: (외부 관리자가 관리하는 경우)
107+
- 각 클러스터는 여러 데이터 센터에 분산된 3개 이상의 노드로 구성
108+
- 파일을 읽거나 쓰려면 메타데이터 서비스가 파일이 저장되어 있거나 저장되어야 할 클러스터를 식별한 다음 클러스터에서 무작위로 선택한 노드에서 파일을 읽거나 씀
109+
- 이 노드는 클러스터 내의 다른 노드로의 복제를 담당
110+
- 리더 선출은 필요없으나 파일을 클러스터에 매핑하는 것은 필요
111+
- 클러스터 외부 관리자는 파일과 클러스터의 매핑을 유지
112+
113+
### 일반적인 작업
114+
CDN 도메인에 질의하면 GeoDNS가 가장 가까운 호스트의 IP 주소 할당 후 LB가 API Gateway 호스트로 요청 보냄(API Gateway는 캐싱 등 여러 작업 수행 가능)
115+
- 읽기:
116+
- 처리할 저장소 호스트 선택해야 함
117+
- 메타데이터 서비스는 아래 과정 지원
118+
- 파일을 포함하는 저장소 서비스 호스트, 데이터 센터 정보
119+
- 호스트의 현재 부하 측정. 이는 제공 중인 파일 크기 합으로 비슷하게 산정할 수 있다
120+
- 파일 다운로드하는 데 걸리는 시간을 예측, 동일한 이름을 가진 파일들을 구분(MD5, SHA 해시 등 사용)
121+
- 파일 소유권, 접근 제어
122+
- 호스트의 상태
123+
- 다운로드 과정
124+
- 1. 속도 제한 서비스로 요청이 제한 초과하는지 검사
125+
- 2. 메타데이터 서비스에 쿼리해 이 자산을 포함하는 저장소 서비스 호스트를 가져옴
126+
- 3. 저장소 호스트를 선택, 자산을 클라로 스트리밍
127+
- 4. 호스트 부하 증가로 메타데이터 서비스 업데이트(메타데이터 서비스가 자산의 크기를 기록하고 있다면 3단계와 병렬 수행 가능. 아니면 API Gateway가 자산의 크기를 측정해 정확한 부하 증가를 메타데이터 서비스로 업데이트해야 함)
46.7 KB
Loading

0 commit comments

Comments
 (0)