TECH 으로 돌아가기
TECH HACKER NEWS 오늘 7분 읽기 30 READS

덴노가 공개한 celld, 클라우드플레어 없이 Durable Objects를 자체 호스팅한다

덴노가 공개한 celld, 클라우드플레어 없이 Durable Objects를 자체 호스팅한다
SOURCE IMAGE · HACKER NEWS

클라우드플레어 워커스(Workers)와 두러블 오브젝트(Durable Objects)는 엣지에서 상태를 안전하게 다루는 방식으로 주목받았지만, 그동안 클라우드플레어라는 특정 사업자의 플랫폼 위에서만 돌아간다는 제약이 있었다. Deno를 만든 덴노 랜드(Deno Land)가 오픈소스로 공개한 celld는 바로 이 지점을 겨냥한다. celld는 워커스와 두러블 오브젝트를 개발자 자신의 서버에서 실행하는 데몬으로, 각 노드가 V8을 내장하고 Wrangler 번들을 그대로 구동한다. 즉 클라우드플레어에 종속되지 않고도 같은 프로그래밍 모델을 자기 인프라 위에서 재현하려는 시도다.

데이터베이스 하나가 곧 오브젝트

celld의 핵심 설계는 각 오브젝트를 독립된 SQLite 데이터베이스로 취급한다는 점이다. 오브젝트는 이름으로 주소가 지정되고, 사용자가 소유한 S3 호환 버킷에 복제된다. 모든 오브젝트가 저마다 작은 데이터베이스이기 때문에 애플리케이션은 별도의 샤딩 전략 없이 구조적으로 분할된다. 하나의 공유 데이터베이스에 트래픽이 몰리면서 발생하는 경합이나, 장애가 전체로 번지는 이른바 '폭발 반경(blast radius)' 문제를 운영으로 관리하는 대신 설계 단계에서 제거하겠다는 발상이다. 유휴 상태의 셀(cell)은 거의 아무 자원도 쓰지 않는 수준으로 동면(hibernate)한다.

실무자 입장에서 더 눈여겨볼 부분은 조정(coordination) 방식이다. celld 플릿(fleet)은 배포물, 셀 상태, 소유권 기록을 담은 하나의 S3 호환 버킷을 공유하며, 노드들은 오직 이 버킷을 통해서만 서로를 조율한다. 별도의 컨트롤 플레인이나 합의(consensus) 서비스가 없다. 대신 오브젝트 스토리지의 compare-and-swap 연산을 이용해 특정 순간에 정확히 하나의 노드만 각 셀을 소유하도록 보장한다. 멤버십 프로토콜, 장애 감지기, 합의 서비스 없이도 소유권 충돌을 막는 것이다. 각 셀의 SQLite 데이터베이스는 버킷으로 계속 복제되며, 셀이 다른 노드로 옮겨가거나 깨어날 때 새 소유 노드가 그 데이터베이스를 복원해 실행을 이어간다. 버킷이 영속적인 진실의 원천이고 노드는 언제든 교체 가능한 존재라는 구조다.

운영 전제와 보안 경계

설치와 배포 절차도 비교적 명확하다. 설치 프로그램이 celld 바이너리를 내려받으며, 출처는 gh attestation verify로 검증할 수 있다. 릴리스는 리눅스 x86-64와 ARM64용으로 제공된다. 워커 코드를 배포하려면 PATH에 esbuild가 필요하지만 정적 자산만 배포하는 프로젝트에는 필요 없다. 인증은 표준 AWS 자격 증명 체인을 그대로 따르며, 실제 AWS S3가 아닌 다른 S3 호환 서비스를 쓸 때는 --endpoint와 --region 옵션으로 지정한다. 한 플릿은 하나의 애플리케이션을 실행하고, 모든 노드는 deploy/current.json에서 마지막으로 성공적으로 커밋된 배포를 불러온다.

보안 측면에서는 명시적인 경고가 붙어 있다. 노드 간 피어 HTTP 통신은 TLS를 종단하지 않으므로, 광고(advertise)되는 모든 주소는 신뢰할 수 있는 사설망이나 WireGuard·Tailscale 같은 암호화 오버레이 위에 두어야 한다. 피어 포트를 공개망에 그대로 노출해서는 안 되며, 공인 IP는 --unsafe-public-advertise를 명시적으로 지정하지 않는 한 거부된다. 최초 노드가 버킷에 fleet/peer-auth.json을 생성하고, 이후 모든 피어 요청은 프로토콜 버전 검증, 본문 바인딩, HMAC 인증, 시각 제한, 재전송 방지가 적용된다. 결국 버킷과 그 자격 증명에 대한 접근은 곧 플릿 관리자 권한과 동등하게 취급해야 한다.

부하 관리를 위한 압력 셰딩(pressure shedding)은 첫 릴리스에서 기본값을 측정하는 동안 옵트인으로 제공된다. 상주 셀 수의 상·하한 워터마크를 설정할 수 있고, 리눅스에서는 CELLD_MAX_RSS_MB와 CELLD_MAX_CPU_PERCENT로 메모리·CPU 트리거를 추가할 수 있다. 압력이 걸리면 celld는 가장 오래 쓰이지 않은 유휴 셀을 안전하게 복제·펜싱한 뒤 에폭을 초기화하지 않은 채 '소유자 없음' 상태로 공개하고, 하한 워터마크에 도달할 때까지 새 셀을 다시 취득하지 않는다. 활성 작업이 있거나 살아 있는 호스트 WebSocket이 연결된 셀은 셰딩 대상에서 제외된다. 진단 도구인 celld diagnose는 노드 리스를 열거하고 각 라이브 피어를 서명된 방식으로 직접 탐침해, 만료된 기록·잘못된 주소·도달 불가 피어·비호환 프로토콜을 구분해 보고한다.

다만 이 프로젝트는 아직 진화 중이라는 점을 분명히 밝히고 있다. 런타임과 호환성 표면이 계속 바뀌고 있으며, 워커스·두러블 오브젝트 참조 동작에 대한 적합성 검증과 결함 주입 기반의 분산 프로토콜 결정적 시뮬레이션이 릴리스마다 실행된다. 흥미로운 운영 정책도 있다. 풀 리퀘스트는 아예 비활성화돼 있는데, 코딩 에이전트 탓에 맥락이 부족한 대규모 변경이 너무 쉽게 들어와 메인테이너의 검토 시간을 오히려 낭비시킨다는 이유에서다. 기여는 git format-patch를 ry@deno.com으로 보내는 방식으로만 받으며, 패치 전송 시 별도의 기여자 라이선스 동의가 적용된다. 자체 인프라에서 두러블 오브젝트 모델을 실험하려는 팀이라면, 합의 서비스 없이 오브젝트 스토리지만으로 소유권을 조정하는 이 설계가 어디까지 견고한지 직접 확인해 볼 만한 시점이다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://github.com/denoland/celld
SHARE
처리 중...