Cloudflare, 러스트(Rust) 서비스의 무중단 배포를 위한 ecdysis 라이브러리 공개!
Cloudflare는 서비스 중단을 최소화하기 위해 러스트(Rust) 기반의 무중단 재시작 라이브러리인 ecdysis를 오픈소스로 공개
ecdysis는 소켓 상속(Socket Inheritance) 방식을 활용하여 기존 연결을 유지하고 새로운 연결 거부 없이 서비스 재시작을 지원
5년간의 프로덕션 환경(Production Environment) 운영을 통해 수백만 건의 요청(Request)을 절약하고, 안정적인 서비스 운영을 입증
ecdysis는 유닉스(Unix) 기반 시스템 콜(System Call)에 의존하므로 윈도우(Windows) 환경에서는 사용 불가
무중단 배포의 핵심, 소켓 상속(Socket Inheritance)
ecdysis는 기존 서비스 중단 없이 새로운 코드를 배포하기 위해 소켓 상속(Socket Inheritance) 방식을 사용한다. 기존 방식은 새로운 프로세스가 시작되는 동안 연결이 끊어지고 새로운 연결을 거부하는 문제가 발생한다.
fork() 및 execve(): 부모 프로세스(Parent Process)가 자식 프로세스(Child Process)를 fork()하고, execve()를 통해 새로운 코드를 실행
소켓 파일 디스크립터(Socket File Descriptor) 상속: 자식 프로세스는 부모 프로세스로부터 소켓 파일 디스크립터를 상속받아 기존 연결 유지(Existing Connection Preservation)
안전한 초기화(Safe Initialization): 자식 프로세스 초기화 중 오류 발생 시, 부모 프로세스가 계속 연결을 처리하여 서비스 중단 방지(Service Outage Prevention)
이러한 방식을 통해 Cloudflare는 수백만 건의 요청을 절약하고, 안정적인 서비스 운영을 가능하게 했다.
ecdysis vs. 기존 방식: 트레이드오프(Trade-offs) 분석
기존 서비스 재시작 방식은 새로운 프로세스가 시작될 때까지 연결을 거부하고, 기존 연결을 종료하는 문제를 야기한다. ecdysis는 이러한 문제를 해결하기 위해 소켓 상속(Socket Inheritance)을 사용하지만, 몇 가지 트레이드오프(Trade-offs)가 존재한다.
fork() 및 execve() 사용: 유닉스(Unix) 시스템 콜(System Call)에 의존하므로 윈도우(Windows) 환경에서는 사용 불가
보안 고려 사항: 두 프로세스(Parent/Child)가 동일한 소켓에 접근하는 짧은 시간 동안의 보안 취약점(Security Vulnerability) 발생 가능성
seccomp 호환성: graceful restart를 위해서는 fork() 및 execve()를 허용해야 하므로, seccomp 필터(seccomp Filter) 설정에 제약
하지만, Cloudflare는 이러한 트레이드오프(Trade-offs)를 감수하고도 얻는 이점이 훨씬 크다고 판단했다.
Tokio 및 systemd와의 통합
ecdysis는 비동기 프로그래밍을 위한 Tokio와 시스템 관리를 위한 systemd와의 통합을 지원하여 개발 편의성을 높였다.
Tokio 통합: Tokio를 위한 네이티브(Native) 비동기 스트림 래퍼(Stream Wrapper)를 제공하여 소켓 상속(Socket Inheritance)을 위한 추가적인 코드가 필요 없음
systemd-notify 지원: systemd의 프로세스 라이프사이클(Process Lifecycle) 알림과 자동 통합, systemd unit 파일 설정으로 무중단 배포(Zero-Downtime Deployment) 추적 가능
systemd named sockets 지원: systemd-activated sockets를 관리하여 서비스의 소켓 활성화(Socket Activation)와 무중단 재시작을 동시에 지원
이러한 통합을 통해 개발자는 ecdysis를 쉽게 적용하고, 안정적인 서비스를 구축할 수 있다.
ecdysis의 실제 사용 사례
Cloudflare는 2021년부터 ecdysis를 실제 프로덕션 환경(Production Environment)에 적용하여, 330개 이상의 데이터 센터(Data Center)에서 운영되는 핵심 러스트(Rust) 기반 서비스에 활용하고 있다.
대규모 트래픽 처리: 매일 수십억 건의 요청을 처리하는 서비스에 적용하여 안정적인 서비스 운영(Stable Service Operation)을 보장
잦은 업데이트: 보안 패치(Security Patch), 기능 릴리스(Feature Release), 설정 변경(Configuration Change) 등 잦은 업데이트를 무중단(Zero-Downtime)으로 수행
요청 손실 최소화: naive stop/start 방식 대비, 매번 재시작 시 수십만 건의 요청 손실을 방지하여 고객 신뢰도(Customer Reliability) 향상
ecdysis는 Cloudflare의 핵심 인프라를 보호하고, 고객에게 안정적인 서비스를 제공하는 데 기여하고 있다.