Friday, April 6, 2018

Netflix Open Connect에서 인기 콘텐츠 관리 방법

Netflix의 Open Connect 콘텐츠 딜리버리팀은 콘텐츠의 인기도를 예측하여 인프라 효율을 극대화 하려고 합니다.
Content Delivery관점에서는 시청 횟수로 인기 콘텐츠를 판별합니다. 즉, 스트리밍된 총 바이트 수를 Asset의 크기(byte)로 나누어 계산합니다.

그럼, 콘텐츠와 CDN 최적화는 어떤 관계가 있을까요?
일반적으로 CDN에서는 짧은 네트워킹 경로를 통해 최대한 많은 콘텐츠를 제공하려고 합니다. 네트워크 대기시간을 줄임으로써 사용자들의 스트리밍 환경을 극대화 할 수 있기 때문입니다.


서버당 사용할 수 있는 디스크 공간이 제한되어 있으므로 모든 Edge Server에 모든 콘텐츠를 넣을 수가 없습니다.
따라서 가장 많이 사용되는 콘텐츠만 Cache하게 됩니다.

Netflix의 경우 많은 트래픽을 발생시키는 Edge에서 계층화된 인프라를 사용합니다. 100G를 처리하는 서버는 매우 인기있는 콘텐츠를 제공하는데 사용되고 대용량 스토리지(200TB+)는 Warm/Cold 콘텐츠를 제공하는데 사용됩니다.
이러한 계층 구조를 적절하게 구성하기 위해 인기도에 따라 콘텐츠의 순위를 관리할 필요가 있습니다.

매우 인기 있는 콘텐츠가 단일 서버에만 배포되는 경우 해당 서버의 최대 리소스를 사용할 수 있지만 다른 서버는 활용되지 못할 수 도 있습니다.

1) 인기있는 파일은 디스크에서 읽어오는 것이 아니라 메모리에 위치해 있습니다. 메모리 최적화는 디스크 I/O가 병목현상의 원인이 될 가능성을 제거 합니다.
2) Netflix는 네트워크의 근접성을 기반으로 트래픽을 라우팅하기 떄문에 가장 인기 있는 콘텐츠도 Edge 네트워크에서 공유되고 확산됩니다.

따라서, 콘텐츠의 복사본을 보관합니다.
Consistent Hashing은 클러스터내의 여러 서버에 콘텐츠를 할당하는데 사용됩니다.
일반적으로 해싱은 균형잡힌 클러스터를 생성하지만 모든 파일이 지정된 위치의 단일 서버에서 제공되는 경우 트래픽 분산에 문제가 생길 수 있습니다.

예를 들어서, 큰 바위더미들에게서 여러 곳으로 배포하려고 하면 무게가 모두 같지 않을 수 있는 가능성이 커집니다.
그러나 자갈더미와 같이 작은 돌멩이만 있다면 더 높은 확률로 가중치의 균형을 맞출 수 있습니다.
즉, 인기가 높은 콘텐츠(큰 암석)은 여러 복사본으로 배포하여 덜 인기 있는 콘텐츠(조약돌)로 분류 할 수 있습니다.



트래픽이 증가하면 각 서버는 전체 트래픽 수준에서 최고 사용률에 도달하도록 서버를 균등하고 균형있게 유지할 수 있습니다. 이를 통해 전체 클러스터에서 처리되는 트래픽양을 최대화 할 수 있습니다.

스마트TV, iOS에서 사용되는 프로필은 서로 다른 수준의 품질로 인코딩됩니다. 그리고 오디오 프로필과 자막을 여러 언어로 제공하기에 콘텐츠, 인코딩 프로필, 비트 전송률, 언어 기준으로 하나 이상의 파일을 Cache해야 합니다. 예를 들어 The Crown의 한 에피소드를 스트리밍하려면 1200개의 파일을 저장합니다.


