728x90
반응형

SNI(Server Name Indication)란 서버명 지정이라는 뜻이다.

TLS 프로토콜 확장형이고 네트워크을 통하여 TCP 통신을 수행할 시에 SSL/TLS Handshake 과정을 거치는데 이때 Handshake 과정의 시작점에서 웹브라우저에게 호스트명(HTTP Header에 삽입)을 정해준다.

이 방식을 통하여 동일 서버에서 여러개의 SSL 통신이 가능하게 된다. (이 말은 곧 여러 웹 사이트의 SSL 통신이 하나의 443 포트로 가능해진다는 얘기이다.)

몇몇 브라우저 및 기기의 접속 제한이 있지만 이를 무시할 수 있을 경우 하나의 서버에서 여러 사이트의 SSL(HTTPS)를 단일 443 포트로 연결할 수 있다.

 

작동 방식

 

 

작동 방식은 아래와 같다.

  1. 웹 서버에 브라우저가 HTTPS 접속할시에 SSL/TLS 접속을 하게 되며 브라우저는 피싱사이트가 아닌 진짜 싸이트에 접속된것인지 여부를 알 수 있도록 서버에서 SSL 인증서를 가져오게 된다.

  2. 브라우저는 가져온 인증서를 가지고 접속하고자하는 도메인 주소와 인증서의 이름을 비교하게 되며 만일 이름이 일치하면 보안접속이 이루어지게 된다. (아닐 경우 경고 메시지를 불러온다.)

  3. 보통 하나의 서버에 여러개의 도메인을 서비스(상황에 따라 다름)하므로 IP만 가지고 이를 판단하게 되면 서버상의 하나의 도메인만 SSL 통신이 가능하게 되므로 SNI를 사용한다.

    (즉, 하나의 서버상에 여러 도메인을 서비스하는 경우 SNI가 있다면 SSL 통신이 가능해진다.)

 

 

모든 서버나 클라이언트가 다 지원을 하는 것이 아니고 구형 브라우저나 서버 프로그램은 지원하지 않는다.

SNI 필드에 대한 암호화는 TLS 1.3부터 지원한다.

 

 

참고

https://sarc.io/index.php/miscellaneous/1593-sni-server-name-indication

https://blog.naver.com/ncloud24/221255979858

https://brunch.co.kr/@sokoban/22

 

반응형

'Web' 카테고리의 다른 글

HAProxy & Keepalived  (1) 2020.01.29
HAProxy  (2) 2020.01.17
Keepalived & VRRP  (0) 2020.01.17
부하분산 테스트 설명 및 용어  (0) 2019.04.09
PinPoint  (0) 2019.04.09
728x90
반응형

HAProxy & Keepalived

 

HAProxy 이중화를 위해 Keepalived를 사용한 테스트이다. (Keepalived도 IPVS를 사용한 L4 Level의 LoadBalancing을 할 수 있다.)

 

 

 

 

설치

 

Test 환경

 

  • OS : Ubuntu 18.04

  • Node

    • VIP : 192.168.219.253

    • Master IP : 192.168.219.125

    • Slave IP : 192.168.219.126

    • Web01 : 192.168.219.128

    • Web02 : 192.168.219.129

  • HAProxy Version : 1.8.8

  • Keepalived Version : 1.3.9

 

 

HAProxy

 

# apt install -y haproxy

-> Ubuntu 18.04에서 기본 Repo로 설치시 1.8.8 버전이 설치된다.

 

현재 (2020-01) 2.1버전이 최신버전이며 1.5버전부터 SSL을 지원하기 때문에 기본설치방법으로도 SSL 사용이 가능하지만 최신 버전을 사용하고 싶다면 wget을 사용하여 다운로드 후 컴파일하거나 별도 Repo를 추가시켜준다.

 

# apt-add-repository ppa:vbernat/haproxy-2.1

# apt update

# apt install -y haproxy 또는 apt install -y haproxy=2.1

-> 위와 같은 방법으로 Repo 추가 후 설치하면 2.1.2 버전이 설치된다.

 

 

Keepalived

 

# apt install -y keepalived

 

 

 

설정

 

HAProxy (Master&Slave)

 

# vim /etc/haproxy/haproxy.cfg

global   

    log 127.0.0.1   local1 notice

    chroot /var/lib/haproxy

    stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners   

    stats timeout 30s   

    user haproxy    

    group haproxy  

    daemon  

    maxconn 4000

 

    ca-base /etc/ssl/certs

    crt-base /etc/ssl/private

 

    ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS

    ssl-default-bind-options no-sslv3

 

defaults

    log global

    mode    http

    option  httplog

    option  dontlognull

    option  forwardfor

    option  httpclose   

    timeout http-request 10s

    timeout http-keep-alive 10s

    timeout connect 10s

    timeout client  1m

    timeout server  1m

    timeout queue   1m

    errorfile 400 /etc/haproxy/errors/400.http

    errorfile 403 /etc/haproxy/errors/403.http

    errorfile 408 /etc/haproxy/errors/408.http

    errorfile 500 /etc/haproxy/errors/500.http

    errorfile 502 /etc/haproxy/errors/502.http

    errorfile 503 /etc/haproxy/errors/503.http

    errorfile 504 /etc/haproxy/errors/504.http

 

listen stats_page  

    bind    192.168.219.253:8080

    stats   enable

    stats   realm HAProxy Statistics

    stats   uri /  

    stats   auth admin:admin   

 

frontend haproxy    

    bind    192.168.219.253:80

    mode    http  

    default_backend server

 

backend server  

    mode    http      

    balance roundrobin

    cookie  SVID insert indirect nocache maxlife 10m  

    option  httpchk GET /  

    http-check expect status 200  

    server web01 192.168.219.128:80 cookie web01 check inter 2000 rise 2 fall 5  

    server web02 192.168.219.129:80 cookie web02 check inter 2000 rise 2 fall 5  

 

 

Keepalived

 

# vim /etc/keepalived/keepalived.conf (Master)

vrrp_instance VI_1 {

  state MASTER

  interface eth0

  virtual_router_id 51

  priority 200

  advert_int 1

  authentication {

    auth_type PASS

    auth_pass 7388

  }

  virtual_ipaddress {

    192.168.219.253

  }

}

 

# vim /etc/keepalived/keepalived.conf (Slave)

vrrp_instance VI_1 {

  state BACKUP

  interface eth0

  virtual_router_id 51

  priority 100

  advert_int 1

  authentication {

    auth_type PASS

    auth_pass 7388

  }

  virtual_ipaddress {

    192.168.219.253

  }

}

 

 

 

커널 파라미터 변경

 

Kernel Parameter Default List

 

net.ipv4.ip_forward = 1

  • Kernel이 패킷을 전달하게 하는 경우 사용한다.

  • Keepalived가 네트워크 패킷을 실제 서버에 정상적으로 전달하려면 각 라우터 노드가 커널에서 IP Forward를 설정해야한다.

 

net.ipv4.ip_nonlocal_bind = 1

  • HAProxy 및 Keepalived의 로드밸런싱은 동시에 로컬이 아닌 IP 주소에 바인딩할 수 있어야한다.

  • 즉, 네트워크 인터페이스에 없는 주소로 바인딩할 수 있도록 해주는 커널 값이다. (네트워크 인터페이스가 지정된 정적 IP가 아닌 동적 IP를  바인딩할 수 있다.)

  • 해당 옵션이 비활성화 되어 있어도 서비스가 시작하면서 인터페이스에 특정 IP를 바인딩할 수 있으나 FailOver시 문제 발생

 

 

참고 URL

 

 

HAProxy Kernel Parameter Best Practices

 

 

가장 중요한 Paramater

 

net.ipv4.ip_local_port_range = "1025 65534"

net.ipv4.tcp_max_syn_backlog = 100000

net.core.netdev_max_backlog = 100000

net.core.somaxconn = 65534

ipv4.tcp_rmem = "4096 16060 64060"

ipv4.tcp_wmem = "4096 16384 262144"

 

 

작업량에 따라 조절

 

tcp_slow_start_after_idle = 0

 

 

iptables tuning

 

net.netfilter.nf_conntrack_max = 131072

 

 

주의 사항

 

conntrack이 잘못 구성되면 HAProxy가 최대 성능을 발휘하지 못한다.

