Cloudflare는 Pingora Backend Router(PBR) 서비스에서 요청 분배 알고리즘의 일부를 재설계한 후 전 세계 네트워크에서 100테라바이트 이상의 RAM을 회수할 수 있었습니다. 이러한 개선은 해시 지점 표현의 압축, 통계적 분석에 기반한 해시 수 감소, 캐시와 오리진 서버로 향하는 트래픽의 안정성을 유지한 점진적 전환이 결합된 결과였습니다.
요청 분배의 문제
Cloudflare는 consistent hashing을 구현하기 위해 pingora-ketama 라이브러리를 사용합니다. consistent hashing은 캐시 가능한 요청을 가능한 한 동일한 서버로 전달하는 데 도움이 되는 방식입니다. 이를 통해 데이터센터 내부에 파일 사본 하나만 보관하고 해당 파일에 접근하는 일관된 경로를 제공할 수 있습니다.
그러나 서버당 해시 지점을 하나만 사용하면 해시 링에서 각 서버가 보유하는 범위의 크기가 크게 달라져 작업 부하의 편차가 발생할 수 있습니다. 따라서 Pingora는 각 서버에 대해 많은 수의 가상 해시를 사용하며, 저장 용량과 연결된 가중치도 적용합니다. 또한 서로 다른 속성과 제약 조건을 가진 그룹마다 별도의 링을 생성합니다. 이러한 링이 누적되면서 일부 경우 프로세스당 최대 6기가바이트를 사용하게 되었습니다.
데이터 표현 개선과 해시 수 감소
링의 각 지점을 나타내는 요소는 32비트 해시 값과 서버를 가리키는 32비트 인덱스로 구성되어 메모리에서 8바이트를 차지했습니다. Cloudflare 팀은 서비스가 동시에 약 6만 5천 개 이상의 서버를 조정하지 않을 것이므로 인덱스에 실제로 16비트보다 많은 공간이 필요하지 않다고 판단했습니다.
Rust의 정렬 규칙 때문에 인덱스 유형을 줄이는 것만으로는 충분하지 않았습니다. 구조체의 크기가 여전히 8바이트로 유지되었기 때문입니다. 이에 Cloudflare는 값과 인덱스를 6바이트 크기의 원시 배열 안에 함께 저장하고 각각에 접근하는 함수를 구현했습니다. 이 변경으로 해시 관련 메모리 사용량이 25% 감소했습니다.
가장 큰 이득은 해시 수를 재검토하면서 발생했습니다. 서비스는 서버당 기본값으로 160개 지점을 사용했으며, 이 값에 저장 용량과 연결된 서버 가중치를 곱했습니다. 분석 결과 해시 수를 크게 늘릴수록 오차 한계의 개선 폭은 점점 줄어드는 것으로 나타났습니다. Cloudflare가 논의한 사례에서는 마지막 9만 개의 해시를 추가해도 오차가 약 0.7%만 감소했습니다.
또한 32비트 해시 값을 사용하면 지점 수가 증가할수록 충돌 가능성이 커져 분배에 예상하지 못한 오차가 추가될 수 있습니다. 계산과 시뮬레이션을 바탕으로 Cloudflare는 눈에 띄는 오차 증가 없이 서버당 해시 수를 90% 줄였으며, 이는 최종적인 절감에 기여했습니다.
실제로 무엇이 바뀌는가?
네트워크 전체에서 해시 링을 한 번에 교체하는 것은 안전한 선택이 아니었습니다. 요청이 재분배되어 캐시 효율이 크게 떨어지고 오리진 서버로 향하는 트래픽이 증가할 가능성이 있었기 때문입니다. 따라서 PBR은 일시적으로 기존 링과 새 링을 모두 메모리에 유지하고 요청별로 둘 중 하나를 선택하여 명확한 롤백 경로를 마련했습니다.
전환은 단계적으로 진행되었으며, 소규모 검증 위치에서 시작해 더 큰 데이터센터로 확대되었습니다. 또한 새 링을 사용하는 요청 비율을 제어하는 기능과 참여가 허용된 데이터센터를 지정하는 기능을 분리했습니다. Cloudflare는 기존 경로를 제거하기 전에 서버 선택 결과, 링 버전, 연결 오류, 메모리 사용량, 시작 시간, 캐시 동작, 오리진 서버로 향하는 트래픽을 모니터링했습니다.
엔지니어링 측면의 의미
이번 사례는 데이터 구조 내부 필드의 크기를 선택하거나 적절한 해시 지점 수를 결정하는 것과 같은 저수준 최적화가 수천 대의 서버로 구성된 네트워크에 적용될 때 그 효과가 크게 확대될 수 있음을 보여줍니다. 동시에 이 결과가 모든 시스템에서 메모리 감소가 안전하다는 의미는 아닙니다. 분배 정확도, 충돌 가능성, 서버 가중치, 기능 제약, 전환 구현 방식은 모두 변경 전에 측정해야 하는 요소입니다.
현재 공개되지 않은 Cargo 기능을 통해 pingora-ketama 패키지에서 이러한 변경 사항을 사용할 수 있습니다. v2는 압축된 저장 형식, 더 빠른 정렬 방식, 기본 해시 수를 조정하는 기능을 지원하며, v1을 유지하고 두 링을 함께 실행하면서 요청 수준에서 선택할 수 있는 기능도 제공합니다.