Netflix의 경우 과거의 시청 패턴을 기반으로 미래의 시청 패턴을 예측합니다. 이를 수행하기 위한 가장 간단한 방법은 특정 날짜에 시청한 콘텐츠 회원을 보고 내일 동일한 콘텐츠를 볼 것이라 가정하는 것입니다. 그러나 현실은 쉽지 않습니다. 여러가지 변수가 존재하기에 콘텐츠 인기도는 변동될 수 있으며 이는 콘텐츠를 잘못 지정하는 사태가 발생할 수 있습니다.
콘텐츠 인기를 계산하는 모델은 여러가지가 존재합니다.

  1. 콘텐츠 타이틀 기준: 콘텐츠 타이틀과 관련된 모든 파일이 단일 그룹으로 순위가 지정 됩니다. 이는 단일 스트리밍 세션관 관련된 모든 파일(비디오, 오디오등 다중 프로필)이 단일 서버에 있음을 의미합니다. 이것의 단점은 인기 없는 프로필의 경우도 타이틀 기준이기에 저장해야 한다는 것입니다.
  2. 파일 기준: 모든 파일에 대해 인기도가 결정됨, 이 방법을 적용하면 같은 타이틀내에 존재하는 프로필 파일의 순위가 달라집니다. (인기있는 타이틀이라도 저화질은 안볼수 있기에...) 이 매커니즘은 Cache의 효율성을 크게 향상시킵니다.
Netflix의 경우 2016년도에 타이틀 기준에서 파일 기준으로 마이그레이션을 진행했고, 50% 수준의 스토리지 용량으로 동일한 Cache 효율성을 달성 했다고 합니다.

그럼, 새롭게 추가되는 콘텐츠 타이틀에 대해서는 어떻게 해야 하는것이냐?
Netflix의 경우 처음 출시되는 콘텐츠에 대해서 내부 및 외부 예측을 통해 인기도를 예측합니다. 물론, 이 부분의 정확하지 않기에 유기적인 예측으로 이를 정상화합니다.

Sources:
  • https://medium.com/netflix-techblog/content-popularity-for-open-connect-b86d56f613b



Tuesday, January 30, 2018

Kubernetes vs Mesos with Marathon (기술적 관점)

이전 포스팅에서 Kubernetes와 Mesos에 대한 사업적 관점에서 비교를 했었습니다. 본 글에서는 기술적 관점에서의 비교글을 작성합니다.

Kubernetes

Kubernetes는 컨테이너 어플리케이션의 automating deployment, scaling 및 관리를 위한 오픈 소스 시스템입니다. Kubernetes의 아키텍처는 아래와 같습니다.

Kubernetes Cluster와 관련된 구성 요소들은 아래와 같습니다.

  • etcd: etcd는 분산 key-value store이고, Kubernetes에서는 Master Node의 API Server가 HTTP/JSON API를 이용하여 접근할 수 있는 구성 데이터를 저장하는 용도로 사용됩니다.
  • API Server: Master Node의 Hub입니다. 다양한 Component와의 인터페이스를 원할히 해주는 역할을 담당합니다.
  • Controller Manager: 작업에 대한 부하를 조절하여 클러스터의 상태를 좋게 유지하도록 합니다.
  • Scheduler: Workload를 적절히 Node에 배치합니다.
  • Kubelet: API Server로 부터 Pod의 specificatio을 전달 받아 Host에서 수행중인 Pod를 관리합니다.
  • Master: Kubernetes Node를 제어하는 역할을 수행
  • Node: Pods가 실행되는 Machine입니다.

다음은 Kubernetes와 관련된 일반적인 용어를 정리한 내용입니다.

  • Pods: Kubernetes는 Pod라는 그룹으로 Container를 배치하고 예약합니다. Pod의 Container는 동일한 Node에서 실행되며 리소스를 공유합니다. (e.g. File System, Kernel Namespace, IP address)
  • Deployments: Pod 그룹을 만들고 관리 할 수 있습니다. 수평적 확장이나 가용성 보장을 위해 사용됩니다.
  • Label: Object에 연결된 Key-Value 입니다. Label을 사용하여 여러 Object를 단일 세트로 검색하고 업데이트 할 수 있습니다.

Mesos + Marathon

Mesos는 Data Center에서 리소스를 동적으로 할당 하는 것을 목표로 하는 Distributed Kernel 이고, 리소스 공유 기능을 사용하는 수많은 Framework, Application Stack을 제공합니다. 각 Framework는 Scheduler와 Executor로 구성됩니다. 
Marathon은 Application 및 기타 Framework를 시작할 수 있는 Meta Framework입니다. Container Workload에 대한 확장 및 Self Healing  기능을 제공하는 Orchestration Platform 역할도 담당 할 수 있습니다. 아래 그림은 Mesos + Marathon의 아키텍처 입니다.



