Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

03.22(화) #5

Open
kokojong opened this issue Mar 21, 2022 · 4 comments
Open

03.22(화) #5

kokojong opened this issue Mar 21, 2022 · 4 comments

Comments

@kokojong
Copy link
Contributor

[Http 1.0 2.0 3.0] - 동현
[로드 밸런싱] - 여종
[Blocking,Non-blocking & Synchronous,Asynchronous] - 상원
[Blocking & Non-Blocking I/O] -찬후 ( I/O가 뭔지도,,, 알려줭...)

3.22(화) 22시까지 정리
3.23(수) 21시에 모이기

@kokojong
Copy link
Contributor Author

로드밸런싱

로드 밸런싱이란 서버에 가해지는 부하(Load)를 분산(Balancing) 해주는 장치나 기술을 뜻합니다. 클라이언트와 서버 사이에 위치하며 한대의 서버로 부하가 몰리지 않도록 트래픽을 관리해 효율을 높입니다.

증가한 트래픽에 대한 방식을 크게 Scale-up, Scale-out이 있는데 Scale-up은 서버 자체의 성능을 늘리는 것, Scale-out은 여러대의 서버로 증설하는 것을 말하는데 이때 로드 밸런싱이 사용됩니다.

L4, L7..? NLB, ALB..?

L4로드 밸런싱(=NLB)은 4계층인 Network에서 분산 작업을 하고, L7로드 밸런싱(=ALB)는 7계층인 Application에서 분산 작업을 합니다.

  • L4는 네트워크 계층(IP, IPX)이나 트랜스포트 계층(TCP, UDP)의 정보를 바탕으로 로드를 분산합니다. IP주소나 포트번호, MAC주소, 전송 프로토콜에 따라서 트래픽을 나누는 것이 가능합니다.
  • L7는 어플리케이션 계층(HTTP, FTP, SMTP)에서 로드를 분산합니다. 즉, Http헤더, 쿠키등과 같은 사용자의 요청을 기준으로 트래픽 분산이 가능합니다. slp로 예를 들면 “/queue” 와 “/user”, “~/chat” 으로 분리가 가능합니다.(url에 따라 분리한 예시)
  • L7는 특정 패턴을 가진 바이러스를 감지할 수 있고, 디도스 같은 비정상적인 트래픽도 필터링이 가능해서 네트워크 보안분야에서도 활용된다고 합니다
  L4로드 밸런서 L7로드 밸런서
계층 4계층(Transport Layer) 7계층(Application Layer)
특징 TCP/UDP 포트 정보를 바탕으로 한다 HTTP헤더, URL, 쿠키, 정보 등이 추가
장점 - 데이터 내부를 볼 필요가 없어서 속도가 빠르고 효율이 좋다. - 데이터의 내용을 decode할 필요가 없기에 안전함, - 가격이 저렴  - 더 상위 계층이기 때문에 섬세한 라우팅이 가능함, - 캐싱이 가능, - 비정상적인 트래픽or바이러스를 미리 감지할 수 있음
단점 - 섬세한 라우팅은 불가능, - 사용자의 IP가 수시로 바뀐다면 서비스 제공이 어렵다 - 패킷의 내용을 decode해야해서 비쌈, - 클라이언트가 로드밸런서와 인증서를 공유하기 때문에 로드 밸런서를 공격하면 클라이언트에 접근할 수 있어서 보안위험이 생김

로드 밸런싱 알고리즘

  • 라운드 로빈 방식 : 들어온 요청을 순서대로 돌아가며 배정. 서버의 스펙이 비슷하고 서버와의 연결이 오래 지속되지 않는 경우에 적합
  • 가중 라운드 로빈 방식 : 서버마다 가중치를 가지게 해서 가중치만큼 배정. 서버의 스펙이 다를경우 적합
  • IP 해시 방식 : IP주소를 특정한 서버에 매핑해서 요청을 처리. 사용자가 항상 동일한 서버로 연결되는것을 보장
  • 최소 연결 방식 : 요청이 들어왔을 때 가장 적은 연결상태를 가지는 것에 트래픽을 배분. 자주 세션(연결)이 길어지거나 서버에 분배된 트래픽들이 일정하지 않을 때 적합
  • 최소 리스폰 타임 : 서버의 연결상태, 응답시간을 고려해서 트래픽을 배분. 즉, 가장 적은 연결과 가장 짧은 리스폰 타임을 보이는 서버에 우선적으로 배분.