또한 iptables가 활성화 되어 있으면 connection tracking 작업을 위해 iptables에 규칙이 없더라도 20%의 CPU를 소모한다.

 

 

참고 URL

 

 

 

테스트

 

아래 테스트는 커널 파라미터 중 기본값만 변경한 테스트이다.

 

1. 커널 파라미터 변경전 FailOver

 

# curl 192.168.219.253 (VIP)

 

외부에서 HAProxy의 VIP로 curl 명령 실행시 뒷단의 Web 서버로 LoadBalancing이 되는 것이 확인된다.

 

앞단에서 HAProxy Master역할을 하는 것은 Keepalived의 Master로 설정된 노드이다.

 

이제 Master VM 장애 발생을 가정하고 Failover 테스트를 진행한다.

Slave에는 Haproxy Service가 실행 중이다. 

(기본 커널 파라미터가 셋팅이 안된상태에서 Slave의 HAProxy 데몬은 실행에 실패한다. 테스트를 위해 Master를 Off후 서비스를 올린 뒤에 다시 Master를 On 시켜 테스트 환경을 만든 것이다.

데몬이 실패한 이유는 haproxy에 의해 VIP가 네트워크 인터페이스에 바인딩되어야하는데 커널파라미터가 비활성화 값이므로 실패하였다.)

 

Master VM을 Poweroff 하였을때 Keepalived에 의해 Slave VM이 Master로 승격되었다.

 

외부에서 HAProxy로 curl 명령 실행시 무중단으로 실행되는 것도 확인되었다.

 

이제 다시 Master VM을 실행시켜 FailBack을 할 예정이다.

 

 

Slave는 정상이나 Master가 다시 정상으로 돌아왔을 경우 HAProxy에 대한 응답은 실패했다.

Master에서 확인해보니 아래와 같이 HAProxy Service가 실패하였다.

 

 

실패 원인

 

haporxy는 haproxy.cfg에 있는 VIP를 바인딩해야하는데 VIP가 현재 로드밸런서에 없으므로 오류를 발생시킨다. (오류 내용 - 프록시 : 소켓을 바인드 할 수 없음)

Master -> Slave로 FailOver하는 경우 Keepalived에 의해 VIP가 옮겨간다. Slave에서 서비스 구동을 하다가 Master가 정상으로 돌아오면 Keepalived는 가중치에 의해 다시 Master가 트래픽을 받도록 변경한다.

이 상태에서 VIP도 Master로 옮겨오는데 Keepalived가 VIP를 Master의 네트워크 인터페이스에 바인딩하고 HAProxy가 서비스가 실행되면 커널파라미터에 상관없이 HAProxy에서 VIP를 네트워크 인터페이스에서 인식하여 정상적으로 FailBack이 된다.

 

# vim /lib/systemd/system/haproxy.service

 

 

위 방법은 Service의 Boot Type에서 notify를 idle로 변경한 것이다.

notify의 경우 simple과 동일하나 unit이 구동되면 systemd에 시그널을 보낸다. (unit이 시작된 즉시 systemd는 유닛의 시작이 완료되었다고 판단한다. 그런데 다른 유닛과 통신하기 위해 소켓을 사용하는 경우 이 설정을 사용하면 안된다.)

HAProxy의 경우 Keepalived와 통신하기 때문에 HA를 구성하기 위해서는 Type이 notify가 되어서는 안된다. 이런 부분을 해결해주는 것이  net.ipv4.ip_nonlocal_bind 파라미터이다.

Master에서 Type을 notify -> idle로 변경하였을 경우 net.ipv4.ip_nonlocal_bind=0 이더라도 정상적으로 FailBack이 진행된다.

하지만 Slave의 경우 Unit의 Type을 변경하더라도 서비스는 실패가 된다. (실패한 이유는 Keepalived의 VIP가 Master에 있기때문에 통신할 소켓이 없어서 발생한다. 네트워크 인터페이스의 바인딩 문제)

net.ipv4.ip_nonlocal_bind=1 일경우 Unit의 Type에 상관없이 HAProxy 서비스는 정상 시작된다. 

 

 

2. 커널 파라미터 변경후 FailOver 

 

net.ipv4.ip_nonlocal_bind=1 로 변경한 경우 정상적으로 FailOVer & FailBack이 진행된다. 다면 FailBack 과정에서 짧은시간동안 순단이 발생할 수 있으며 순단시에는 HTTP Code 503을 발생한 후 정상적으로 HTTP Code 200을 반환한다.

실제 운영환경에서는 자동 FailBack이 아닌 수동으로 FailBack을 진행하는 것을 권장한다. 잠시동안이라도 발생하는 네트워크 순단현상을 최대한 방지하기 위해서이다.

 

 

3. 정리

 

Master & Slave 구성에서 Master는 Service Unit의 Type 값을 변경해 정상적인 FailBack을 할 수 있고 Slave에서는 커널 파라미터를 변경하여 FailOver 환경을 만들수 있으나 정상적인 방법은 아니므로 기본 커널 파리미터 값을 변경하여 HA를 구성하는 것을 권장한다.

 

 

 

 

반응형

'Web' 카테고리의 다른 글

SNI(Server Name Indication)  (0) 2020.10.25
HAProxy  (2) 2020.01.17
Keepalived & VRRP  (0) 2020.01.17
부하분산 테스트 설명 및 용어  (0) 2019.04.09
PinPoint  (0) 2019.04.09
728x90
반응형

HAProxy

 

 

L4, L7와 같은 Hardware LoadBalancer를 대체하기 위한 Open Source로 Reverse Proxy를 기반으로한 L4, L7 Software LoadBalancer이다.

Nginx에 비해 Active Heath Check가 가능하므로 좀 더 안정적으로 사용할 수 있으며 HAProxy 설정 추가를 통해 Scale-Out도 할 수 있다.

HTTP 통신의 경우 Web-Server (Nginx, Apache 등)를 이중화 시켜줄수 있으며 HTTP와 같은 표준 프로토콜이 아닌 TCP Socket 통신에 대해서도 이중화처리가 가능하다.

 

HAProxy의 경우 HA를 구성하기위해 Keepalived를 많이 사용한다. Keepalived를 사용하여 HAProxy를 이중화하면 아래와 같은 그림이다.

 

 

 

 

 

HAProxy 동작방식

 

HAProxy는 기본적으로 Reverse Proxy 형태로 동작한다. (즉, 실제 서버 앞단에 존재하며 서버로 오는 요청을 대신 받아 뒷단의 서버에 전달하고 결과를 리턴받아 요청한 곳에 다시 전달하는 역할을 한다.)

 

HAProxy의 동작 흐름은 다음과 같다.

 

 

  1. 최초 접근시 서버에 요청 전달

  2. 응답시 쿠키 (Cookie) 에 서버 정보 추가 후 반환

  3. 재 요청시 Proxy에서 쿠키 정보 확인 후 최초 요청 서버로 전달

  4. 다시 접근시 쿠키 추가할 필요없이 서버에 전달 (클라이언트에 쿠키 정보가 계속 존재하여 재사용)

 

 

 

 

HAProxy HA

 

HAProxy는 기본적으로 VRRP (Virtual Router Redundancy Protocol) 를 지원한다.

 

 

위 그림과 같이 HAProxy를 이중화하여 Master 장애 발생시 Slave가 Master의 VIP를 가져와 Master로 승격된다. 무중단 서비스이지만 1초정도의 순단 현상은 발생할 수 있다.

 

 

 

HAProxy HA 동작방식

 

HA로 설정된 HAProxy의 동작흐름이 단일 HAProxy와 다른점은 최초 접근시 쿠키에 바로 서버 정보를 입력하지 않고 서버에서 Jsessionid가 전달될 때 서버 정보를 합쳐서 전달한다는 것이다.

 

 

  1. 쿠키에 정보가 없고 X-Forwarded-For에 정보 추가

  2. 쿠키에 추가 없음

  3. Jsessionid 추가

  4. 서버 정보와 Jsessionid를 쿠키에 추가

  5. 쿠키에서 서버 판별 후 Jsessionid만 전달

 

 

HAProxy 환경 예제

 

1. L4 Switch + HAProxy 

 

 

  • L4 스위치 이중화와 HAProxy 이중화로 구성하는 방법으로 해당 구성이 보통 FM 구성이다.

 

 