Mesos와 Marathone의 구성요소는 아래와 같습니다.
  • Mesos Master: Container 관리를 위한 Marathon, 대규모 데이터 처리를 위한 Spark와 NoSQL 데이터 베이스를 위한 Cassandra와 같은 Framework에서 Resource 공유를 가능하게 됩니다.
  • Mesos Slave: 사용 가능한 Resource를 Master에게 알려주는 Agent를 실행합니다.
  • Framework: Master가 Slave 노드에서 실행되는 Task를 전달 받을 수 있도록 Mesos Master에 등록됩니다.
  • Zookeeper: Cluster state를 Read/Write할 수 있는 가용성 높은 Naming Registry를 제공합니다.
  • Marathon Scheduler: Mesos Master로 부터 오퍼를 받아 Slave Node의 사용 가능한 CPU 및 Memory list를 제공합니다.
  • Docker Executor: Marathon Scheduler에서 작업을 받고 Slave Node에서 Container를 실행합니다.

Mesosphere DCOS

Mesosphere Enterprise DC/OS는 Mesos Distributed Kernel을 활용하여 Container 및 대용량 데이터 관리 및 사용자 인터페이스, 모니터링 도구 및 기타 기능을 제공합니다. 아래의 그림은 DCOS의 아키텍처 입니다.

DCOS는 Package Management, Container Orchestration, Cluster Management 및 기타 구성 요소로 구성됩니다.

Kubernetes vs Mesos + Marathon

Application Definition

  • Kubernetes
    • Application은 Pod, Deployment 및 Service의 조합을 사용하여 배포할 수 있습니다. Pod는 함께 배치된 Container Group이고 최소 배포 단위입니다. Deployment에는 여러 노드에 복제본이 존재할 수 있습니다. Service는 Container Workload의 "external face"이며 요청을 Round Robin 하기위해 DNS와 통합합니다.
  • Mesos + Marathon
    • Application은 Marathon에 의해 예약된 작업으로 Node에서 실행됩니다. Mesos의 경우에는 Application은 Marathon, Cassandra, Spark등의 Framework이며, Marathon은 Container를 Slave Node에서 실행되는 Task로 예약합니다. Marathon 1.4에서는 Kubernetes와 같은 Pod 개념을 도입하였지만 Marathon Core내의 기능은 아닙니다.

Application Scalability Constructs

  • Kubernetes
    • 각각의 Application 계층은 Pod로 정의되며 YAML을 사용하여 배포에 대해 선언적으로 표현합니다. 스케일링은 수동/자동으로 수행 할 수 있습니다. 
  • Mesos + Marathon
    • CLI or UI를 사용할 수 있고, JSON으로 정의하여 Docker Container의 저장소, 리소스, 인스턴스 수 및 실행할 명령을 지정할 수 있습니다. Marathon UI를 사용하여 스케일업을 수행 할 수 있고 Marathon Scheduler는 지정된 조건에 따라 Slave Node에 Container를 분배합니다.

High Availability

  • Kubernetes
    • Pod를 Node간에 배포하여 HA를 제공합니다. Load Balance 서비스는 유해한 Pod를 탐지하여 제거 합니다. 다중 Master Node와 Worker Node는 kubectl과 client의 요청에 대해 Workload를 조정할 수 있습니다. etcd를 Clustering하고 API Server도 복제할 수 있습니다.
  • Mesos + Marathon
    • Zookeeper를 사용하여 Mesos 및 Marathon의 HA를 지원합니다. Zookeeper는 Mesos와 Marathon의 leader를 선출하고 Clustering 상태를 유지하도록 도와줍니다.

Load Balancing

  • Kubernetes
    • Pods는 Service를 통해서 expose 됩니다. load balancing에 대해서는 여기를 참조하세요
  • Mesos + Marathon
    • Host port를 여러 Container port에 매핑하는 방식을 사용합니다

Auto Scaling

  • Kubernetes
    • Scaling은 Deployments를 사용하여 선언적으로 정의합니다. resource metric기반의 Auto-scaling도 지원됩니다. Resource metric은 CPU, Memory 사용률과 Request, packet 및 Custom metric도 지원합니다.
  • Mesos + Marathon
    • Marathon은 구동중인 Container의 Instance 개수를 지속적으로 모니터링합니다. Container중 하나가 fail나면 Marathon은 다른 Slave Node로 다시 Schedule합니다. Resource metric기반의 Auto-scaling은 지원하는 component를 통해서만 사용할 수 있습니다.

Application Upgrade and Rollback

  • Kubernetes
    • Rolling-update와 recreate 전략을 deployment에 모두 지원합니다.
  • Mesos + Marathon
    • Deployment를 사용하여 Rolling-update를 지원합니다.