@JD-man
Copy link
Collaborator

JD-man commented Mar 22, 2022

HTTP/0.9

  • 메서드는 GET만 있다.
  • HTTP 헤더가 없고 HTML 파일만 전송 될 수 있었다.
  • 상태코드 없다.

HTTP/1.0

  • 요청에 버전 정보를 포함하기 시작
  • 응답에 상태 코드를 포함하기 시작
  • 헤더와 바디가 생김
  • 헤더 정보를 통해 HTML 이외의 파일도 전송 가능
  • TCP 연결당 하나의 URL만 처리, 매번 요청/응답이 끝나면 연결이 끊김

HTTP/1.1

한개의 TCP 세션

  • 1.0은 요청마다 TCP 세선을 맺지만 1.1은 한개의 TCP 세션을 사용
  • Keep-alive 기능을 통해 한번 맺었던 연결을 유지
  • TCP 세선 처리 부하를 줄이고 응답속도가 개선됨

파이프라이닝

  • 한번에 하나의 명령어만 실행하는 것이 아니라 하나의 명령어가 실행되는 도중에 다른 명령어를 실행하는 방식
  • 따라서 이전 요청에 대한 응답이 전송되기 전에 다음 요청이 가능

청크된 응답

  • 한번 응답에 모든 정보를 담지 않고 분할 응답 가능

Host 헤더

  • 동일 IP 주소에 다른 도메인을 호스트 가능

HTTP/2.0

HTTP 바디가 이진 데이터

  • 기존에는 문자열로 전송.
  • 요청 메섣, 헤더 등은 여전히 문자열로 전송.

멀티플렉싱

  • 1.1에서 파이프라이닝 기술을 도입했지만 HOL Blocking 문제가 있었다.
  • Head-Of-line Blocking : 패킷이 순서대로 도착해야해서 이전 패킷 도착전까지 이후 패킷이 전송되지 못함
  • 1.1은 응답의 순서가 요청의 순서와 같아서 이전 응답이 지연되면 이후 응답도 같이 지연되는 문제가 있었다.
  • 2.0 버전에서는 여러 요청/응답을 병렬로 처리해 요청순서와 응답순서가 다르다

스트림 우선순위 지정

  • 중요한 데이터를 먼저 보낼 수 있도록 설정 가능

헤더 압축

  • 헤더는 문자열이므로 중복값이 있으면 성능 이슈가 있을 수 있음 (크게는 수 KB를 소모해 전송속도에 영향)
  • HPACK 압축으로 중복 헤더를 없애서 보낸다.

Server Push

  • 클라이언트에게 필요한 데이터가 있을 때 서버가 미리 데이터를 전송해 받아 볼 수 있다.

HTTP/3.0

  • 2.0까지는 TCP 연결이므로 프로토콜 자체의 한계가 오게 됐다.
  • 3.0부터는 UDP 기반 프로토콜인 QUIC을 사용.

특징

딜레이 감소, 멀티플렉싱, 네트워크 스위칭 속도 개선

@kokojong kokojong changed the title 03.21(월) 03.22(화) Mar 22, 2022
@ChaNoo97
Copy link
Collaborator

Blocking & Non-Blocking I/O

Blocking 과 Non-Blocking 는 sync/ Async 와 관점이 다르다

블로킹/ 논블로킹은 직접 제어할 수 없는 대상을 처리하는 방법에 따라 나눈다.

직접 제어할 수 없는 대상은 대표적으로 IO, 멀티쓰레드 동기화 가 있다.

  • I/O

    컴퓨터는 크게 2가지 역할을 수행한다고 볼 수 있는데 하나는 연산 이고, 하나는 I/O 즉, 입출력을 처리하는 것!

  • Blocking

    Blocking 는 직접 제어할 수 없는 대상의 작업이 끝날 때까지 제어권을 넘겨주지 않는 것이다. 여기서 제어권을 넘겨주지 않는다는 것은 IO작업이 진행되는 동안 유저 프로세스는 자신의 작업을 중단한 채 대기하는 방식이다. 유저가 다른 작업을 할수가 없다.