2. GSLB (Global Service Load Balancing) + HAProxy

 

 

  • Global 서비스의 경우 IDC간 이중화 및 Global 환경에서 무정지 서비스를 위한 DR (Disaster Recovery, 재해복구) 시스템 구축이 필요하다.

  • GSLB L4 스위치를 사용할수도 있지만 GSLB 구성용 L4 스위치의 경우 고가이기에 위의 그림은 DNS (BIND) 를 이용한 구축형태이다.

  • 클라이언트가 DNS로 도메인 조회시 근거리 IDC 정보를 전달하는 방법이다.

 

 

 

 

HAProxy 구성하기

 

테스트 환경

  • OS : Ubuntu 18.04

  • HAProxy Server 2EA : 192.168.219.125 / 192.168.219.126

  • Web Node 2EA : 

 

 

1. Kernel Paramater 수정

 

# echo 'net.ipv4.ip_nonlocal_bind=1' >> /etc/sysctl.conf

# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf

# sysctl -p 또는 Reboot

# cat /proc/sys/net/ipv4/ip_nonlocal_bind

 

 

net.ipv4.ip_nonlocal_bind 옵션은 프로그램이 시스템 상의 장치에 없는 주소로 Binding 할 수 있도록 할 수 있게하는 커널 파라미터이다. 즉 Network Interface에 등록되지 않은 동적 IP (VIP와 같은) 를 연결할 때 사용한다. 

 

Kernel Parameter Information (Web) :  https://support.hpe.com/hpsc/doc/public/display?docId=emr_na-c01418125

 

 

2. HAProxy 설치

 

# apt install -y haproxy

-> Ubuntu 18.04에서 기본 Repo로 설치시 1.8.8 버전이 설치된다.

 

현재 (2020-01) 2.1버전이 최신버전이며 1.5버전부터 SSL을 지원하기 때문에 기본설치방법으로도 SSL 사용이 가능하지만 최신 버전을 사용하고 싶다면 wget을 사용하여 다운로드 후 컴파일하거나 별도 Repo를 추가시켜준다.

 

# apt-add-repository ppa:vbernat/haproxy-2.1

# apt update

# apt install -y haproxy 또는 apt install -y haproxy=2.1

-> 위와 같은 방법으로 Repo 추가 후 설치하면 2.1.2 버전이 설치된다.

 

 

3. HAProxy 설정

 

HAProxy Config 섹션

 

global, defaults, listen, frontend, backend의 영역으로 구분된다.

  • global : 전체 영역에 걸쳐 적용되는 기본 설정을 담당

  • defaults :  이후 오는 영역(frontend, backend, listen)에 적용되는 설정

  • frontend : 클라이언트 연결을 받아들이는 소켓에 대한 설정

  • backend : 앞에서 들어온 연결에 할당될 프록시 서버들에 대한 설정

  • listen : frontend와 backend로 사용되는 포트를 한번에 설정하는 영역으로 TCP 프록시에서만 이용

 

Option Manual :  https://cbonte.github.io/haproxy-dconv/1.8/configuration.html

 

 

Balance Option

 

Roundrobin : 순차적으로 분배

static-rr : 서버에 부여된 가중치에 따라서 분배

leastconn : 접속수가 가장 적은 서버로 분배

source : 운영중인 서버의 가중치를 나눠서 접속자 IP 해싱(hashing)해서 분배

uri : 접속하는 URI를 해싱해서 운영중인 서버의 가중치를 나눠서 분배 (URI의 길이 또는 depth로 해싱)

url_param : HTTP GET 요청에 대해서 특정 패턴이 있는지 여부 확인 후 조건에 맞는 서버로 분배 (조건 없는 경우 round_robin으로 처리)

hdr : HTTP 헤더에서 hdr(<name>)으로 지정된 조건이 있는 경우에 대해서만 분배 (조건없는 경우 round robin 으로 처리)

rdp-cookie : TCP 요청에 대한 RDP 쿠키에 따른 분배

 

 

HAProxy 설정

 

# vim /etc/haproxy/haproxy.cfg

 

global   # 전역 섹션 프로세스 전체에 영향을 주는 내용

    log 127.0.0.1   local1 notice   # 지정한 ip (127.0.0.1) 또는 소켓 (/dev/log)에 로그를 보냄

    # local1 뒤에는 로그 레벨을 지정할 수 있는데 notice를 붙이면 emerg-notice 레벨을 보내고

    # local1 notice notice 로 설정하면 notice 레벨만 syslog로 보냄 (notice는 최소레벨을 의미)

    # rsyslog에서 "local1.notice  /var/log/haproxy.log" 형식으로 설정필요 (# echo "local1.notice  /var/log/haproxy.log" >> /etc/rsyslog.d/50-default.conf)

    chroot /var/lib/haproxy # 서비스 Jail 경로, 슈퍼유저로 실행시 모든 동작은 이 안에서만 수행 (보안 상승)

    stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners   # stats page를 사용하기 위한 Unix 소켓 바인딩

    stats timeout 30s   # stats에 timeout 시간 설정 (stats_page timeout)

    user haproxy    # 프로세스 사용자

    group haproxy   # 프로세스 그룹

    daemon  # 백그라운드로 동작

    maxconn 4000    # 프로세스당 최대 연결 개수

 

    ca-base /etc/ssl/certs

    crt-base /etc/ssl/private

 

    ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS

    ssl-default-bind-options no-sslv3

 

defaults    # front, back, listen에 관련된 전역 섹션

    log global           # 로그는 기본적으로 global 설정을 따르겠다는 옵션

    mode    http         # http 프로토콜을 사용하는 로드밸런싱 모드

    option  httplog      # 기본 Log는 SIP, DIP와 Name만 표기하므로 이 옵션을 사용해 좀 더 자세하게 출력

    option  dontlognull  # 로그 비대화 방지를 위해 Probe(정찰, 스캔)과 같은 잡다한 기록을 HAProxy Log화 하지않는 옵션

    option  forwardfor   # 클라이언트 정보 전달 (X-Forwarded-For 헤더를 넣어서 전달)

    option  httpclose    # keep-alive 문제 발생시 off 옵션

    timeout http-request 10s   # Request시의 헤더에만 적용, DDos 방어를 위해 HTTP 요청 타임아웃시간 설정 (클라이언트의 연결 타임아웃과는 무관한 HAProxy 서버의 옵션임)

    timeout http-keep-alive 10s   # 클라이언트 요청에 따른 응답 전송 후 다음 요청 대기시간 설정 (http-request가 선행함)

    timeout connect 10s  # TCP 패킷 손실을 막기위한 Real 서버로의 연결 최대 지연시간 설정 (Backend에 적용되나 전역으로 설정 가능)

    timeout client  1m   # 외부 클라이언트 요청이나 데이터와의 연결 최대 시간 (Request와 같이 사용하여 서버 안정성을 구현)

    timeout server  1m   # 서버가 데이터를 승인하거나 전송해야할 때의 연결 최대 시간

    timeout queue   1m   # 서버의 maxconn 도달시 무한정 보류상태로 두지 않고 HTTP 503 응답을 보내면서 연결을 버리는 시간 설정 (Surge Queue Time)

    errorfile 400 /etc/haproxy/errors/400.http

    errorfile 403 /etc/haproxy/errors/403.http

    errorfile 408 /etc/haproxy/errors/408.http

    errorfile 500 /etc/haproxy/errors/500.http

    errorfile 502 /etc/haproxy/errors/502.http

    errorfile 503 /etc/haproxy/errors/503.http

    errorfile 504 /etc/haproxy/errors/504.http

 

listen stats_page   # Listen은 Front / Back의 연결 포트 / 옵션들을 정의함 (TCP 제어나 Proxy에 주로 사용)

    bind    *:8080  # 접속 포트 지정

    stats   enable  # 상태 페이지 활성화

    stats   realm HAProxy Statistics   # 브라우저 타이틀

    stats   uri /   # 접근할 URI 경로

    stats   auth admin:admin    # 인증 추가 (auth [User]:[Password])

 

frontend haproxy    # 클라이언트 연결을 받아들이는 소켓에 대한 설정 (WAF 기능에 가까움)

    bind    *:80    # 접속 포트 지정

    mode    http    # 프로토콜 유형 설정

    default_backend server  # Front서버에서 전달할 기본 backend

 

backend server  # Front에서 들어온 연결에 할당될 프록시 서버들에 대한 설정

    mode    http            # 프로토콜 유형 설정

    balance roundrobin      # LoadBalancer 유형 설정

    cookie  SVID insert indirect nocache maxlife 10m    # Sticky Session 설정 (maxlife는 유지기간 설정)

    option  httpchk GET /   # healthcheck uri로 GET 뒤의 경로에 curl 명령으로 http header 값 [200 OK] 확인 (server 옵션에서 inter값으로 주기 설정)

    http-check expect status 200    # http check시 header 값이 200이면 정상을 의미

    server web01 192.168.50.11:80 cookie web01 check inter 3000 rise 2 fall 5   # real server

    server web02 192.168.50.12:80 cookie web02 check inter 3000 rise 2 fall 5   # real server

# server [host명] [ip]:[port] cookie [서버쿠키명] check inter [주기(m/s)] rise [서버구동여부점검횟수] fall [서비스중단]

# inter는 ms단위이며 값이 2000이면 2초

# rise는 서버 정상 동작 체크로 2로 설정시 2번 정상 체크되면 정상으로 간주

# fall은 서버 실패 동작 체크로 5로 설정시 5번 정상 체크에 실패하면 서버를 비정상으로 간주

 

 

HAProxy 서비스 시작

 

# /etc/init.d/haproxy start -f /etc/haproxy/haproxy.cfg

 

 

HAProxy Stats Page

 

브라우저에 설정한 stats uri를 입력하여 접근하면 web ui로 확인할 수 있다.

https://(haproxy server ip 또는 vip):8080

 

 

 

참고 URL

 

 

 

반응형

'Web' 카테고리의 다른 글

SNI(Server Name Indication)  (0) 2020.10.25
HAProxy & Keepalived  (1) 2020.01.29
Keepalived & VRRP  (0) 2020.01.17
부하분산 테스트 설명 및 용어  (0) 2019.04.09
PinPoint  (0) 2019.04.09
728x90
반응형

Keepalived & VRRP

 

웹 서비스 운영시 부하분산을 위해 Nginx로 Reverse Proxy를 사용하거나 Haproxy 같은 Loadbalancer를 사용한다.

그런데 이런 Loadbalancer에 장애가 발생하면 뒤에 존재하는 서버들은 정상적으로 서비스가 가능하더라도 앞에서 Gateway 역할을 하는 부분이 동작하지 않기 때문에 전체 장애로 이어진다.

 

 

해당 그림과 같이 한 지점에 장애가 발생해 전체 시스템의 장애로 이어지는 것을 SPOF (Single Point Of Failure : 단일장애점) 이라고 한다.

이런 SPOF을 막기위해 HA를 구성하는 것이다.

 

 

 

 

VRRP (Virtual Router Redundancy Protocol) 란?

 

Route나 LoadBalancer의 장애를 극복하고 HA 구성을 하기 위해서는 Route나 LoadBalancer를 이중화시킬 필요가 있다.

이렇게 Network 상에 존재하고 있는 Route나 LoadBalancer 중 어떤 인터페이스가 트래픽을 전달하는 책임을 가질지 결정하는 프로토콜이 VRRP라고 한다.

(HSRP도 같은 역할을 하는 프로토콜이긴 하나 Cisco 벤더에 종속적이므로 IETF 표준인 VRRP을 많이 사용한다.)

 

VRRP를 사용해 Linux에서 HA를 쉽게 해주는 Tool로는 대표적으로 Keepalived가 있고 비슷한 메커니즘을 사용하는 Corosync나 PaceMaker 등이 있다.

 

아래는 VRRP를 사용하는 이중화된 Route의 구성도이다.

 

 

VRRP는 가상의 Route에 IP를 할당하고 가상 Route에 연결된 물리 Route 중 할당 우선순위가 높은 Route가 Active Route가 되어 통신에 사용된다. (개념은 Linux Bonding과 같은 개념이다.)

Stanby Route는 Active Route를 장애 발생시 Active로 승격한다.

 

Active Route 선출 우선순위는 아래와 같다.

  1. 설정한 VIP가 실제 인터페이스 IP인 Route

  2. Priority가 높은 Route

  3. IP 주소가 높은 Route

 

아래 그림을 확인해보면 VRRP로 구성된 Route가 FailOver하는 디테일한 과정이다.

 

 

Master Route (Active Route)에서 Slave Route (Stanby Route)로 Advertisement (Health Check) 를 전달하여 자신이 정상 상태인 것을 알려준다.

Slave Route에는 Master DownTimer라는 것을 설정하는데 이 지정된 시간동안 Master로 부터 Advertisement가 오지 않으면 Master가 죽은것으로 판단하고 자신이 Master가 되었다는 Advertisement를 Master에 전달한다.

 

VRRP의 상세 동작 원리는 아래의 링크을 참고한다.

URL : https://www.netmanias.com/ko/post/techdocs/5049/data-center-network-protocol/vrrp-virtual-router-redundancy-protocol-detailed-principles-of-operation

 

 

 

 

Keepalived 란?

 

C로 작성된 LoadBalancing 및 HA를 제공하는 프레임워크이다.

간단하게 설명하면 VIP (가상 IP)를 기반으로 작동하며 Master 노드를 모니터링하다가 해당 노드에 장애가 발생했을시 Stanby 서버로 Failover되도록 지원한다.

즉, Heartbeat 체크를 하다가 Master에 장애발생시 Slave로 FailOver하는 역할을 하는 것이다.

 

아래 그림은 keepalived의 구조이다.

 

LoadBalancing을 하기위해서 LVS (Linux Virtual Server)의 구성 요소인 IPVS를 사용한다. 

Keepalived와 IPVS를 조합해 HAProxy와 같은 LoadBalancer를 사용하여 L7 LoadBalancing을 할 수도 있지만 Keepalived에서 제공하는 LoadBalancing 기능을 사용하여 L4 LoadBalancing을 할 수도 있다.

Keepalived는 HA를 하기위해 VRRP Protocol을 사용하며 LoadBalancer 설정을 위한 LVS와는 독립적으로 동작한다.

 

Keepalived는 LoadBalancing 쪽에서 사용되는 LVS(IPVS)와 NAT, Masquerading에 쓰이는 Netfilter와 VIP 할당 및 해제에 쓰이는 Netlink, VRRP Advertisement 패킷 전송을 위해 사용되는 Multicast와 같은 Kernel 컴포넌트로 구성되어 있다.

Keepalived의 HA는 자신의 IP 주소와는 별개로 VIP를 설정해두고 문제가 생겼을때 이 VIP를 다른곳으로 인계하여 같은 IP주소를 통해서 서비스가 지속되도록 해주는것이 핵심인데 이 부분은 Keepalived가 VIP 할당 및 해제를 자동으로 해주기 때문에 별도의 설정을 하지 않아도 문제가 없다.

 

HA구성에서 Master의 장애인지 검출할 수 있는 방법은 아래와 같다.

  • ICMP (L3)

    • ping을 사용하는 것이다.

    • 네트워크 구간이 정상이고 서버가 살아있다면 ICMP echo 요청에 대한 응답이 돌아올 것이지만 ICMP 패킷이 바이러스 침투나 공격으로 사용되는 사례가 많기때문에 ICMP를 차단하는 경우가 많아 잘 사용하지 않는다.

  • TCP 요청 (L4)

    • 서비스를 올린 후 방화벽 허용 확인을 위해 telnet 명령을 실행해 정상 체크를 하기도 한다. 이는 TCP 요청이 정상적으로 응답하는지 확인하는 방법이다.

    • 서비스가 살아 있어 Port Listen은 하고 있지만 서버나 프로그램의 오류가 있어 HTTP 500 Code를 반환하는 경우 정확한 확인이 불가능한 단점이 있다.

  • HTTP 요청 (L7)

    • 실제 실행중인 서비스에 Heathcheck를 위한 Endpoint를 두고 서비스에 요청을 날려 200 OK가 반환되는지 확인하는 것이다.

    • HTTP 요청 자체가 ICMP나 TCP 요청에 비해 무겁기 때문에 고려가 필요하다.

 