Health Checks

  • Kubernetes
    • liveness, readiness 두가지를 지원합니다.
  • Mesos + Marathon
    • HTTP, TCP 및 기타 프로토콜등 여러 프로토콜에서 Health check 기능을 사용할 수 있습니다.

Storage

  • Kubernetes
    • 두 개의 Storage API를 제공합니다.
      • Individual storage backends
        •  e.g NFS, AWS EBS, Ceph, Focker에 대한 추상화 지원
      • Storage resource request
        • 다른 저장소의 리소스 요청에 대한 추상화 제공
    • Block 또는 File을 지원하는 여러 유형의 Persistent volume을 제공합니다.
      • e.g iSCSI, NFS, FC, Amazon Web Services, Google Cloud Platform, MS Azure
    • emptyDir volume은 비영구적이며 Container로 파일을 read/write할 수 있습니다.
  • Mesos + Marathon
    • Local persistent volume(Beta version)은 MySQL와 같은 상태 저장 응용 프로그램에서 지원됩니다.
    • Amazon EBS와 같은 외부 저장소 사용도 Beta version 입니다.
    • 한번에 하나의 작업에만 Volume을 첨부 할 수 있기 때문에 외부 volume를 사용하는 Application은 단일 Instance로만 확장 할 수 있습니다.

Networking

  • Kubernetes
    • 모든 Pod가 상호간에 통신할 수 있는 flat network model입니다. (overlay로 구현됨)
    • 이 모델에는 두 개의 CIDR이 필요합니다. 하나는 Pod가 IP 주소를 얻고 다른 하나는 Service에서 사용됩니다.
  • Mesos + Marathon
    • Host mode or Bridge mode로 구성 할 수 있습니다.
      • Host mode
        • Host port는 Container에 의해 사용됩니다. 이로 인하여 Host에서 port 충돌이 발생할 수 있습니다.
      • Bridge mode
        • Container port를 매핑하여 Host port에 연결됩니다. Host port는 배포시 동적으로 할당 될 수 있습니다.

Service Discovery

  • Kubernetes
    • 환경 변수 혹은 DNS를 사용하여 찾을 수 있습니다. Pod가 실행될 때에 kubelet은 몇가지 환경 변수를 추가합니다.
      • e.g PSVCNAME_SERVICEHOST}, {SVCNAME_SERVICE_PORT}, Docker link 변수
    • DNS server는 addon으로 사용할 수 있습니다. 전체 Cluster에서 DNS를 사용하게 되면 Pod는 자동으로 부여하는 Service Name을 사용할 수 있습니다.
  • Mesos + Marathon
    • Service는 IP, Port와 연결된 DNS 레코드를 통해 찾을 수 있습니다.
    • Service는 Mesos-DNS에 의해 자동으로 DNS에 레코드에 할당됩니다. 선택적으로 명명된 VIP도 작성 할 수 있습니다. VIP를 통한 요청은 LB처리가 됩니다.

Performance and Scalability

  • Kubernetes
    • 1.6 release에서 5000 node까지 확장됩니다. 여러 Cluster를 사용하면 5000 cluster 제한을 초과하여 사용할 수 있습니다.
  • Mesos + Marathon
    • Mesos + Marathon 조합은 확장성이 뛰어납니다. Digital Ocean에 따르면 Mesos 및 Marathon Cluster는 10000 node로 확장됩니다.

Synopsis

Mesos + Marathon 대비 Kubernetes의 장점

  • Kubernetes
    • On-premise SAN 및 Public Cloud를 포함한 다양한 Storage 옵션 제공
    • 이미 Google에서 대규모로 사용되고 있음
    • Container Orchestration 중에 가장 큰 규모의 커뮤니티를 가지고 있음
  • Mesos + Marathon
    • Amazon EBS 및 외부 저장소는 Beta version
    • 상용 업체에 의해 Control 됨
    • 소규모 커뮤니티

Mesos + Marathon 대비 Kubernetes의 단점

  • Kubernetes
    • 단일 공급 업체가 없기에 사용에 대한 의사 결정이 복잡해 질 수 있음 (문제 발생시 누가 책임질 것인가?)
    • Kubernetes는 Container Orchestration 전용으로 제작되었음
    • 5000 node cluster까지 확장되고, 그 이상을 사용하려면 여러 개의 Cluster가 필요
  • Mesos + Marathon
    • 단일 공급 업체를 통해 버그 수정 및 패치를 제공 받음 (문제 발생시 책임짐)
    • 2-tier 아키텍처를 사용하면 다른 Framework를 배포할 수 있음
    • Apple, Bloomberg, Netflix내의 일부 조직에서는 10000개 이상의 node를 통해 대규모로 Mesos를 사용중 (참고: Mesosphere 블로그)