스크린샷 2022-03-22 오후 9 50 49

1. 유저는 커널에게 read 작업 요청
2. 데이터가 입력될 때까지 대기
3. 데이터가 입력되면 유저에게 커널이 결과를 전달한다.
  • Non-Blocking

    Non-Blocking은 Blocking과 반대되는 개념이다. 직접 제어할 수 없는 대상의 작업 처리 여부와 상관이 없다. 예를 들어 호출하는 함수가 IO 를 요청한 후 IO처리 완료 여부와 상관없이 바로 자신의 작업을 할 수 있다. IO작업이 진행되는 동안 유저 프로세스의 작업을 중단시키지 않는 방식이다.

    유저 프로세스의 작업을 중지하지 않고 IO 작업을 할수 있지만, 반복적인 시스템 호출이 발생하기에 자원 낭비가 된다. 이 문제를 해결하기 위해 I/O 이벤트 통지 모델이 도입되었다

스크린샷 2022-03-22 오후 9 55 32

1. 유저가 커널에게 read 작업 요청
2. 데이터가 입력됐든 안됐든 요청하는 그 순간, 바로 결과가 반환된다. (데이터가 없다면 없다는 결과 메세지 EWOULDBLOCK 반환)
3. 입력 데이터가 있다면 1-2번 반복. (2번에서 결과 메시지를 받은 유저는 다른 작업을 진행한다)
4. 입력 데이터가 있다면 커널이 유저에게 결과 전달한다.

@Brandnew-one
Copy link
Collaborator

우선 키워드 그대로 날것의 의미를 먼저 파악 해보겠습니다.

Blocking / Non - Blocking

  • Blocking : 호출된 함수(친구)가 자신이 할 일을 모두 마칠 때 까지 제어권을 가지고 호출된 함수(나)에게 돌려주지 않는 것
  • Non-Blocking : 호출된 함수(친구)가 자신이 할일을 마치지 않았더라도 바로 제어권을 건내주어 호출된 함수(나)가 다른일을 진행할 수 있도록 하는것

Async / Sync

  • Async: 요청과 결과가 동시에 일어나지 않는다 -> 결과를 받지 못하더라도 그 시간동안 다른 작업을 할 수 있음
  • Sync: 요청과 결과가 동시에 일어난다 -> 결과가 주어질 때까지 대기

func Test() {
    A()
    B()
}

위와 같은 구조의 함수를 실행시키는 경우를 생각 해보겠습니다.

Block, Non-Block 관점에서 이를 생각해보면

A라는 함수에게 제어권을 넘겨줘서 작업이 끝난후에 B가 실행되는 형태를 Blocking 이라고 합니다. 우리가 일반적으로 생각하는 동기 와 비슷하죠?

Non-Blocking의 경우는 A라는 함수에게 제어권을 넘겨주지만 바로 제어권을 돌려받고 B작업을 시작하는 형태를 의미합니다. 이건 우리가 일반적으로 생각했던 비동기와 비슷하죠?

Block 과 Non-Block은 로직의 흐름이 멈추는지 멈추지 않는지를 중심으로 생각하면 됩니다.

sync, async 관점에서 이를 생각해보겠습니다.

동기는 Test라는 함수가 내부에서 A라는 함수를 호출하면 A의 결과값이 반환되었는지를 계속해서 확인하는 과정이 있습니다. 즉 작업의 주체성이 Test 입니다.

비동기는 Test라는 함수가 내부에서 A라는 함수를 호출하면 A의 결과값을 반환하는 것을 신경쓰고 않고 A에게 주체성을 넘깁니다. A는 자신의 작업이 완료되면 콜백 형태로 완료되었음을 Test에게 알려줍니다.

스크린샷 2022-03-22 오후 11 16 36

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants