denoland/celld
요약
celld는 사용자의 장비에서 Cloudflare Workers 및 Durable Objects를 실행할 수 있게 해주는 오픈 소스 데몬입니다. S3 호환 버킷을 통해 데이터베이스를 복제하고 노드 간 조정을 수행하며, 합의 서비스 없이도 분산형 구조를 유지합니다.
핵심 포인트
- S3 호환 버킷을 활용한 분산형 Durable Objects 구현
- 각 객체별 독립적인 SQLite 데이터베이스를 통한 구조적 샤딩
- 합의 서비스(Consensus) 없이 객체 스토리지의 CAS 방식으로 노드 소유권 보장
- V8 엔진 내장 및 Wrangler 번들 실행 지원
- Linux x86-64 및 ARM64 환경의 Docker 지원
자체 호스팅되는 분산형 Durable Objects.
celld는 사용자의 자체 장비에서 Cloudflare Workers 및 Durable Objects를 실행하는 오픈 소스 데몬 (daemon)입니다. 각 객체 (object)는 고유한 SQLite 데이터베이스이며, 이름으로 주소가 지정되고 사용자가 소유한 S3 호환 버킷 (S3-compatible bucket)으로 복제됩니다. 노드 (nodes)들은 제어 평면 (control plane)이나 합의 (consensus) 없이 오직 해당 버킷을 통해서만 조정됩니다. 모든 객체가 각각의 작은 데이터베이스이기 때문에, 애플리케이션은 구조적으로 샤딩 (shard)됩니다. 즉, 하나의 공유 데이터베이스에서 발생하는 경합 (contention) 및 폭발 반경 (blast-radius) 실패를 관리하는 것이 아니라 설계 단계에서부터 배제합니다. 유휴 상태의 셀 (cells)은 거의 사용되지 않는 상태로 동면 (hibernate)합니다. 자세한 내용은 celld.dev에서 확인하거나 문서를 읽어보세요.
모든 celld 노드는 V8을 내장하고 Wrangler 번들 (bundles)을 실행합니다. 플릿 (fleet)은 배포 (deployments), 셀 상태 (cell state), 그리고 작은 소유권 기록 (ownership records)을 포함하는 S3 호환 버킷을 공유합니다. 객체 스토리지 (Object-storage)의 비교 및 교체 (compare-and-swap) 방식을 통해 멤버십 프로토콜 (membership protocol), 장애 감지기 (failure detector), 또는 합의 서비스 (consensus service) 없이도 정확히 하나의 노드가 한 번에 하나의 셀을 소유하도록 보장합니다.
celld는 각 셀의 SQLite 데이터베이스를 버킷으로 지속적으로 복제합니다. 셀이 이동하거나 깨어날 때, 새로운 소유자는 해당 데이터베이스를 복구하고 실행을 재개합니다. 버킷이 영구적인 진실의 원천 (durable source of truth)이며, 노드는 교체 가능한 존재입니다.
설치 프로그램은 celld 바이너리 (binary)를 다운로드합니다 (gh attestation verify를 통해 출처 (provenance)를 검증할 수 있습니다):
curl -fsSL https://celld.dev/install.sh | sh
설치 프로그램이 요청하는 경우 ~/.local/bin을 PATH에 추가하세요.
celld deploy로 배포되는 Worker 프로젝트는 PATH에 esbuild가 필요하며, 에셋 전용 (asset-only) 프로젝트는 필요하지 않습니다.
설치 프로그램은 검증된 릴리스 (releases)를 ~/.local/lib/celld/releases 아래에 보관하며, current 포인터를 원자적 (atomically)으로 전환합니다. celld를 제거하려면 보호된 언인스톨러 (uninstaller)를 사용하세요:
curl -fsSL https://celld.dev/uninstall.sh | sh
릴리스 이미지에는 celld 바이너리가 포함되어 있으며 Linux x86-64 및 ARM64용으로 게시됩니다:
docker run --rm ghcr.io/denoland/celld --version
런타임의 로컬 상태를 유지하고 표준 AWS 자격 증명 환경 변수를 전달하세요:
docker volume create celld-state
docker run --rm --network host \
-e AWS_ACCESS_KEY_ID \
...
실제 AWS S3를 사용하는 경우 --endpoint와 --region을 제거하세요. 로드 밸런서(Load Balancer) 뒤에 있는 경우, 각 노드에 피어(Peers)가 도달할 수 있는 고유한 --advertise 주소를 부여하세요.
celld는 표준 AWS 자격 증명 체인(AWS credential chain)을 사용합니다. S3 호환 버킷(S3-compatible bucket)에 배포한 다음, 동일한 버킷을 대상으로 celld를 시작하세요:
celld deploy . \
--bucket s3://my-cells-bucket
celld \
...
다른 S3 호환 서비스를 사용하는 경우 --endpoint를 사용하고, 지역을 추론할 수 없는 경우 --region을 사용하세요. 플릿(Fleet)은 하나의 애플리케이션을 실행하며, 모든 노드는 deploy/current.json에서 성공적으로 커밋된 최신 배포(deployment)를 로드합니다. 전체 명령줄 옵션은 celld --help를 실행하여 확인하세요.
배포 객체(Deployment objects)는 crates/celld/protocol.rs에 문서화된 타입을 사용합니다. celld deploy는 Worker 코드를 위해 PATH에서 esbuild를 호출하며, 함께 배포되는 자산(co-deployed assets) 또는 자산 전용 정적 자산(asset-only static assets)을 포함하여 지원되는 Wrangler 설정 서브셋(subset)을 수용하고 해당 객체들을 직접 작성합니다. 모든 노드는 버킷 임대(bucket leases)를 통해 소유자(owners)와 피어(peers)를 발견하며, 별도의 계정(account)이나 조인(join) 서비스는 존재하지 않습니다.
피어 HTTP(Peer HTTP)는 TLS를 종료(terminate)하지 않습니다. 광고된(advertised) 모든 주소를 신뢰할 수 있는 프라이빗 네트워크(private network)나 WireGuard 또는 Tailscale과 같은 암호화된 오버레이(encrypted overlay)에 배치하세요. 피어 포트(peer port)를 직접 공개하지 마십시오. --unsafe-public-advertise가 명시적으로 제공되지 않는 한, 실제 공인 IP(public IP)는 거부됩니다. 첫 번째 현재 노드는 버킷에 fleet/peer-auth.json을 생성합니다. 모든 피어 요청은 해당 플릿 비밀(fleet secret)을 통해 프로토콜 버전이 지정되고, 본문에 바인딩되며, HMAC 인증을 거치고, 시간 제한(clock-bounded)이 적용되며, 재전송 공격 방지(replay-protected) 처리가 됩니다. 버킷 및 해당 자격 증명에 대한 액세스는 플릿 관리자(fleet administrator) 액세스로 취급하십시오.
celld diagnose는 기본적으로 모든 노드 임대(node lease)를 열거한 다음, 각 활성 피어에 대해 서명된 직접 프로브(signed direct probe)를 수행합니다:
celld diagnose --bucket s3://my-cells-bucket
이 보고서는 개별적인 실패 이후에도 계속해서 점검을 수행하며, 만료된 레코드(expired records), 잘못되었거나 안전하지 않은 광고 주소(advertise addresses), 도달할 수 없는 피어(unreachable peers), 그리고 호환되지 않는 프로토콜(incompatible protocols)을 구분합니다. 또한 각 노드의 대략적인 resident-cell, WebSocket, RSS, CPU, file-descriptor, pressure(압력), 그리고 shedding(덤핑) 샘플을 출력합니다. 점검 범위를 제한하려면 하나 이상의 --peer NODE_ID 옵션을 전달하십시오.
첫 번째 릴리스의 안전한 기본값(safe defaults)을 측정하는 동안, pressure shedding(압력 덤핑)은 선택 사항(opt-in)입니다. 로드된 노드에 resident-cell의 high watermark(상한선)와 low watermark(하한선)를 설정하십시오:
CELLD_MAX_RESIDENT_CELLS=1000 \
CELLD_RESIDENT_LOW_WATER=800 \
celld --bucket s3://my-cells-bucket --listen 0.0.0.0:8080 \
...
Linux에서는 CELLD_MAX_RSS_MB와 CELLD_MAX_CPU_PERCENT를 통해 프로세스 메모리 및 CPU 트리거를 추가할 수 있으며, resident-cell watermark는 이식 가능(portable)합니다. 압력이 가해지면, celld는 가장 최근에 사용되지 않은 유휴 셀(least-recently used idle cells)을 내구성 있게 복제하고 펜싱(fencing)하며, 해당 셀의 epoch를 초기화하지 않고 소유되지 않은(unowned) 상태로 게시합니다. 그리고 low watermark에 도달할 때까지 새로운 unowned 셀의 재획득을 거부합니다. 예비(spare) 노드는 할당을 받지 않으며, 일반적인 트래픽이 도달할 때 동일한 버킷 프로토콜을 통해 해제된 셀을 획득합니다. 활성 작업(active work)이 있거나 라이브 호스트 WebSocket이 연결된 셀은 덤핑되지 않습니다.
cargo build --locked
cargo test --locked
cargo clippy --all-targets --locked -- -D warnings
워크스페이스는 celld 런타임을 빌드합니다. 버전 관리되는 객체 스토리지(object-storage) 프로토콜은 crates/celld/protocol.rs에 정의되어 있습니다. examples/ 아래의 작은 Wrangler 프로젝트들은 지원되는 Worker 및 Durable Object 인터페이스를 연습해 볼 수 있습니다.
런타임과 호환성 인터페이스(compatibility surface)는 여전히 진화 중입니다. 공개 테스트는 독립형 엔진의 smoke path를 다루며, Workers 및 Durable Objects의 참조 동작(reference behavior)에 대한 준수 여부 확인과 결함 주입(fault injection) 하에서의 분산 프로토콜에 대한 결정론적 시뮬레이션(deterministic simulation)이 각 릴리스 전에 실행됩니다.
Pull requests는 비활성화되어 있습니다. 코딩 에이전트(Coding agents)는 컨텍스트가 부족한 대규모 변경 사항을 너무 쉽게 전송하게 만들어, 유지 관리자(maintainers)에게 절약되는 시간보다 더 많은 시간을 소모하게 합니다. 사려 깊은 기여는 언제나 환영합니다. 코드를 충분히 이해하고, 패치(patch)의 범위를 집중시키며, 귀하가 요청하는 리뷰 시간에 대해 존중해 주시기 바랍니다.
git format-patch 파일을 작성하여 ry@deno.com으로 보내주세요.
기여자 라이선스 동의(Contributor License Agreement): 패치를 이메일로 보냄으로써, 귀하는 해당 패치를 제출할 권리가 있으며 귀하가 양도할 수 있는 패치의 모든 권리를 Deno Land Inc.에 양도함을 인증합니다. 권리를 양도할 수 없는 경우, 귀하는 Deno Land Inc.에 해당 패치의 전부 또는 일부를 출처 표기 여부와 관계없이 사용, 수정, 결합, 재라이선스(relicense), 재배포 또는 게시할 수 있는 영구적이고, 취소 불가능하며, 전 세계적이고, 로열티가 없으며, 양도 가능하고, 서브라이선스(sublicensable)를 부여할 수 있는 라이선스를 부여합니다.
공용 플릿(public fleet)을 운영하기 전에 제한 사항(limitations) 및 보안(security) 페이지를 확인하십시오.
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub Trending All (daily)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기