Common Features

  • Kubernetes는 오픈 소스 프로젝트이고 많은 참여가 일어나고 있음
  • Load Balancing 및 DNS와 같은 Network 기능 제공
  • Logging/Monitoting
    • Kubernetes
      • ELK, sysdig, cAdvisor, Heapster/Grafana/InfluxDB 와 같은 외부 도구 사용 가능
    • Mesos + Marathon
      • 내부적으로 집계 가능한 Log를 제공하고 모니터링은 외부 도구를 사용
  • Auto-Scaling은 기본적으로 지원

무엇을 선택해야 할까?

Kubernetes와 Mesos + Marathon에 대한 관심도를 살펴보면 Kubernetes가 뉴스 기사, 웹 검색, 출판물 및 Github 대상 모든 측정 항목에서 70% 이상을 차지하고 있음을 알 수 있습니다.

Kubernetes는 Mesos + Marathon에 비해서 이점을 제공합니다.
  • 폭넓은 DevOps 및 Container 커뮤니티
  • 복잡한 어플리케이션 스택에 사용하기 유리하며 더 발전된 Scheduling option을 제공
  • Google에서 10년 이상의 경험을 바탕으로 제작됨
결론,
돈이 많고, 기술 내재화 하기도 싫고, 문제 발생시 책임 소재도 따지고 싶으면 Mesos + Marathon 을 선택, 그렇지 않다면 Kubernetes로 가는 것이 현실적으로 보여집니다.

다음 포스팅에서는 Kubernetes와 Amazon ECS를 비교해보도록 하겠습니다.

참고 자료:
  • https://thenewstack.io/a-brief-comparison-of-mesos-and-kubernetes/
  • https://platform9.com/blog/kubernetes-vs-mesos-marathon/
  • https://www.stratoscale.com/blog/kubernetes/kubernetes-vs-mesos-architects-perspective/

Sunday, January 21, 2018

OCA(Open Connect Appliance)에서 100Gbps 서비스

본 글은 Netflix Tech 블로그의 내용을 번역한 내용입니다. (관심 있는 부분만...)
원문: https://medium.com/netflix-techblog/serving-100-gbps-from-an-open-connect-appliance-cdb51dda3b99

2015년 여름, Netflix Open Connect CDN팀은 NVM Express(NVMe) 스토리지 기반의 단일 FreeBSD OCA에서 100Gbps 속도로 서비스 할 수 있도록 100GbE 네트워크 인터페이스 기술을 활용하는 프로젝트를 수행하기로 결정 했습니다.

Fake NUMA(Non-uniform Memory)

OCA의 경우 대부분의 콘텐츠는 디스크에서 제공되며 인기있는 타이틀 10-20%만 메모리에서 제공됩니다. 초기의 NVMe 프로토타입은 디스크 대역폭 문제로 인해 제한적이었습니다.
그래서 인기 있는 콘텐츠만 제공하는 형태로 테스트 서버에서 실험을 시작했고 모든 콘텐츠가 메모리에 저장되어 디스크 병목 현상이 발생하지 않았습니다. 의외로 성능은 40Gbps로 제한된 CPU에서 22Gbps로 떨어졌습니다.

pmcstat과 Frame graph를 사용하여 매우 기본적인 프로파일링을 수행했습니다. 수행 결과 lock contention에 문제가 있다는 의심이 들었습니다. 그래서 DTrace기반의 lockstat으로 프로파일링을 수행했습니다. Lockstat의 결과 Inactive page queue에 대한 lock에 CPU waiting time이 많이 소요되는 것을 확인했습니다. 왜 메모리상에서 Serving을 하는데 성능이 더 나빠졌을까요?

Netflix OCA는 비동기 sendfile() 시스템 호출을 통해 Nginx를 사용하여 Large 미디어 파일을 제공합니다.
sendfile() call flow
여기서 문제는 Inactive queue가 NUMA별 단일 목록으로 구성되고 single mutex lock으로 보호된다는 점입니다.
NUMA
Netflix가 생각해낸 해결책은 "Fake NUMA"입니다. 시스템에 거짓으로 2개의 CPU마다 하나의 Fake NUMA가 있다고 합니다. 이 작업후에 lock contention이 거의 사라졌으며, 52Gbps로 서비스 할 수 있었습니다. (PCIe Gen3 x8 slot)