Keepalived는 Heathcheck를 위해 TCP, HTTP, SSL, MISC와 같은 방법을 사용한다.

  • TCP_CHECK

    • 비동기방식으로 Time-Out TCP 요청을 통해 장애를 검출하는 방식이다.

    • 응답하지 않는 서버는 Server Pool에서 제외한다.

  • HTTP_GET

    • HTTP Get 요청을 날려 서비스의 정상 동작을 확인한다.

  • SSL_GET

    • HTTP Get과 같은 방식이지만 HTTPS 기반이다.

  • MISC_CHECK

    • 시스템상에서 특정 기능을 확인하는 Script를 돌려 그 결과가 0인지 1인지를 가지고 장애를 검출하는 방법이다.

    • 네트워크가 아니라 시스템상에서 돌고 있는 서비스의 정상 동작을 확인하는데 유용하다.

 

 

Keepalived 구성

 

환경

  • VitualBox

  • OS : Ubuntu 18.04

  • VIP : 192.168.219.119

  • Active : 192.168.219.120

  • Stanby : 192.168.219.121

 

 

1. keepalived 설치 (Active & Stanby)

 

# apt update

 

apt install -y keepalived

 

 

 

2. keepalived 설정 (Active & Stanby)

 

2.1) Active Node 설정

 

vim /etc/keepalived/keepalived.conf

 

 

vrrp_instance VI_1 {

  state MASTER

  interface eth0

  virtual_router_id 51

  priority 200

  advert_int 1

  authentication {

    auth_type PASS

    auth_pass 7388

  }

  virtual_ipaddress {

    192.168.219.119

  }

}

 

 

2.2) Stanby Node 설정

 

 

vrrp_instance VI_1 {

  state BACKUP

  interface eth0

  virtual_router_id 51

  priority 100

  advert_int 1

  authentication {

    auth_type PASS

    auth_pass 7388

  }

  virtual_ipaddress {

    192.168.219.119

  }

}

 

 

3. 테스트

 

3.1) Fail Over Test

# ping 192.168.219.119

 

3.2) Active Node Poweroff

# poweroff

 

3.3) Fail Over Log Check

Active Node가 Poweroff 되자 Keepalived 데몬이 VIP (192.168.219.119) 를 Stanby Node에 인계하여 FailOver를 하였다.

 

3.4) tcpdump를 사용하여 vrrp 동작 확인

tcpdump -n vrrp

Active 정상 동작

Active poweroff 후 Stanby FailOver 정상동작 확인

 

 

참고 URL

 

 

 

 

반응형

'Web' 카테고리의 다른 글

HAProxy & Keepalived  (1) 2020.01.29
HAProxy  (2) 2020.01.17
부하분산 테스트 설명 및 용어  (0) 2019.04.09
PinPoint  (0) 2019.04.09
Crawling (크롤링)  (0) 2019.04.09
728x90
반응형

테스트 항목

 

Application

 

- TPS (Transaction Per Second)

 

- 응답시간 (Response Time)

 

 

 

Middleware

 

- Message Queue

  • RabbitMQ

 

- Database

  • Mysql (slow query, Index)

 

- Web Server

  • Apache (Network Outbound io <Bandwidth>)

  • Tomcat (Idle Tread)

 

 

Infra

 

- CPU

 

- Memory (Swapping)

 

- Disk IO (파일 시스템)

 

- Network IO (고용량의 파일이나 이미지 전송에서 병목)

 

 

 

테스트 종류

 

성능 (Performance) 테스트

 

- 시스템의 요소가 특정 상황에서 어느 정도의 성능을 보이지는 측정하는 테스트

  • 기존 시스템에 대한 BenchMarking 하는 것

  • Application의 결함을 찾는 목적은 아님

  • 성능에 대한 정확하고 면밀한 모니터링을 진행

 

 

부하 (Load) 테스트

 

- 임계치의 한계에 도달할 때까지 시스템의 부하를 꾸준히 증가시키며 진행하는 테스트

  • 부하 상황에서 시스템이 어떻게 동작하는지 모니터링하고 정보 확인

  • 발생시키는 부하는 실제 시스템에 적용될 예상 트래픽이어야함

  • Volume Test 또는 Endurance Test라고 함

  • Web Server, Database, Infra등 모든 요소의 한계를 찾아서 미래에 발생할 부하에 대하는 것이 목표

 

 

스트레스 (Stress) 테스트

 

- 시스템 과부하 상태에서 어떻게 작동하는지를 검사하는 테스트

  • 시스템의 실패를 확인하고 모니터링하는 과정이 정상적으로 이루어지는지

  • 민감한 정보나 보안상의 문제가 노출되지 않는지

  • 장애 조치와 복구 절차과 효과적이고 효율적인지

 

 

Soak 테스트

 

- 한참 동안 부하를 가해서 메모리 누수나 자원 누수를 알아내는 테스트

 

 

Negative 테스트

 

- 부하를 발생시킨 상태에서 특정 시스템 구성 요소 중 일부를 제거하는 테스트

 

 

Fatigue 테스트

 

- 대역폭 용량을 뛰어넘는 부하를 발생시키는 테스트

 

 

 

Graph를 통한 분석

 

 

 

포화점 (Saturation Poing)

 

- 시스템은 언제나 처리에 한계가 있으므로 어느 순간에 더 이상 증가하지 않고 그래프가 꺽임

 

 

버클존 (Buckle Zone)

 

- 시스템 과부하로 인해 내부 자원이 서로 경쟁 상태나 적체 상태가 심해지기 때문에 최대 처리량보다 더 떨어지는 경우가 발생

 

 

최대 성능, 비즈니스 관점 최대 성능

 

- 포화점에서 얻는 최대 처리량이 실제 최대 성능으로 보면 안됨

 

- 비즈니스 관점에서 최대 처리량을 재정의하고 최대 처리량과 여유를 두는 것이 좋음

 

 

 

테스트 용어

 

Workload

 

- 주어진 시간동안 컴퓨터가 처리한 일의 양 또는 그러기 위해 부과된 연속된 일

 

- Web 기반 시스템에서는 주로 HTTP 요청이 Workload 역활을 함

 

 

Metric

 

- 응답시간 (Response Time)

 

- 출력량 (Througput)

 

- TPS (Transaction Per Second)

 

- CPU의 연산 속더인 MFLOPS (Millions of Floation-point Operations Per Second)

 

 

응답 시간 (Response Time)

 

- 인터넷에서 패킷이 라우팅되는 시간도 포함

 

- 평균 응답 시간 (Mean Time)이 Web Server형 시스템의 성능 분석에서 중요

 

 

처리량 (Throughput)

 

- PPS (page Per Second) : 웹 시스템에서 특정 페이지에 대한 요청

 

- RPS (Request Per Second)

 

- TPS (Transaction Per Second) : 데이터베이스의 트랜잭션 기반 시스템에서 사용

 

- BPS (Bits Per Second) : 네트워크의 경우는 초당 비트 수

 

 

Reliability

 

- 에러의 확률 혹은 에러 간의 평균 시간으로 측정

 

- Error-Free Seconds

 

 

Bottleneck

 

- 구성 컴포넌트 중 활용도가 가장 높은 컴포넌트를 의미

 

- 튜닝이란 활용도가 100%인 컴포넌트가 정말 100%로 사용되어야 하는가를 확인하고, 각 컴포넌트 간 활용도의 밸런스를 맞추어서 전체 시스템이 가장 좋은 성능을 발휘하도록 개선하는 작업

 

 

 

Tool

 

Monitoring Tool

 

- APM (Application Performance Monitoring)

  • 제니퍼

  • Scouter

  • Pinpoint

  • 기타 등등

 

 

Testing Tool

 

- JMeter

 

- NGrinder

 

- LoadRunner

 

 

Infra Tool

 

- Cacti

 

- Ganglia

 

- Linux Command

 

 

참조 URL

https://nesoy.github.io/articles/2018-08/Testing-Performance

반응형

'Web' 카테고리의 다른 글

HAProxy  (2) 2020.01.17
Keepalived & VRRP  (0) 2020.01.17
PinPoint  (0) 2019.04.09
Crawling (크롤링)  (0) 2019.04.09
REST & RESTful & REST API  (0) 2019.04.09
728x90
반응형

PinPoint

 

- APM (Application Performance Management) Tool로서 Java로 만들어진 Large-Scale 분산 시스템에서 사용될 수 있음

 

