16KB로 수백만을 세다
HyperLogLog(HLL)

성능을 모니터링하는 엔지니어에게 '액티브 사용자 수'는 단순하지 않습니다

by MSAPai


16KB 메모리로 수백만 사용자를 중복 없이 세는 마법 : HyperLogLog (HLL)


애플리케이션의 성능을 모니터링하는 엔지니어에게 '액티브 사용자 수'는 단순히 숫자가 아닙니다.

그것은 비즈니스의 현재 기온이자, 시스템이 견뎌내야 할 중력의 크기이기도 합니다.


하지만 수천만 명의 사용자가 동시에 접속하는 서비스에서 이 숫자를 '실시간'으로,
그리고 '정확하게' 뽑아내는 일은 생각보다 고독하고 치열한 기술적 전투입니다.



완벽함이라는 함정


우리는 흔히 데이터베이스의 COUNT(DISTINCT user_id) 를 떠올립니다.

하지만 대규모 트래픽 환경에서 이 방식은 치명적인 약점을 가집니다.


천만 명의 고유 ID를 기억하려면 그만큼의 메모리가 필요하고,

사용자가 늘어날수록 시스템은 자신의 기억력 무게에 짓눌려 속도가 느려집니다.


여기서 우리는 선택해야 합니다.

100%의 수학적 결벽증을 고집하며 시스템 전체를 느리게 만들 것인가,

아니면 아주 미세한 오차를 허용하는 대신 압도적인 효율성을 얻을 것인가.

현대 APM 시스템은 후자의 지혜를 선택했습니다. 그것이 바로 HyperLogLog (HLL)입니다.


image.png



확률이 건네는 뜻밖의 해답


HyperLogLog (HLL)의 원리는 의외로 낭만적입니다.

데이터를 있는 그대로 저장하는 대신, 데이터가 가진 '통계적 패턴'만을 기록합니다.


모든 사용자에게 무작위 주민등록번호(해시값)를 부여한다고 상상해 봅시다.

이 번호를 이진수로 바꿨을 때, 앞자리에 '0'이 연속해서 나타나는 횟수를 관찰합니다.


동전을 던져 앞면이 열 번 연속 나올 확률이 매우 희박하듯,

0이 길게 늘어지는 패턴이 발견된다면 우리는 "아, 정말 많은 고유 사용자가 다녀갔구나"라고

수학적으로 추정할 수 있습니다.


APM 에이전트는 이 영리한 알고리즘을 통해 단 16KB의 메모리만으로 수백만 명의 사용자를 추적합니다. 이는 수백 메가바이트가 필요할 수도 있는 전통적 방식에 비하면 기적에 가까운 효율입니다.




시공간을 가로지르는 데이터의 병합


HyperLogLog (HLL)의 진짜 매력은 '병합(Merge)'이 가능하다는 점에 있습니다.


오늘날의 서비스는 여러 대의 서버(인스턴스)로 운영됩니다.

사용자는 WAS-1에 접속했다가 다음 순간 WAS-2로 옮겨갈 수도 있습니다.

서버가 흩어져 있어도 상관없습니다.


서버는 각 인스턴스에서 보낸 HLL의 '스케치(데이터 조각)'를 하나로 합쳐

전체 관점에서 단 한 명의 사용자로 정확히 판별해냅니다.


에이전트가 2초마다 데이터를 던지고 자신을 비우는 'Read-and-Reset' 패턴

서버 측에 유연성을 선물합니다. 서버는 이 조각들을 모아 1분, 5분, 1시간 단위의 통계를

자유자재로 만들어냅니다.


우리가 대시보드에서 보는 '실시간 5분 액티브 사용자'는 이 정교한 조각 모음의 결과물입니다.




기술적 정교함이 만드는 운영의 확신


결국 기술의 정수는 '균형'에 있습니다.

100%의 정확성만을 고집하다가 모니터링 시스템 자체가 서비스의 병목이 되는 오류를 범해서는 안 됩니다.


HyperLogLog (HLL)는 우리에게 말합니다.

아주 작은 오차를 수용할 용기만 있다면,

우리는 훨씬 더 가볍고 빠르게 거대한 트래픽의 바다를 항해할 수 있다고 말이죠.


16KB라는 작은 그릇에 수백만 명의 행동을 담아내는 이 기술은,

빅데이터 시대의 제약을 해결하는 현대적 엔지니어링의 정수를 보여줍니다.


오늘 당신이 보고 있는 대시보드의 숫자 뒤에는, 이토록 치열한 확률의 마법이 숨어 있습니다.





(광고) GPU 서버 무상임대 프로모션


image.png

[NVIDIA GPU 무상임대 프로모션]





Contact Us

- MSAP.ai

- 전화 : (02) 6953 - 5427

- 팩스 : (02) 469 - 7247

- 메일 : hello@msap.ai

작가의 이전글AI는 하고 싶은데, GPU에서 멈추는 이유