# 페이스북의 다운타임 없는 릴리즈 방법에 대한 논문

> Clean Markdown view of GeekNews topic #2764. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=2764](https://news.hada.io/topic?id=2764)
- GeekNews Markdown: [https://news.hada.io/topic/2764.md](https://news.hada.io/topic/2764.md)
- Type: news
- Author: [xguru](https://news.hada.io/@xguru)
- Published: 2020-09-02T10:13:47+09:00
- Updated: 2020-09-02T10:13:47+09:00
- Original source: [dropbox.com](https://www.dropbox.com/s/g40kvbyxqhn4h72/fbr.pdf?dl=0)
- Points: 21
- Comments: 1

## Topic Body

Zero Downtime Release: Disruption-free Load Balancing of a Multi-Billion User Website

요약 설명

- 서버는 종종 재시작 됨 : 업그레이드, 버그픽스, 보안패치

- Continuous Release 의 도입으로

ㅤ→ 페이스북의 경우 2007년에 일주일에 1번이던게, 일주일에 100번 이상 배포 진행

ㅤ→ 수백만대의 서버가 매일 재시작

ㅤ→ AWS,아틀라시안,옐프,Ebay,우버 모두 마찬가지

ㅤ→ 헬스체크가 간헐적으로 실패하게 됨

- 전통적인 배포 방법

ㅤ1. Blue/Green 배포 (AWS CodeDeploy, Kubernetes) : 두개의 머신군으로 나누고 로드밸런서가 업데이트 먼저 한쪽으로 트래픽을 이관

ㅤㅤ→ 비용이 많이 듬. 수많은 머신들이 있는 Edge에는 부적합

ㅤ2. Rolling Updates (Envoy, NGINX, Apache, Kubernetes, AWS) : 한대씩 점진적으로 업데이트 하면서 로드밸런서가 트래픽을 조정

ㅤㅤ→ 업데이트 기간동안 CPU사용량이 적어지고, 느린 이터레이션.

ㅤ3. Hot Restart (HAProxy, Envoy) : 한 머신내에서 새로운 버전의 프로세스를 띄우고 기존 프로세스 트래픽이 점차 종료되면 새 프로세스가 트래픽을 받음 (SO_REUSEPORT, CMSG, SCM_RIGHTS)

ㅤㅤ→ TCP에만 가능하고 UDP는 잘못된 라우팅 발생 가능

"어떻게 하면 릴리즈 업데이트를 다운타임 없이, 빠른 이터레이션으로, 중단없이 진행할수 있을까?"

* 페이스북의 Traffic Infrastructure

ㅤ- Edge PoP(L7 LB, ProxyGen) - Data Center(L7 LB, ProxyGen) - App. Server(HHVM,MQTT)

ㅤㅤ→ 티어별로 리스타트해서 중단을 방지

ㅤㅤ→ Edge 와 Data Center 의 머신은 각각 새 ProxyGen을 띄워서 "Socket TakeOver"

ㅤㅤ→ Edge 와 Data Center 간의 "Downstream Connection Reuse"

ㅤㅤ→ Data Center 와 App Server 강의 연결은 "Partial Post Replay"

ㅤ- Socket Takeover : 새로운 프로세스를 띄워서 SCM_RIGHTS 와 CMSG로 TCP Listening , UDP VIP 소켓을 넘겨 받음

ㅤㅤ→ SCM_RIGHTS : 다른 프로세스의 File Descriptor 를 넘겨 받게 해주는 소켓 타입

ㅤㅤ→ CMSG : sendmsg() 기능으로 로컬프로세스 간에 제어 메시지를 전송할수 있게 해줌

ㅤㅤ→ UDP 기반 커넥션인 QUIC을 위해서 기존 커넥션의 경우는 새 프로세스가 기존 프로세스에게 QUIC ConnectionID를 물어서 해당 패킷을 기존 프로세스로 포워딩

ㅤ- Partial Post Replay ( App 서버 재시작 )

ㅤㅤ→ App 서버는 두가지의 워크로드가 존재 : 짧은 API 호출, 긴 HTTP POST 호출 (Upload)

ㅤㅤ→ 이 앱서버는 가용 자원이 없기 때문에 Socket Takeover 가 하는듯이 새로운 인스턴스를 띄워서 소켓 넘기는게 불가능하고, 긴 업로드 시간도 문제

ㅤㅤ→ 긴 업로드 중간에 앱서버가 업데이트 되면 프록시가 그 내용을 다 가지고 있지 않기 때문에, 해당 POST를 중단하면서 379코드와 함께 지금까지 받은 데이터를 다시 프록시로 리턴

ㅤㅤ→ 프록시는 기존 앱서버로 부터 받은 데이터와 남은 데이터를 합쳐서 다시 새 머신으로 재 전송 시도

* Zero Downtime Release의 장점

ㅤ→ Rolling Update 대비 20% 정도 높은 CPU 사용량

ㅤ→ Hot Restart 가 QUIC 패킷을 20K까지 미스라우팅 했던 거에 비해 거의 미스라우팅이 없음

ㅤ→ 페이스북 내에서 Socket TakeOver는 2013년부터, 나머지는 2015년 부터 사용 중

## Comments



### Comment 2776

- Author: xguru
- Created: 2020-09-02T10:14:28+09:00
- Points: 2

위 내용은 이 20분짜리 설명 동영상을 기반으로 요약한 것입니다  https://dl.acm.org/action/downloadSupplement?doi=10.1145%2F3387514.3405885&file=3387514.3405885.mp4&download=true

ProxyGen : 페이스북의 C++ HTTP Library https://github.com/facebook/proxygen