Pbufs

FreeBSD는 "buf"구조를 사용하여 디스크 I/O를 관리 합니다. Bufs는 시스템 부팅시 정적으로 할당되며 single mutex로 보호됩니다. Netflix의 문제는 sendfile() 시스템 호출이 VM paging system을 사용하여 메모리에 없을 때 디스크에서 파일을 읽는 것입니다. 결국 모든 디스크 I/O는 pbuf mutex에 제약을 받았습니다.

Global pbuf mutex에 대한  lock contention 문제가 있었고, 이를 해결하기 위해 스왑 파티션이 아닌 파일기반으로 페이징을 처리하는 vnod pager를 수정하여 일반 커널 영역의 확장자를 사용하도록 변경했습니다. 이 변경으로 인해 잠금 경합이 제거되고 성능이 70Gbps로 향상 되었습니다.

Mbuf Page Arrays

FreeBSD의 mbuf는 네트워크 스택의 핵심입니다. 모든 패킷은 하나 이상의 mbuf로 구성됩니다. 대량의 트래픽을 처리하기 위해서 사용하는 sendfile() system call은 mbuf내에 있는 4k page를 wrapping합니다.

여기에서의 단점은 많은 mbuf가 함께 연결된다는 것입니다. sendfile을 통과하는 1MB의 요청은 256개의 VM page를 참조할 수 있으며, 각 VM page는  mbuf로 wrapping되어 연결 됩니다.
전송되는  mbuf의 수를 줄이기 위해 동일한 mbuf에서 동일한 유형의 여러 페이지를 전달 할 수 있도록 mbuf를 확장하기로 결정했습니다. sendfile을 위해 최대 24페이지를 전송 할 수 있는 mbuf를 설계했습니다. 그 결과 7Gbps의 성능이 향상 되었습니다.

위의 작업으로 인해 FreeBSD TCP 스택을 사용하여 90Gbps에서 100% TLS 트래픽을 제공 할 수 있게 되었습니다. 그러나 RACK, BBR과 같은 고급 TCP 알고리즘을 사용할 경우 목표에 미치지 못한다는 사실을 발견했고 TCP 코드 최적화에 대한 작업을 계속 진행중입니다.

Netflix는 참 대단한 회사입니다. 어디까지 성능을 끌어올릴지가 궁금하네요.

Friday, January 19, 2018

Load Balancer 비교

어플리케이션의 고 가용성을 설정하고 성능을 향상시키는 쉽고 가장 빠른 방법 중 하나는 LB(Load Balancer)를 이용하는 것입니다.
로드밸런서는 세 가지 유형이 있습니다.
  • 하드웨어 기반
  • 클라우드 기반
  • 소프트웨어 기반
하드웨어 로드 밸런서는 부하 분산을 제공하는 전용 장치이고 하드웨어 벤더 중 일부는 다음과 같습니다.
  • F5
  • TP-Link
  • Barracuda
하드웨어 로드 밸런서는 가격이 비싸지만, 좋은 성능을 제공합니다.
클라우드 로드 밸런서는 클라우드의 인기와 더불어 많이 사용되고 있습니다. 클라우드 로드 밸런서를 사용하는 것은 하드웨어 어플라이언스에 투자하지 않고도 관련된 모든 기능을 즐길 수 있는 저렴한 방법 중 하나입니다. 다음은 클라우드 로드 밸런서 중 일부입니다.
  • AWS
  • Google Cloud
  • Cloudflare
  • Incapsula
  • DigitalOcean
  • Azure
enter image description here 월 기준으로 20달러의 가격부터 시작할 수 있습니다.
마지막으로 직접 설치, 관리 및 구성하는 소프트웨어 로드 밸런서가 있습니다. 오픈 소스 로드 밸런서의 목록은 다음과 같습니다.

Seesaw

구글에서 제작한 Seesaw는 Go 언어로 개발되었으며, 우분투/데비안과 같은 리눅스 배포판에서 잘 동작됩니다. Anycast, DSR(Direct Server Return)을 지원하며 최소 두 개의 Seesaw 노드가 필요합니다. Baremetal환경과 가상 환경에서 동작합니다.
기본적으로 Seesaw는 Layer 4 network에서 작동하며, Layer 7에서의 균형 조정이 필요한 경우 Option을 이용해서 사용할 수 있습니다.

KEMP