- 대규모 분산 시스템의 성능을 분석하고 문제점을 진단, 처리하는 Java 플랫폼

 

 

특징

 

- 분산된 애플리케이션의 메시지를 추적할 수 있는 분산 트랜잭션 추적

 

- 애플리케이션 구성을 파악할 수 있는 애플리케이션 토폴로지 자동 발견

 

- 대규모 서버군을 지원할 수 있는 수평 확장성

 

- 코드 수준의 가시성을 제공해 문제 발생 지점과 병목 구간을 쉽게 발견

 

- bytecode instrumentation 기법으로 코드를 수정하지 않고 원하는 기능을 추가

 

 

기능

 

- ServerMap (서버맵)

  • 대상 서버와 연결된 다른 서버와의 관계 다이어그램

  • 각 구성요소가 어떻게 상호연결되는지 시각화

  • 각 노드를 클릭하여 현재 상태, Transaction 수 등과 같은 구성요소에 대한 세부 사항을 확인할 수 있음

 

- Request/Response Scatter Chard (스캐터)

  • 요청별 응답시간에 따른 그래프

  • Request 수, Response 패턴을 시각화

  • Transaction은 차트에서 드래그함으로써 추가 상세 정보를 선택할 수 있음

 

- CallStack (콜스택)

  • 하나의 뷰에서 병목지점, 실패위치(points of failure)를 식별

  • 분산 환경에서 모든 Transaction에 코드 수준의 가시성을 확보할 수 있음

 

- Inspector (인스펙터)

  • CPU 사용량, 메모리/GC, JVM Arguments와 같은 Application 상세 정보를 제공

 

 

 

아키텍처

 

 

1. HostJVM은 현재 실행중인 Application이 돌아가는 WAS (해당 위치에 PinPoint Agent가 설치)

 

2. HostJVM이 동작하는 동안 PinPoint Agent는 Profile 정보를 Profiled Applications로 전송

 

3. 수집된 정보는 Pinpoint Collector가 HBase에 기록

 

4. 기록된 정보는 Pinpoint Web UI를 통해 확인

 

 

용어 

 

- HBase (for storage) : PinPoint Agent로부터 수집된 정보를 기록 (Haddop database)

 

- Pinpoint Collector (Deployed on a web Container) : 외부에서 전송되는 정보를 수집

 

- PinPoint Web (Deployed on a web Container) : PinPoint Collector가 수집하여 HBase에 기록된 정보를 확인

 

- PinPoint Agent (Attached to a Java Application for Profiling) : 모니터링할 Host JVm에 설치되어 정보를 전송

 

 

참조 URL

 

https://dev2.prompt.co.kr/33?category=98615

https://d2.naver.com/helloworld/1194202

반응형

'Web' 카테고리의 다른 글

HAProxy  (2) 2020.01.17
Keepalived & VRRP  (0) 2020.01.17
부하분산 테스트 설명 및 용어  (0) 2019.04.09
Crawling (크롤링)  (0) 2019.04.09
REST & RESTful & REST API  (0) 2019.04.09
728x90
반응형

Crawling (Web Scraping)

 

- 특정 페이지에 있는 정보들을 내가 원하는 포맷으로 가져오는 것

 

- 컴퓨터 소프트웨어 기술로 웹 사이트들에서 원하는 정보를 추출하는 것을 의미

 

- 웹 사이트를 자동으로 돌아다니며 분석 및 저장 등을 하는 행위 정도로 저장할 수 있음

 

- 사람들이 웹페이지에 직접 접속해서 정보를 읽어들이는 것과 유사

 

- 인터넷상에 흩어져 있는 자료들을 사람 대신에 프로그램을 통하여 서핑하며 수집과 가공을 하는 것

 

- 이때 프로그램의 구성에 따라 서핑 능력 차이가 발생하게 되는데 대표적으로 자바스크립트의 처리를 하는지 못하는지에 여부가 있음

 

 

 

 

크롤링 매커니즘

 

1. 크롤링 대상선정 (API 또는 웹 문서)

  • 웹 상의 데이터는 고유한 ID를 가지는데 이를 URI이라 부르며 웹 사이트 주소인 URL과 URN이 있음

  • 간단하게 과일에 대한 네이버 검색 결과를 크롤링하려면 아래의 결과에 대한 URL을 선정하는 과정

 

2. 데이터 로드

  • 데이터 로드는 웹사이트를 켜는 것과 같음

  • 만약 API라면 XML, JSON 문서가 될 것이고, 웹 페이지라면 HTML 문서를 다운 받는 것

 

3. 데이터 분석

  • 로드된 데이터에서 필요한 부분을 뽑아내는 것을 의미 (웹 사이트에서는 사용자가 필요로 하지 않는 부분이 많음)

  • 어떠한 부분을 수집할지, 어떤 부분을 수집하지 않을지 선정하는 과정

 

4. 수집

  • 데이터 분석 과정을 통해서 수집할 내용을 선정했다면 이를 추출하여 파일 또는 데이터를 메모리상에 저장하는 과정 

 

 

 

크롤링을 하기전 알아야하는 지식

 

HTTP Method

 

- Get

  • 리소스 요청 (크롤링에 주로 사용) => 받아들이는 역활

  • 주소와 함께 메시지를 남김

  • 파일 업로드 불가

  • 잘 설계된 서비스라면 주로 조회 요청시 사용

  • 실생활에 비유하자면 엽서

 

- POST

  • 대기 리소스 추가 요청이나 수정, 삭제 목적으로 사용 (크롤링에 주로 사용) => 사용자가 추가로 요청하는 것

  • 주소와 함께 메시지나 파일도 보낼 수 있음

  • 파일 업로드 지원

  • 잘 설계된 서비스에서 주로 추가, 수정, 삭제 요청시에 사용

  • 실생활에 비유하자면 택배

 

- PUT 

  • 리소스 수정 요청

 

- DELETE 

  • 리소스 삭제 요청

 

- HEAD 

  • HTTP 헤더 정보만 요청, 해당 자원의 존재 여부를 확인하기 위한 목적

 

- OPTIONS 

  • 웹 서버가 지원하는 메소드 종류 반환 요청

 

- TRACE 

  • 클라이언트의 요청을 그대로 반환

 

 

 

HTTP 요청 / 응답 패킷 형식

 

요청 패킷

 

- 요청 헤더 : 클라이언트에서 필요한 헤더 Key / Value를 셋팅한 후 요청, 전달

- 첫번째 빈줄 : Header와 Body 구분자

- Body : 클라이언트에서 필요한 Body를 셋팅한 후 요청, 전달

 

 

응답 패킷

 

- 응답 헤더 : 서버에 필요한 Key / Value를 셋팅한 후 응답, 전달

- 첫번째 빈줄 : Header와 Body 구분자

- Body : 서버에서 필요한 Body를 셋팅한 후 요청, 전달

 

 

요청 패킷 vs 응답 패킷

 

- 요청 헤더는 클라이언트에서 필요한 헤더 Key / Value를 셋팅한 후 요청, 전달을 하지만 응답헤더는 서버에 필요한 Key / Value를 셋팅한 후 응답, 전달

 

- 쉽게 생각하면 클라이언트는 사용자이기 때문에 당연히 서버에 요청을 할 것이고 서버는 서비스하는 업체 입장이기 때문에 응답을 해주는 것

