목차
작업큐(Job-Queue) 시스템
작업큐 시스템의 필요성
웹 서비스에는 기본적으로 요청이 동기적으로 실행된다.
따라서, 계속 성장해가는 웹 서비스에서는 데이터가 누적되면서 데이터를 추가하고 갱신하는 처리가 점점 무거워진다.
이 때문에, 양호했던 성능도 시간이 지남에 따라 악화되고 서비스 사용자 경험에 영향을 주게 된다.
→ 작업큐 시스템을 이용하여 나중으로 미루어도 되는 작업을 비동기로 실행 가능
→ 사용자 경험개선 가능
(하테나 경우)
사용자가 URL을 북마크했을 때의 처리를 작업큐 시스템에서 처리
작업큐 시스템 입문
가장 간단하게 비동기화하는 방법
- 비동기화하고자 하는 처리를 독립된 스크립트로 해서 해당 스크립트를 애플리케이션 내부에서 호출하는 방법
- 단점
- 스크립트 시작과 초기화의 오버헤드가 크다.
- 대량의 비동기 처리를 실행시키려 하면 그 수만큼의 프로세스를 실행해야 한다.
- 프로토타입이나 소규모 애플리케이션에만 적용하는 것을 추천
- 단점
많은 양의 비동기 처리를 안정적으로 하는 방법
- 작업큐(job-queue)와 워커(worker)를 세트로 한 작업큐 시스템을 사용
- 작업큐에 실행하고자하는 처리를 등록 ▶ 워커가 큐에서 작업을 추출하여 처리
클라이언트 ( 웹 애플리케이셔) - 작업을 투입. 작업을 투입한 다음 처리를 계속 진행할 수 있다.
작업큐 - 작업을 쌓는다.
워커 - 작업큐를 참조, 미실행된 작업을 추출해서 작업을 실행
하테나에서의 작업큐 시스템
Perl로 구현된 시스템
TheSchwartz - 작업큐
- MySQL과 같은 RDBMS를 사용하는 작업큐 시스템
- 비동기로만 가능
Gearman - TheSchwartz 보다 가벼운 작업큐
- RDBMS 가 아닌 독자적인 데몬을 사용해서 작업의 정보를 메모리에 저장
- 동기적으로 순번대로 처리
- 동기적으로 병렬로 처리
- 비동기적으로 백드라운드로 처리
WorkerManager에 의한 워커 관리
- 워커 프로세스를 좀더 세세하게 제어하기 위한 시스템 (하테나에서 개발)
- TheSchwartz 와 Gearman을 래핑해서 최소한의 변경으로 양쪽에 대응
- 설정파일로 워커 클래스 정의. 설정파일만 수정해서 워커로서 사용할 클래스를 변경 가능
- 워커 프로세스의 라이프사이클 관리. 프로세스 관리. 데몬화 수행
- 워커 프로세스의 프로세스 개수 관리. 프로세스 개수를 관리하고 병행처리가 가능한 작업수를 제어
- 로그 출력. 작업을 처리한 타임스탬프 등을 로그에 기록
로그분석
처리시간과 지연시간을 측정함으로써 투입된 작업 종류와 양에 대해 워커의 처리능력이 충분한지여부 확인 가능하다.
(예) 지연시간이 길어지는 경우 ▶ 아무리 비동기 처리라고 하더라도 사용자 경험상 문제가 되는 경우 발생
→ 이 경우 워커의 튜닝과 보강을 생각해야 할 시점
스토리지 선택
웹 애플리케이션에 있어서 "증가하는 데이터를 어떻게 저장할까?" 라는 문제는 영원한 과제다.
웹 애플리케이션과 스토리지
스토리지?
애플리케이션 데이터를 영속적으로 혹은 일시적으로 저장하기 위한 기능
원본데이터
애플리케이션에 업로드된 사진, 블로그 본문과 같이 영속적으로 저장되어야 하는 데이터
가장 중요해서 서비스의 근본적인 신뢰성과 관계있다 → 비용을 들여서라도 최상급 신뢰성 확보
캐시
액세스 랭킹이나 검색용 인덱스 데이터와 같이 재생성 가능한 가공데이터
신뢰서은 그다지 중요하지 않음 → 비용을 줄일 필요 있음
애플리케이션에 필요한 데이터의 예
필요한 신뢰성 | 크기 | 갱신빈도 | 종류 | |
블로그 본문 | 고 | 소 | 저 | 원본 데이터 |
디지털카메라 사진 | 고 | 대 | 저 | 원본 데이터 |
검색용 인덱스 | 중 | 중 | 고 | 가공 데이터 |
HTML 처리 후 본문 | 조 | 소 | 저 | 캐시 |
적절한 스토리지 선택의 어려움
적절한(저장하고자 하는 데이터의 특성에 맞는) 스토리지 선택의 중요성
- 비용과 성능, 안정성의 균형을 높은 차원으로 달성하기 위한 열쇠
- 스토리지를 잘못 선택한 채로 서비스를 시작하게 되면 나중에 알아차리더라도 스토리 변경은 보통 방법으로는 뜻대로 이룰 수 없다.
- 가능한 한 특성에 맞는 스토리지를 선택하여 하나의 스토리지를 오래도록 사용하는 것이 바람직하다.
하지만, 서비스 성장을 예측하는 것은 어려우며 기술도 진화해가므로 스토리지 설계를 전혀 갱신하지 않고 가는 것은 어렵다.
스토리지 선택의 전제가 되는 조건
애플리케이션에서의 액세스 패턴을 이해하기 위한 지표
- 평균크기
- 최대크기
- 신규추가 빈도
- 갱신빈도
- 삭제빈도
- 참조빈도
추가) 크기에 요구되는 신뢰성, 허용할 수 있는 장애 레벨, 사용할 수 있는 하드웨어나 쓸 수 있는 예산 도 중요한 포인트
RDBMS
RDBMS(Realtional Database Management System)
- 표 형식으로 데이터를 저장하고 대부분은 SQL 언어로 데이터 조작을 수행하는 시스템
- 다양한 데이터를 저장한다거나 강력한 질의를 할 수 있어서 범용성이 높은 스토리지
MySQL
- 특징: SQL을 해석해서 실행하는 기능 블록과 실제로 데이터를 보관하는 기능 블록이 분리되어 있음
스토리지 엔진
MyISAM
- 1 개의 테이블이 실제 파일 시스템 상에 3개의 파일(정의, 인덱스, 데이터)로 표현
- 장점
- 시작과 정지가 빠름
- 테이블 이동이나 이름변경을 직접 가능
- 단점
- DB 프로세스가 비정상 종료하면 테이블이 파손될 가능성 높음
- 트랜잭션 기능이 없음
- update, delete, insert가 테이블 락으로 되어 있어 갱신이 많은 용도로는 성능적으로 불리
InnoDB
- 스토리지 엔진 전체에서 사전에 정의한 소수의 파일에 데이터를 저장.
- 장점
- 트랙잭션 지원
- 비정상 종료시 복구기능 존재
- 데이터 갯인이 로우 락(Row Lock)으로 되어 있음
- 단점
- 데이터량에 따라 시작, 정지가 수 분 정도 걸린다.
- 테이블 조작을 모두 DB를 경유해서 수행해야 한다.
정리
- 추가처리만 한다 → MyISAM가 적합한 스토리지 엔진
- 갱신빈도가 높고 트랜잭션이 필요하다 → InnoDB가 적합한 스토리지지 엔진
분산 key-value 스토어
- key-value 스토어 : key와 value 쌍을 저장하기 위한 심플한 스토리지
- 분산 key-value 스토어 : key-value 스토어에 네트워크를 지원함으로써 다수의 서버로 확장시키는 기능을 지닌 스토리지
memcached (key-value 스토어)
- 메모리 상에서 동작
- 서버 증감의 영향을 받지 않음
- 분산 알고리즘을 클라이언트 라이브러리로 구현
- 원본 데이터 및 가공 데이터 저장에는 부적합
- RDBMS 등에서 읽어들인 데이터를 일시적으로 저장해 두어 참조하는 용으로 적합
→ memcached 의 특성을 가장 잘 활용할 수 있는 데이터는 캐시 데이터
→ 캐시로 한정할 경우 서버에는 메모리만 충분히 탑재해두면 된다.
TokyoTyrant (key-value 스토어)
- 로컬에서 동작하는 key-value 스토어인 TokyoCabinet에 네트워크를 지원하도록한 구현
- 다중성을 높이기 위한 레플리케이션 기능을 내장
- 성능면에서는 디스크 액세스가 발생하여 memcached 보다는 약간 떨어진다. 하지만 RDBMS 와 비교하면 상당히 빠름
분산 파일시스템
어느 정도 이상인 크기의 데이터를 저장하는데 적합
작은 데이터가 대량으로 존재하는 용도에는 부적합?
MogileFS
용도
- 비교적 작은 대량의 파일을 다룰 목적으로 Perl로 구현된 분산 파일시스템 (수KB ~ 수십MB의 이미지 파일)
- 이미지 파일과 같이 추가된 다음 갱신되지 않고 참조하기만 하는 용도에 적합(업로드 이미지 파일을 접수받는 웹 앱)
특징
- 스토리 서버 상에서 개개의 파일은 실제 파일 시스템 상에서도 하나의 파일로 저장
- 통상 하나의 파일은 3중으로 다중화되어 일부 스토리지 서버가 고장나서 데이터가 손실되더라도 시스템 전체로서는 계속 정상적으로 동작할 수 있도록 설계되어 있다.
- 파일을 참조할 때 WebDAV 프로토콜로 얻게되므로, 애플리케이션 측에 구현 필요
- 미디어 위주의 서비스에서 수십TB 영역이 필요한 미디어 파일을 위한 스토리지로서 충분히 대응할 수 있는 확장성
- 파일 저장소와 파일을 특정 짓기 위한 키와 대응관계는 메타데이터로 RDBMS에 저장
*WebDAV 서버: HTTP를 기반으로한 프로토콜로 애플리케이션 계층에서 구현되는 경우가 많아서 NFS(커널계층에 구현) 보다 안정적인 시스템을 구축 가능
그 밖의 스토리지
NFS 계열 분산 파일시스템
- NFS 는 특정 서버의 파일시스템을 다른 서버에서 마운트해서 해당 서버의 로컬 파일시스템과 마찬가지로 조작할 수 있도록 하는 기술.
DRBD(Distributed Replicated Block Device)
- 네트워크 계층에서 RAID라고 할 수 있는 기술, 블록 디바이스 레벨에서 분산, 다중화 할 수 있는 기술
HDFS(Hadoop Distributed file system)
- Hadoop 용으로 설계된 분산 파일시스템
스토리지의 선택전략
캐시 시스템
웹 애플리케이션의 부하가 서서히 증가해서 시스템 용량이 부족한 경우
- AP 서버 증설
- DB 서버 증설
- HTTP 레벨의 캐싱을 수행하는 HTTP 가속기를 사용( 낮은 비용 으로 효과가 높은 대책)
HTTP 가속기
- 포워드 프록시 - 클라이언트가 외부 서버에 액세스할 때 그 사이에 두는 프록시
- 리버스 프록시 - 외부 클라이언트가 내부 서버에 액세스할 때 그 사이에 두는 프록시
- 프록시 : 요청에 대한 응답을 캐싱해두어 같은 요청이 전달됐을 때 캐싱해둔 응답을 반환
리버스 프록시 캐시 서버
구현 툴
- Squid
- nginx
- pound
- Varnish
계산 클러스터
대량으로 쌓인 로그 데이터의 처리(ex 120gb) ▶ HDD에서 읽어 들이는데만 5 시간 이상
→빠르게 수행하기 위해서 병렬처리가 가능한 계산 클러스터 필요
MapReduce의 계산모델
Hadoop 이라는 MapReduce의 오픈소스
MapReduce - 2004년 Google 에서 발표한 계산 모델
방식
- key 와 value 쌍의 리스트를 입력 데이터로 해서 최종적으로 value의 리스트를 출력
- map 단계와 reduce 단계로 구성
계산모델 사진
- Map 단계
- 먼저 마스터 노드에서 입력 데이터를 잘게 분할해서 각 노드로 분산
- 각 노드에서는 분할된 입력 데이터를 계산하고 계산결과를 key 와 value 쌍으로 구성된 중간 데이터로 출력
- Map 단계의 처리 예시 : (k1, v1) → list(k2, v2)
- Reduce 단계
- Map 단계에서의 출력 데이터를 key(k2) 별로 정리해서 key(k2)와 key에 대응하는 값의 리스트( list(v2) ) 로 재구성
- 각각의 key를 각 노드로 분산 ( shuffle phase)
- 각 노드에 있는 key(k2)와 key에 대응하는 값의 리스트( list(v2) )를 입력 데이터로 해서 각 리스트( list(v3) )를 최종적인 출력 데이터로 처리를 수행
- Reduce 단계의 처리 예시 : ( k2, list(v2) ) → ( k2, list(v3) )
- 최종
- 각 노드에서 값의 리스트 list(v3) 를 집약하면 계산이 완료
응용범위
- 로그 분석, 검색엔진의 인덱스 생성
MapReduce 계산모델
- Map과 Reduce라는 두가지 처리를 수행하는 함수를 준비하는 것만으로 대량의 데이터를 빠르게 처리 가능
- 대량의 입력 데이터를 읽어들이는 부분이 성능의 병목이 되는 경우 많다.
- 분산 파일시스템과 병용하는 것이 중요
- DVD 1 장 분량의 데이터에 대한 grep 을 2초 만에 끝낼 수 있는 성능을 구현 가능
- 분산 파일시스템과 병용하는 것이 중요
Hadoop
Hadoop은 Apache 프로젝트 중 하나로 MapRedue의 오픈소스 구현 중 하나(java 로 구현)
로그 분석 작업을 실행 할때 유용하다고 함.
예) 47GB의 데이터를 4303개의 Map 태스크로 분할해서 실행하고 1 개의 Reduce 태스크로 집약하여 처리 가능
'책 > 웹 개발자를 위한 대규모 서비스를 지탱하는 기술' 카테고리의 다른 글
[ 대규모 ] [책] 15장 웹 서비스와 네트워크 (1) | 2024.11.21 |
---|---|
[대규모][책] 14장 효율향상전략 - 하드웨어의 리소스 사용률 높이기 (0) | 2024.11.18 |
[ 대규모 ] [책] 13 장 다중성 확보, 시스템 안정화 (0) | 2024.11.16 |
[대규모서비스] [책] 12 장 확장성 확보에 필요한 사고방식 (2) | 2024.11.15 |
[ 대규모 서비스 ] [ 책 ] 11 장 대규모 데이터 처리를 지탱하는 서버/인프라 입문 (3) | 2024.11.02 |