KEMP는 AWS또는 Azure와 같은 클라우드 데이터센터에 배포하여 사용 할 수 있습니다. enter image description here
무료이지만 상용 수준의 기능을 제공합니다.
  • Round Robin 또는 Least connection 알고리즘을 사용하는 TCP/UDP에 대한 Layer 4 계층의 로드 밸런싱
  • Layer 7 계층의 로드 밸런싱
  • WAF(Web Application Firewall)가 내장되어 있음
  • IPS(Intrusion Prevention Engine)가 내장되어 있음
  • Global 로드 밸런싱, 다중 사이트 지원
  • Caching, 콘텐츠 압축, 콘텐츠 스위칭 지원
  • Web cookie persistence
  • IPSec tunneling
KEMP 로드 밸런서는 Apple, Sony, JP Morgan, Audi, Hyundai 등의 대형 회사에서 사용되고 있습니다. 무료 버전으로도 충분한 기능을 제공하지만, 더 많은 기능이 필요할 경우 상용 라이센스를 구입해야 합니다.

HAProxy

High-availability, Proxy, TCP/HTTP 로드 밸런싱을 지원하는 제품입니다. HAProxy는 아래의 회사에서 사용하고 있습니다.
  • Airbnb
  • Github
  • Imgur
  • MaxCDN
  • Reddit
기능은 다음과 같습니다.
  • Support IPv6 and Unix socket
  • Deflate & Gzip compression
  • HEalth-check
  • Source-based session stickiness
  • 통계 레포팅 기능이 내장되어 있음

Zevenet

Zevenet은 L3, L4, L7을 지원합니다.
enter image description here
Advanced health-check 모니터링을 지원 하기에 끊김없는 사용자 경험을 제공합니다. Zen으로 알려진 Zevenet은 FTP, SIP, SSL, HTTP등과 같은 TCP기반 프로토콜을 지원합니다.

Neutrino

Neutrino는 Ebay에서 사용하고 있으며, Scala & Netty를 사용하여 개발되었습니다. Least-connection, Round-robin 알고리즘을 지원합니다.
  • Using canonical names
  • Context-based
  • L4 using TCP port numbers
enter image description here
Neutrino는 2 Core VM에서 초당 300개의 요청 처리가 가능합니다. HAProxy와 비교시 Neutrino를 사용할 때의 주요 이점은 L7 스위칭입니다.
항상 그렇듯이 두 가지 방법을 모두 사용하고 환경에 가장 적합한 것을 고려해야 합니다.

Balance

기본적은 로드 밸런싱 기능을 지니고 있습니다.

Pen

Pen은 로드 밸런싱의 기본 기능과 함께 아래 기능을 제공합니다.
  • GeoIP 필터
  • SSL 종료
  • IPv4 및 IPv6 호환성

Nginx

오픈 소스 Nginx는 기본 수준의 콘텐츠 스위칭 및 여러 서버에 대한 라우팅을 지원합니다. Nginx Plus의 경우는 그 이상의 기능을 제공합니다. 로드 밸런싱, 콘텐츠 캐싱, 웹 서버, WAF, 모니터링등을 포함한 All-in-one web application delivery solution을 제공합니다. 초당 수백만 건의 요청을 처리 할 수 있는 확장형 어플리케이션을 위한 고성능 로드 밸런서 솔루션도 제공 합니다.

Traefik

HTTP reserve proxy와 로드 밸런서를 제공합니다. 또한 여러 백엔드 서비스를 지원합니다. (Amazon ECS, Docker, Kubernetes, Rancher.,)
enter image description here
Web socket, HTTP/2, 자동 SSL 인증서 갱신, 암호 관리, 리소스 관리 및 모니터링을 위한 Interface를 제공합니다.

Gobetween

Lightweight하지만 강력한 고성능 L4 TCP, TLS 및 UDP 기반의 로드 밸런서 입니다.
enter image description here
Windows, Linux, Docker, Darwin과 같은 멀티 플랫폼에서 동작합니다. 로드 밸런싱은 구성에서 설정해야 합니다. 아래의 알고리즘 기반으로 수행됩니다.
  • IP 해시
  • Round-robin
  • Least bandwidth
  • Least connection
  • Weight
아래의 벤치마크 정보를 기준으로 Gobetween은 HAProxy보다 빠르지만 Nginx보다는 느립니다.
enter image description here
동적 환경을 위한 자동 검색 기능을 탑재한 최신 L4 로드 밸런서를 찾고 있다면 Gobetween이 유망할 것으로 보여집니다.
위의 정보를 기준으로 각 상황에 맞는 로드 밸런서를 선택하시길 바랍니다.

