-
-
웹 엔지니어가 알아야 할 인프라의 기본
바바 토시아키 지음, 김병국 옮김 / 한빛미디어 / 2015년 7월
평점 :
1) 웹 서비스에서 인프라의 역할
1. 웹 서비스 구축에 관련된 인프라 영역
요건 정의 -> 설계 -> 조달 -> 구축 -> 운용
인프라의 기술 계층 구조
7 : 애플리케이션 계층 (HTTP, FTP..)
4 : 전송 계층 (TCP, UDP)
3 : 네트워크 계층 (IP, ICMP)
2 : 데이터링크 계층 (Ethernet)
1 : 물리 계층 (RJ-45)
Infrastructure as a Service (IaaS) : 하드웨어, 네트워크, 코로케이션 (Amazon Web Services, Google Cloud Platform, Softlayer)
Platform as a Service (PaaS) : 애플리케이션 실행환경, 미들웨어, OS, 하드웨어, 네트워크, 코로케이션 (Heroku, Google App Engine, Engine Yard)
3. 인프라의 설계
3-1. 기능적 요건
- 네트워크 이중화, 4000 접속이 가능한 SSL 오프로딩 기능, VRRP(Virtual Router Redundancy Protocol)에 따라 Active-Standby 구성이 가능한 로드밸런서, 1Gbps 48포트, 10Gbps 2포트, L2 스위치, 동시접속 80,000 세션에 대응하고 접속 소스당 사용량 제한이 가능한 방화벽, 로드밸런서 하위 웹서버 4대, 내부 네트워크는 외부 통신용과 서버 간의 통신용으로 분할
3-2. 비기능적 요건
- 가용성 (가동율, 목표 복구 시간, 재해 대책), 성능/확장성 (성능 목표, 확장성), 운용/유지보수성 (운용 시간, 백업, 운용 감시, 정기 보수), 이행성 (이행 방식의 규정, 이행 스케쥴, 설비/데이터), 보안(가이드라인, 네트워크 레벨 제어, DoS공격 대책, 정보 유츌 대책, 사고 발생 시의 대응), 시스템 환경/생태 환경 (적합 규격, 기기 설치 규격, 환경 관리)
RAS : Reliability(신뢰성), Availability(가용성), Serviceability(유지보수성) - ISO/IEC27002
RASIS : RAS + Integrity(무결성), Security(안전성)
CIA : Confidentiality(기밀성), Integrity(무결성), Availability(가용성)
4. RAS 검토
가동률 = MTBF / (MTBF + MTTR)
MTBF = 누적 사용 시간 / 고장 횟수 (장애 발생 간격, Mean Time Between Failures)
MTTR = 누적 수리 시간 / 고장 횟수 (평균 복구 시간, Mean Time To Repair)
연간으로 환산한 초 수와 가동률로부터 정지 시간을 산출
86,400초(24시간) X 365일 X 0.01% (가동률 99,99%) = 3153.6초
MTTR이 4분인 경우 (MTBF 28일)
99.99% = 60 X 24 X MTBF / (60 X 24 X MTBF + 4)
MTTR이 18인 경우 (MTBF 125일)
99.99% = 60 X 24 X MTBF / (60 X 24 X MTBF + 18)
가동률을 높이는 방법
요소 각각의 가동률을 높인다 (서버용 부품 사용, 부품을 이중화, 요소 각가의 가동률 확인)
요소를 조합해 전체의 가동률을 높인다 (다중화 기술을 이용하여 가동률 높임)
적절한 프로비저닝으로 부하 문제를 피한다 (스케일업(서버 성능을 높이는 것), 스케일아웃(서버 수 늘리는 것))
다중화 구성 요소
Active-Active
Active-Standby (Hot Standby (즉시), Warm Standby (나름 준비 필요), Cold Standby (정지))
문서 작성 도구
Sphinx : sphinx-doc.org
Blockdiag : blockdiag.com
Cacoo : cacoo.com
5) 웹 서비스 운용
1 : 시스템 감시의 기본
2 . 시스템 감시의 구현
감시툴
- Nagios : 감시 기능에 특화
- Zabbix : 감시 기능 외에 그래프화 기능도 있음
모니터링툴
- Cacti : 사용자 관리 기능이 있음. 풀형 데이터 수집
- Nackerel : SaaS형 서비스 감시도 가능
- Monit : 간단함. 사용자 관리 기능 없음. 풀형 데이터 수집
- GrowthForecast : 간단함. 사용자 관리 기능 없음. 푸시형 데이터 수집
시스템 감시 (Nagios: NRPE, Zabbix: Zabbix Agent)
- 외형 감시
- 내부 감시 - 서비스 가동 상황 감시(액티브 체크, 패시스 체크(SNMP Trap)), 시스템 리소스 감시
감시 항목을 결정하기 위한 현재 상태 확인 방법
- 방화벽 설정 확인
iptable -nv -L
ss -lnp
ip6table -nv -L
- 프로세스 확인
ps aufx | grep -w 1380 | grep -v grep
yum whatprovides /usr/libexec/postfix/master
현재 상태 확인 결과로부터 감시 항목 만들기
a. 실행 프로세스 수를 확인
- I/O 확인 : 서비스/관리 네트워크 입출력, 서비스/관리 파일 입출력
b. 외형 감시의 주요 항목
- HTTP 응답 코드, 내용, 응답시간, 크기
- HTTPS 응답 코드, 내용, 응답시간, 크기
- POP, SMTP, FTP.. 동작여부, 메일 송수신, 파일 PUT/GET 등
- HTTP 시나리오
c. 내부 감시의 주요 항목
- CPU 사용률, 평균 부하, 디스크별 사용률, 디스크별 I/O 요구량, 디스크별 대기 시간, 네트워크 인터페이스별 트레픽 IN/OUT, 로컬에서의 HTTP 접속, 서비스에 사용할 프로세스의 감시, 시스템적으로 사용할 프로세스의 감시
3. 장애가 발생했을 경우의 대응 방법
a. 경보
b. 현상 확인
c. 1차 대응
lssh 파일명
#!/bin/bash
NOW=$(date +%Y%m%d_%H%M%S)
exec script -q -C "ssh $1" $1.$NOW.log
chmod a+x lssh
./lssh localhsot
export PS1="\D{%Y/%m/%d %H:%M:%S} $PS1"
export HISTTIMEFORMAT='%Y-%m-%d %T'
상황 확인용 명령어 일람
w
ss -lnp
ps aufx
df -h
top -b -d 1 -n 1
top -b -d 1 -n 1 -a
dstat -taf 1 10
mysqladmin processlist -verbose
로그 확인툴
fluentd
d. 경보 현상 및 다른 항목 확인하기
e. 사후 작업
f. 수습
6) 웹 서비스 운용 2
6.4. 실시간 모니터링 방법
- 툴 : dstat, top, iostat (yum install dstat, yum install sysstat)
dstat
- option : -t (일시), -l (평균부하), -m (메모리), -a (cpu, disk, network, paging, system), -f (디바이스별 표시), --output (csv), 1 (1초마다)
- dstat -tlaf --output stat.csv 1 3600
iostat
- option : -t (일시), -x (확장 상태), -n (NFS상태), 1 (1초마다)
- iostat -txn 1
6.5 트러블 대응에 사용하는 모니터링 툴
- tcpdump : 네트웍크 상태 파악 ( tcpdump -i eth0 -n port 80, tcpdump -i lo -n port 3306 )
- strace, lsof : 프로세스 동작 확인 ( ps aufx | grep http[d] | head -3, strace-f -p 5377, lsof -p 5377 ) : 설치 ( yum install strace, yum install lsof )
7) 웹 서비스 튜닝 1 : 보틀넥을 찾는 방법
7.4 보틀넥을 찾는 방법 - 로그
- Apache에서 보틀넥 찾기
httpd.conf : LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D"combined (%D로 총 소요시간)
- MySQL에서 보틀넥 찾기
slow-query-log=NO
slow-query-log-file=mysqld-slow.log
long-query-time=10
(show global variables like 'long_query_time'; set global long_query_time=1; show global variables like 'long_query_time';)
- mysqldumpslow ( mysqldumpslow -t 3 -s t mysqld-slow.log )
-s ORDER :al (평균 lock시간), ar (평균 송신 행의 수), at (평균 SQL 실행 시간), c (SQL 실행 횟수), l (lock 시간), r (송신 행의 수), t ( SQL 실행 시간)
-h HOSTNAME : 조사 대상의 호스트 이름을 지정
-t NUM : 정렬한 결과의 상위에서 NUM 갯수만큼 표시
7.6 보틀넥을 찾는 방법 - 애플리케이션 코드
- XDebug : 애플리케이션 프로파일러 툴 ( sudo yum install php-pecl-xdebug, php.ini ([xdebug] xdebug.profiler_enable=1 )
- KCachegrind, webgrind
ls /tmp/cachegrind.out.*
8) 웹 서비스 튜닝 2 : 튜닝 레시피
8.1 포인트별 튜닝 레시피
- 요청 횟수와 데이터 전송량을 줄이는 방법
a) 요청횟수 줄이는 방법
- 파일 결합 : CSS와 JavaScript의 파일 결합
- CSS Sprite : 이미지를 하나로 집약
- 패턴 이미지는 CSS로 구현
- HTTP KeepAlive 유효화
b) 데이터 전송량 줄이는 방법
- CSS나 JavaScript를 minify
- 이미지 압축률을 높인다
- 이미지 크기를 작게 한다
- 데이터를 압축하여 전송
- 정적 파일을 브라우저에서 캐시
- CDN 사용
Grunt 설치 및 활용
- package.json
{
"name": "myproject",
"version": "0.0.1"
}
- 필요 라이브러리 설치
yum install npm ImageMagick GraphicsMagick cairo-devel libjpeg-turbo-devel
npm install grunt<cli grunt-contrib-concat grunt-contrib-uglify grunt-contrib-cssmin grunt-spritesmith --save-dev
- Gruntfile.js
module.exports = function(grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
cssmin: {
compress: {
files: {
'dest/min.css': ['css/*.css']
}
}
},
concat: {
files: {
src: 'js/*.js',
dest: 'tmp/all.js'
}
},
uglify: {
dest: {
files: {
'dest/min.js': 'tmp/all.js'
}
}
},
sprite: {
all: {
src: 'img/*.png',
destImg: 'dest/sprite.png',
destCSS: 'dest/sprite.css'
}
}
});
grunt.loadNpmTasks('grunt-contrib-cssmin');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-spritesmith');
grunt.registerTask('default', ['sprite', 'cssmin', 'concat', 'uglify']);
};
- node-modules/.bin/grunt (실행)
OS의 CPU 사용률 낮추기
lowait 낮추기
- iotop로 I/O 체크 ( yum install iotop, iotop -P )
- ps로 status D 프로세스 확인
OS의 네트워크 사용량 낮추기 (백업)
rsync -az /data/backup/ remote.example.com:/data/backup/web/
tar zcfp - -C /data/backup . | ssh remote.example.com "cat - | tar zxf - -C /data/backup/web"
tar cfp - -C /data/backup -I pigz . | ssh remote.example.com "cat - | tar xf - -C /data/backup/web -I pigz"
Apache의 CPU 사용률 낮추기
pgrep -P 'cat /var/run/httpd/httpd.pid' | while read
echo 'ulimit -n 65535' | tee -a /etc/sysconfig/httpd
Apache의 메모리 사용량 낮추기
cow.py
#!/usr/bin/env python
import sys
import re
for pid in sys.argv[1:]:
mem = {'Rss:': 0, 'Shared_Clean:': 0, 'Shared_Dirty:': 0}
for line in open('/proc/%s/smaps' % pid, 'r'):
line = line.rstrip('\n')
parts = re.split('\s+', line)
for k, v in mem.iteritems():
if k in parts:
val = int(parts[1])
if parts[2] == 'kB':
val = val * 1000
elif parts[2] == 'mB':
val = val * 1000000
mem[k] = v + val
shared_ratio = (mem['Shared_Clean:'] + mem['Shared_Dirty:']) * 100.0 / mem['Rss:']
print 'PID %s shared %.2f%%' % (pid, shared_ratio)
ps aufx | grep http[d]
./cow.py 'pgrep -U apache'
Apache의 디스크 I/O 사용량 낮추기
httpd.conf (이미지와 같은 정적 파일 로그 출력하지 않도록 수정)
SetEnvIfNoCase Request_URI "\.(gif|jpeg|jpg|png|js|css|swf|ico)$"
nolog
CustomLog logs/access_log combined env=!nolog
BufferedLogs On (주의 필요)
애플리케이션 서버의 CPU 사용률 낮추기
Gargbage collector 조정
바이트코드 캐시 이용 (5.4 이전 : apc (Alternative PHP Cache), 5.5 이후 : OPCache)
yum install php-pecl-apc
php -i | grep apc.enabled
8.2 SQL 튜닝에서의 고속화
SQL 튜닝 툴
EXPLAIN, PROFILING
EXPLAIN : SQL 앞에 EXPLAIN을 붙여 실행 계획 확인
- possible_keys, key로 인덱스 확인
- rows 행수 검사는 낮아야 한다
- Extra항목에 Using filesort가 없어야 한다
PROFILING
SET PROFILING=1;
SQL 실행
SHOW PROFILES;
SHOW PROFILE FOR QUERY 1;
8.4 [DB] 스케일 아웃 구현의 예
HAProxy, Keepalived (LVS)