(Ex. 클라이언트 - 요청 (음식점의 주문), 서버 - 응답 (주문받은 음식을 전달)

 

 

헤더

 

- HTTP 요청 / 응답 시에 헤더 정보가 Key / Value 형식으로 셋팅됨

 

- 대부분 브라우저에서는 다음 헤더를 설정하는데

  • User-Agent : 브라우저의 종류

  • Referer : 이전 페이지 URL (어떤 페이지를 거쳐왔는지에 대한)

  • Accept-Language : 어떤 언어로 응답을 원하는가

  • Authorization : 인증 정보

 

- 크롤링을 할때는 User-Agent 헤더와 Referer를 커스텀하게 설정할 필요가 있음

  • 서비스에 따라 User-Agent 헤더와 Referer 헤더를 통해 응답을 거부하기도 함 (Ex. 네이버 웹툰)

 

 

바디

 

- HTTP 요청시에는 Body가 없고 응답에만 있음 (요청에는 당연히 없는 것이고 요청에 대한 응답에 있는게 당연함)

(Ex. HTML 코드, 이미지 데이터, JavaScript 코드, CSS 코드 등등)

 

 

 

기타

 

- 파싱

  • 가공되지 않은 문자열에서 필요한 부분을 추출하여 의미있는 (구조화된) 데이터로 만드는 과정

 

- Request의 원리

  • 첫 응답만 받으면 추가 요청이 없음

  • 단순한 요청에 최적화

  • HTML 응답을 받더라도 이에 명시된 이미지/CSS/JavaScript 추가 다운을 수행하지 않지만 직접 다운로드 요청은 가능

 

- Selenium

  • 웹 브라우저 자동화 툴

  • JavaScript/CSS 지원, 기존 GUI 브라우저 자동화 라이브러리

  • 사람이 웹 서핑하는 것과 동일한 환경이지만 그만큼 리소스를 많이 사용

  • 웹 브라우저에서 HTML에 명시된 CSS/JavaScript를 모두 자동 다운로드하여 적용

  • Selenium이 직접하지않고 크롬등의 툴을 가지고 사용하기 때문에 리소스 사용이 많음

 

 

참조 URL

 

https://rednooby.tistory.com/96

https://jcdgods.tistory.com/317

https://www.slideshare.net/2minchul/web-scraping-75314593

반응형

'Web' 카테고리의 다른 글

HAProxy  (2) 2020.01.17
Keepalived & VRRP  (0) 2020.01.17
부하분산 테스트 설명 및 용어  (0) 2019.04.09
PinPoint  (0) 2019.04.09
REST & RESTful & REST API  (0) 2019.04.09
728x90
반응형

REST 정의

 

- REST는 Representational State Transfer이라는 용어의 약자로 기본적으로 웹의 기존 기술과 HTTP 프로토콜을 그대로 활용하기 때문에 웹의 장점을 최대한 활용할 수 있는 아키텍처

 

- 웹에 존재하는 모든 자원(이미지, 동영상, DB 자원 등)에 고유한 URI를 부여해 활용하는 것으로 자원을 정의하고 자원에 대한 주소를 지정하는 방법론

 

- 자원의 이름(자원의 표현)으로 구분하여 해당 자원의 상태(정보)를 주고 받는 모든 것을 의미

 

- 자원(Resource)의 표현(Representation)에 의한 상태 전달

  • 자원(Resource)의 표현(Representation)

    * 자원 : 해당 소프트웨어가 관리하는 모든 것 (Ex. 문서, 그림, 데이터, 해당 소프트웨어 자체 등등)

    * 자원의 표현 : 그 자원을 표현하기 위한 이름 (Ex. DB의 학생 정보가 자원일 때 ’Students’를 자원의 표현으로 정함)

  • 상태(정보) 전달

    * 데이터가 요청되어지는 시점에서 자원의 상태(정보)를 전달

    * JSON 혹은 XML을 통해 데이터를 주고 받는 것이 일반적

 

- REST 아키텍처는 Hypermedia API의 기본을 충실히 지키면서 범용성을 보장

 

- Network 상에서 Client와 Server 사이의 통신 방식 중 하나

 

 

 

REST 개념

 

- HTTP URI을 통해 자원을 명시하고 HTTP Method (POST, GET, PUT, DELETE)를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것을 의미

 

- REST는 자원 기반의 구조(ROA, Resource Oriented Architecture) 설계의 중심에 Resource가 있고 HTTP Method를 통해 Resource를 처리하도록 설계된 아키텍처를 의미

 

- 웹 사이트 이미지, 텍스트, DB 내용 등의 모든 자원에 고유한 ID인 HTTP URL을 부여

 

- CRUD Operation

  • Create : 생성 (POST)

  • Read : 조회 (GET)

  • Update : 수정 (PUT)

  • Delete : 삭제 (DELTE)

  • HEAD : header 정보 조회 (HEAD)

 

 

 

Richardson Maturity Model (RMM)

 

 

 

레벨 0

 

- 웹의 기본 메커니즘을 사용하지 않는 단계로 HTTP를 통해 데이털르 주고 받지만 모든 데이터 요청 및 응답과 관련한 정보를 HTTP의 Body정보를 활용

 

POST /appointmentService HTTP/1.1

[various other headers]

<openSlotRequest date = "2010-01-04" doctor = "mjones"/>

 

- POX (Plain Old XML)로 요청과 응답을 주고받는 RPC 스타일 시스템으로 HTTP Method는 POST만 사용하며 특정 서비스를 위해 클라이언트에서 접근할 Endpoint는 하나

 

 

 

레벨 1 - 리소스

 

- RMM에서 REST를 위한 첫 단계는 리소스를 도입하는 것으로 모든 요청을 단일 서비스 Endpoint로 보내는 것이 아니라 개별 리소스와 통신

 

POST /doctors/mjones HTTP/1.1

[various other headers]

<openSlotRequest date = "2010-01-04”/>

 

- 즉 함수를 호출하고 인자들을 넘기는 것이 아니라 다른 정볼르 위해 인자들을 제공하는 특정 리소스로 요청을 보냄

 

- 이럴 경우 이점은 자원이 외부에 보여지는 방식과 내부에 저장되는 방식을 분리할 수 있다는 것

 

- 예를 들어 클라이언트 단에서 완전히 다른 포맷으로 저장하더라도 JSON 형태의 데이터를 요청할 수 있음

 

 

 

레벨 2 - HTTP Method

 

- 레벨 1의 URL + HTTP Method 조합으로 리소스를 구분하는 것으로 응답상태를 HTTP Status code를 활용 (현재 가장 많은 RESTful API 이 단계를 제공)

 

GET /doctors/mjones/slots?date=20100104&status=open HTTP/1.1

Host: royalhope.nhs.uk

 

- 발생한 에러의 종류를 커뮤니케이션하기 위해 상태코드(Status Code)를 사용하는 것, 그리고 안전한 오퍼레이션 (GET 등)과 안전하지 않은 오퍼레이션 간의 강한 분리를 제공하는 것이 레벨 2의 핵심 요소

 

- Status Code를 사용한다는 것은 기존에는 유저 생성 요청을 했을 경우 302 등의 리다이렉트 요청을 서버에서 내려주는 방식이었다면 지금은 201(created)로 유저 생성 성공을 알릴 뿐 페이지 이동은 Client 단에서 해결하는 방식 (Login의 경우 성공은 200, 실패시 인증실패는 401, 성공했으나 권한 문제는 403 등)

 

- 즉 서버는 순수하게 API로서의 기능만 제공하게 되는 것 (View는 Client에서)

 

- 강한 분리를 제공하는 것은 HTTP에서 GET은 멱등박식으로 자원을 추출하는데 이에 어떤 순서로든 얼마든지 호출하든 매번 같은 결과를 얻도록함 (이에 통신상의 모든 참여자에게 캐싱 기능을 지원하는 다양한 방법을 제공)

 

 

 

레벨 3 - 하이퍼미디어 컨트롤

 

- HATEOAS (Hypertext As The Engine Of Application State) 애플리케이션 상태 엔진으로서의 하이퍼 미디어

 

- 하이퍼 미디어란 하나의 컨텐츠가 텍스트나 이미지, 사운드와 같은 다양한 포맷의 컨텐츠를 링크하는 개념

 

- 이것은 관련 컨텐츠를 보기위해 링크를 따라가는 방식과 유사한 방식으로 동작하는데, 클라이언트가 다른 자원에 대한 링크를 통해 서버와 (잠재적으로 상태 변이를 초래하는) 상호작용을 함

 

- 즉 특정 API를 요청한 후 다음 단계로 할 수 있는 작업을 알려주는 것이며 다음 단계의 작업을 위한 리소스의 URL을 알려주는 것

 

- 이 단계를 적용하면 클라이언트에 영향을 미치지 않으면서 서버를 변경하는 것이 가능

 

GET /doctors/mjones/slots?date=20100104&status=open HTTP/1.1

Host: royalhope.nhs.uk

 

HTTP/1.1 200 OK

[various headers]

<openSlotList>

<slot id = "1234" doctor = "mjones" start = "1400" end = "1450">

            <link rel = "/linkrels/slot/book"

            uri = "/slots/1234"/>

</slot>

<slot id = "5678" doctor = "mjones" start = "1600" end = "1650">

            <link rel = "/linkrels/slot/book"

            uri = "/slots/5678"/>

</slot>

</openSlotList>

 

- 단점은 클라이언트가 수행할 작업을 찾기 위해 링크를 따라가기 때문에 컨트롤 탐색에 꽤 많은 호출이 발생할 수 있다는 것

 

- 또한 복잡성이 증가할 수 있으며 HTTP 요청상에 나타나는 부하로 낮은 지연시간이 요구될 때 문제가 될 수 있음

 

- HTTP 기반의 REST 페이로드는 JSON 또는 바이너리 등의 포맷을 지원하므로 실제로 SOAP보다 훨씬 간결할 수 있지만 쓰리프트와 같은 바이너리 프토토콜에는 상대가 되지 못함

 

- 또한 웹 소켓의 경우 HTTP 초기 핸드세이크 후에 클라이언트와 서버 간에 TCP 접속이 이루어지고 브라우저에서 스트림 데이터를 보낼 때 효율적일 수 있음

 

- 따라서 HTTP가 대규모 트래픽에는 적합할 수 있지만 TCP 또는 다른 네트워킹 기술 기반의 프토콜과 비교하면 낮은 지연시간이 필요한 통신에는 그다지 좋은 선택이 아닐 수 있음

 

- 이러한 단점에도 HTTP 기반의 REST는 서비스 대 서비스의 상호작용을 위한 합리적이고 기본적인 선택

 

 

 

REST 구성 요소

 

1. 자원 (Resource) : URL

 

- 모든 자원에 고유한 ID가 존재하고 이 자원은 Server 존재

 

- 자원을 구별하는 ID는 ‘/group/:group_id’ 와 같은 HTTP URL

 

- Client는 URL을 이용해서 자원을 지정하고 해당 자원의 상태(정보)에 대한 조작을 Server에 요청

 

 

2. 행위 (Verb) : HTTP Method

 

- HTTP 프로토콜의 Method를 사용

 

- HTTP 프로토콜은 GET, POST, PUT, DELETE와 같은 Method를 제공

 

 

3. 표현 (Representation of Resource)

 

- Client가 자원의 상태(정보)에 대한 조작을 요청하면 Server는 이에 적절한 응답을 보냄

 

- REST에서 하나의 자원은 JSON, XML, TEXT, RSS 등의 여러 형태의 표현으로 나타낼 수 있음

 

- JSON 혹은 XML을 통해 데이터를 주고 받는 것이 일반적

 

 

 

REST의 특징

 

1. Server-Client (서버-클라이언트 구조)

 

- 자원이 있는 쪽이 Server, 자원을 요청하는 쪽이 Client

  • REST Server : API를 제공하고 비즈니스 로직 처리 및 저장을 책임

  • Client : 사용자 인증이나 Context(세션, 로그인 정보) 등을 직접 관리하고 책임

 

- 상호간 의존성 줄어듬

 

 

2. Stateless (무상태)

 

- HTTP 프로토콜은 Stateless Protocol이므로 REST 역시 무상태성을 가짐

 

- 무상태성이란 작업을 위한 상태정보를 따로 저장하고 관리하지 않음 (세션 정보나 쿠키 정보를 별도로 저장하고 관리하지 않기 때문에 API Server는 들어오는 요청만 단순히 처리하면 됨)

 

- Client와 Context를 Server에 저장하지 않음 (세션과 쿠키와 같은 Context 정보를 신경쓰지 않아도 되므로 구현이 단순해짐)

 

- Server는 각각의 요청을 완전히 별개의 것으로 인식하고 처리

  • 각 API 서버는 Client의 요청만을 단순 처리

  • 이전 요청이 다음 요청의 처리에 연관되어서는 안된다는 것 (이전 요청이 DB를 수정하여 DB에 의해 바뀌는 것은 허용)

  • Server의 처리방식에 일관성을 부여하고 부담이 줄어들어 서비스 자유도가 높아짐

 

 

3. Cacheable (캐시 처리 기능)

 

- 웹 표준 HTTP Protocol을 그대로 사용하므로 웹에서 사용하는 기존의 인프라를 그대로 활용 가능

  • HTTP가 가진 가장 강력한 특징 중 하나인 캐싱 기능 적용할 수 있음

  • HTTP Protocol 표준에서 사용하는 Last-Modified 태그나 E-Tag를 이용하면 캐싱 구현이 가능

 

- 대량의 요청을 효율적으로 처리하기 위해 캐시가 요구

 

- 캐시 사용을 통해 응답시간이 빨라지고 REST Server 트랙잭션이 발생하지 않기 때문에 전체 응답시간, 성능, 서버의 자원 이용률을 향상시킬 수  있음

 

 

4. Layered System (계층화)

 

- Client는 REST API Server만 호출

 

- REST Server는 다중 계층으로 구성될 수 있음

  • API Server는 순수 비즈니스 로직을 수행하고 그 앞단에 보안, 로드밸런싱, 암호화, 사용자 인증 등을 추가하면 구조상의 유연성을 줄 수 있음

  • 로드밸런싱, 공유 캐시 등을 통해 확장성과 보안성을 향상시킬 수 있음

 

- Proxy, Gateway 같은 네트워크 기반의 중간 매체를 사용할 수 있음

 

 

5. Self-descriptiveness (자체 표현 구조)

 

- REST API 메시지만 보고도 이를 쉽게 이해할 수 있는 자체 표현 구조로 되어 있음

 

- Server로부터 스크립트를 받아서 Client에서 실행 

 

- 반드시 사용할 필요 없음

 

 

6. Uniform Interface (인터페이스 일관성)

 

- URL로 지정한 Resource에 대한 모든 조작이 통일되고 한정적인 인터페이스로 수행하는 아키텍처 스타일

 

- HTTP 표준 프로토콜에 따르는 모든 플랫폼에서 사용 가능 (특정 언어나 기술에 종속되지 않음)

 

 

 

REST의 단점

 

- HTTP 메소드의 한계에 묶임

  • REST API는 HTTP 메소드를 이용하여 URL에 대한 행위를 정의하는데 따라서 간단한 수준의 메소드만 지원할 수 있음 (예를 들어 메일을 보낸다라는 행위는 단일 메소드로 구현하기 쉽지않음)

 

- 표준이 없어서 관리하기 어려움

  • REST API는 API 설계 가이드일뿐 명시적인 표준이 아님, 따라서 관리가 어렵고 좋은 API 디자인에 대한 가이드가 쉽지 않음, 어떤 가이드는 특정한 REST API에는 맞지만 또 다른 곳에서는 맞지 않을 수 있음

 

- RDMS와의 관계

  • REST API를 RDBMS에 적극적으로 사용하기 위해서는 RESTful한 테이블 구조가 필요하게 된는데 이것보다는 NoSQL 쪽이 더 잘 맞는 추세

 

 

 

REST API

 

- HTTP 통신에서 어떤 자원에 대한 CRUD요청을 Resource와 Method로 표현하여 특정한 형태로 전달하는 방식

 

 

 

RESTful

 

- REST API의 설계 의도를 정확하게 지켜주는 API를 RESTful 하다라고 표현

 

- RESTful한 API는 구성요소들의 역활이 명확하게 분리되어 있어야 함

 

- URL은 자원을 정확하고 인식하기 편하게 표현하는데에 집중하고 지우너에 대한 행위는 Uniform하게 HTTP 메소드를 통해 정의해야함

 

 

참조 URL

 

https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html

https://nesoy.github.io/articles/2017-02/REST

https://www.a-mean-blog.com/ko/blog/%ED%86%A0%EB%A7%89%EA%B8%80/_/REST%EC%99%80-RESTful-API

https://meetup.toast.com/posts/92

http://blog.naver.com/PostView.nhn?blogId=complusblog&logNo=220986337770

https://brainbackdoor.tistory.com/53

https://hyunalee.tistory.com/1

반응형

'Web' 카테고리의 다른 글

HAProxy  (2) 2020.01.17
Keepalived & VRRP  (0) 2020.01.17
부하분산 테스트 설명 및 용어  (0) 2019.04.09
PinPoint  (0) 2019.04.09
Crawling (크롤링)  (0) 2019.04.09

+ Recent posts