Thursday, January 18, 2018

Kubernetes vs. Mesos: 어느 Container Orchestrator를 사용해야 할까? (사업 관점)

Container Orchestrator는 무엇이며 왜 필요할까요? 

다른 용도로 사용되는 10개의 컨테이너가 있다고 가정한다면, 많은 인스턴스를 사용하고 이러한 컨테이너를 실행하는 것은 매우 쉽습니다.
어플리케이션이 커지면서 배포한 컨테이너 수가 점점 증가하면 서로 다른 버전, 네트워크 구성을 가진 수천 개의 컨테이너를 관리할 때는 상황이 애매해집니다.

컨테이너에 의존하는 개발 기술을 사용하는 회사의 경우, 이러한 유형의 아키텍처를 확장하는 문제가 발생합니다.
오케스트레이션 인프라 스트럭처의 요점은 컨테이너를 "스케줄링"하는 간단한 방법을 제공하고 기본 인프라가 나머지를 수행하도록 하는 것입니다.

이것이 오케트스레이션의 핵심입니다.

Container Orchestrator 살펴 보기 

Kubernetes, Mesos, ECS, Swarm 그리고 Nomad와 같이 5개의 툴이 존재합니다. 이 도구중 어떤 도구를 사용할지에 대한 결정은 회사 및 개인적 취향에 따라 달라집니다.
Logz.io 의 경우 두개의 플랫폼으로 추렸다고 합니다.

  • Swarm: 테스트에는 적합하지만, 상용에서 사용하기에는 부적합하다고 판단
  • Amazon ECS: 클라우드에 무관심한 도구를 원했기에 ECS는 부적합하다고 판단
  • Nomad: 아직 사용하기에는 성숙하지 않다고 판단, 시간이 지나면 괜찮을지도... 
위 이유로 Kubernetes와 Mesos를 선정했다고 합니다.

Mesos 및 Kubernetes 정보 

Mesos는 Apache 프로젝트로 컨테이너/비컨테이너 방식을 관리할 수 있습니다.
처음에는 Berkeley 연구 프로젝트로 사용되었고 향후 Twitter에서 사용하고 있습니다.
Marathon 플러그인을 제공하여 컨테이너를 쉽게 관리할 수 있는 방법을 제공합니다.
2016년에 Mesosphere가 지원하는 오픈 소스 프로젝트인 DC/OS가 도입되었고, Mesos를 더욱 단순화 하였습니다.

Kubernetes는 2014년에 Google에서 출시한 플랫폼이며 Cloud Native Computing Foundation에 기여했습니다.

Mesos vs. Kubernetes 

API에 대한 Marathon의 접근 방식은 Kubernetes와 비교하면 간단합니다.
Marathon은 Kubernetes에 비해 적은 API 리소스를 제공합니다.
두 플랫폼이 누리는 인기도에도 명백한 차이가 존재합니다.

#Kubernetes
Screen Shot 2018 01 18 at 12 21 43 AM

#Mesos
Screen Shot 2018 01 18 at 12 24 14 AM

위의 그림은 Kubernetes와 Mesos의 commit, contribute를 보여주고 있습니다. 압도적으로 Kubernetes의 커뮤니티 규모가 큽니다.

Kubernetes가 바른 선택인 이유 

Logz.io에서는 처음에는 DC/OS(Mesos)를 선택했었고, Kubernetes의 강점 중 일부를 포기할 준비를 했다고 합니다.
하지만 배포 프로세스를 자동화하는데 필요한 간단한 기능이 엔터프라이즈 버전에만 포함되어 있다는 사실을 알았다고 합니다.
Mesosphere에 문의 했었고, 이런 상황이 일시적인 것이 아닐 수 있다는 것을 깨달았다고 합니다.
DC/OS는 이 특수한 상황을 극복해도 결국 상업 회사에 통제되기에 Kubernetes로 작업을 시작했다고 합니다.

그후 Kubernetes기반으로 작업을 완료 했고, 이 변경으로 인해 새로운 코드를 하루에 여러번 배포하는 개발자들에게 모든 책임을 위임할 수 있었고, 보다 효율적이고 지속적인 배포가 가능했다고 합니다.

다음 포스팅에는 Kubernetes와 Mesos의 기술적 비교를 다룰 예정입니다.


References:

  • https://dzone.com/articles/kubernetes-vs-mesos-choosing-a-container-orchestra
  • https://platform9.com/blog/kubernetes-vs-mesos-marathon/