정글 · 144
  1. 2025
  2. [0731] 사람은 무엇으로 사는가?2025.08.02
  3. [0730] KRAFTON Yeoksam Office2025.07.31
  4. [0729] Slowly flowing day2025.07.30
  5. [0728] What's this?2025.07.30
  6. [0726] 우리가 기다린 미래2025.07.28
  7. [0727] Lime Light2025.07.28
  8. [0722] 순살치킨 -> 치킨너겟2025.07.27
  9. [0723] IYKYK2025.07.27
  10. [0724] 폭풍의 눈2025.07.27
  11. [0725] Final approach2025.07.27
  12. [0721] TRAIN - TRAIN2025.07.25
  13. [0719] 시간이 느리게 가는 건2025.07.24
  14. [0720] 어떤 통찰도 지름길로는 얻을 수 없다2025.07.24
  15. [0718] EVEREST2025.07.23
  16. [0715] 무엇이든, 언제가는2025.07.21
  17. [0716] 이기적인 토대 위2025.07.21
  18. [0717] 깊은 사고는 더 이상 니즈가 없다2025.07.21
  19. [0714] 경험을 압축하는 알고리즘은 존재하지 않는다 ⏳2025.07.18
  20. [0712] 화려한 거짓을 향해2025.07.14
  21. [0711] Kentucky Fried Chicken 🍗2025.07.14
  22. [0713] 무한한 가능성을 가질 것2025.07.14
  23. [0710] Tropical Blue 🌊2025.07.14
  24. [0707] 누군가의 달이었기를 🌕2025.07.11
  25. [0708] 어제와 다른 하늘의 색2025.07.11
  26. [0709] 처음처럼 내 딛는2025.07.11
  27. [0706] 아직 뜯지 않은 마음 🎁2025.07.08
  28. [0705] 황금의 오솔길2025.07.07
  29. [0704] 우리는 오가는 바람2025.07.05
  30. [0703] Nic dwa razy2025.07.04
  31. [0702] Never basic2025.07.03
  32. [0701] 입꼬리올림근2025.07.02
  33. [0630] 그럼에도 불구하고2025.07.02
  34. [0628] E3i3 🛫2025.06.29
  35. [0629] 과잉포장된 자존심2025.06.29
  36. [0627] 118 ✨2025.06.28
  37. [0626] 무한 우주에 순간의 빛일지라도 🌌2025.06.28
  38. [0625] RUSH2025.06.27
  39. [0624] 그래, 우리는2025.06.26
  40. [0623] The wind blowing low2025.06.24
  41. [0622] 피어나는 마음의 꽃2025.06.23
  42. [0621] 하나는 죽고, 하나는 살았다 💡2025.06.23
  43. [0620] 초속일초2025.06.21
  44. [0619] 씨앗이 가장 고귀한 이유는2025.06.20
  45. [0617] 마음이 휑뎅그렁할 때2025.06.18
  46. [0618] Evening Primrose 🏵️2025.06.18
  47. [0616] 하나2025.06.17
  48. [0615] 강철무지개2025.06.16
  49. [0613] 13일의 금요일 ⏰2025.06.15
  50. [0614] 유람 🚉2025.06.15
  51. [0612] 백만 스물하나, 백만 스물둘2025.06.13
  52. [0609] Tampermonkey 🖥️2025.06.12
  53. [0610] 달이 아름답네요 🌕2025.06.12
  54. [0611] 경안천 🥩2025.06.12
  55. [0608] 미르 ✨2025.06.09
  56. [0606] 아르기닌 🍫2025.06.08
  57. [0607] 나 평생 꿈만을2025.06.08
  58. [0605] 변속주 🌃2025.06.06
  59. [0604] Global Running Day 🏃‍2025.06.06
  60. [0603] 가장 밝은 별2025.06.05
  61. [0602] 천천히 🌃2025.06.04
  62. [0601] circular metal ring 🏀2025.06.03
  63. [0531] 담장과 쪽문 🐋2025.06.01
  64. [0529] 출발선 🏃2025.05.31
  65. [0530] 투표런 🚀2025.05.31
  66. [0527] SET 🎂2025.05.29
  67. [0528] Post Traumatic Growth 🌠2025.05.29
  68. [0526] READY 📅2025.05.28
  69. [0525] 청복 💙2025.05.26
  70. [0522] 유로파 🍏2025.05.25
  71. [0523] 강제 푸시 반성합니다 🔁2025.05.25
  72. [0524] 열복 🫀2025.05.25
  73. [0521] 떠오름과 저묾 🌞2025.05.23
  74. [0520] Family Friend Fools2025.05.22
  75. [0519] Time machine ⏰2025.05.20
  76. [0517] 흐린 토요일 🐢2025.05.18
  77. [0518] 맑은 일요일 🧼2025.05.18
  78. [0515] 셋이 만드는 하나 🧭2025.05.17
  79. [0516] PTG 🌧️2025.05.17
  80. [0513] 오십삼 🌤️2025.05.15
  81. [0514] Lotte+Cafeteria 🍔2025.05.15
  82. [0512] 일장춘몽 💊2025.05.14
  83. [0511] 𝑬𝒗𝒆𝒓𝒍𝒂𝒏𝒅, 𝑬𝒗𝒆𝒓 𝑴𝒊𝒏𝒅 🎡2025.05.12
  84. [0509] Your Journey Starts Here 🪧2025.05.11
  85. [0510] 五月雨よ 🌧2025.05.11
  86. [0508] 「권의 속도」 📄2025.05.10
  87. [0506] 놀자판 하루 🐷2025.05.08
  88. [0507] Quiet Air ⏳2025.05.08
  89. [0505] 뭔데이 🎏2025.05.06
  90. [0504] After School 🎒2025.05.05
  91. [0503] 나침반이 가리킨 곳 🌌2025.05.05
  92. [0502] 짧은 하루 📖2025.05.03
  93. [0501] 예고된 악재는 악재가 아니다 🌧️2025.05.02
  94. [0430] Can More 🍧2025.05.01
  95. [0429] 초급반 🏃‍2025.04.30
  96. [0427] 맥도날드 원정 🍔2025.04.29
  97. [0428] 감사합니다. 죄송합니다. 🙏2025.04.29
  98. [0425] Sunny Day 🌞2025.04.28
  99. [0426] 무용(無用)의 쓸모 🛤️2025.04.28
  100. [0424] 벚나무 아래에서 🌸2025.04.26
  101. [0422] D-100 🧑‍💻2025.04.24
  102. [0423] 언제나 이타카를 마음에 두라 🌿2025.04.24
  103. [0421] 수상한 미용실 💇‍♂️2025.04.22
  104. [0420] 손으로 컴퓨터를 마주하다🔧2025.04.21
  105. [0419] 비가 오면 빨래를 하자 🌧️2025.04.20
  106. [0418] 반차😴2025.04.19
  107. [0416] 반티 발주👕2025.04.18
  108. [0415] 첫 달리기🏃‍2025.04.18
  109. [0417] 발표, 청소, 러닝🗣️2025.04.18
  110. [0414] 선택과 해석🗳️2025.04.15
  111. [0413] Home Sweet Home🏠2025.04.14
  112. [0412] 人生2025.04.12
  113. [0410] 알고리즘의 끝, C언어의 시작🧭2025.04.11
  114. [0411] 반티 디자인 공모 & 제출👕2025.04.11
  115. [0409] 하와이안 스테이크🥩2025.04.10
  116. [0407] Es irrt der Mensch, solang' er strebt.📚2025.04.08
  117. [0408] Long Chat (#🎮)2025.04.08
  118. [0405] 움직이는 물체의 시간은 느리게 간다💤2025.04.06
  119. [0406] 마무리🛌2025.04.06
  120. [0404] 하나의 칼날🗡️2025.04.05
  121. [0403] 3x7=21🧗2025.04.04
  122. [0402] 퀴즈 다음날, 시험 전날😴2025.04.03
  123. [0401] April Fools' Day🎭2025.04.02
  124. [0331] 1년의 90번째 날🌅2025.04.01
  125. [0330] 日曜日은 칠요일 중 첫째 날 이다⏰ 2025.03.31
  126. [0329] 토요일은 주말이 아니다☕2025.03.30
  127. [0328] 그래프와 치킨버거🐔2025.03.28
  128. [0327] 3주차의 시작🗓️2025.03.27
  129. [0326] 기초 다지기🔧2025.03.26
  130. [0325] 기초 다지기 & 정리해야 할 CS 개념들💡2025.03.26
  131. [0324] 0.44%2025.03.25
  132. [0323] 본가 다녀온 날🏡2025.03.23
  133. [0322] 문제 풀이에 집중한 하루 📅2025.03.23
  134. [0320] 첫번째 시험📝2025.03.22
  135. [0321] 동료학습🌿2025.03.22
  136. [0319] 먹다가 끝난 하루🍖2025.03.20
  137. [0318] 눈이 쌓이면 버그도 쌓인다❄️2025.03.19
  138. [0316] 외출과 배달🚶🛍️2025.03.17
  139. [0315] 첫 주말🛏️2025.03.17
  140. [0317] 깃허브, 팀별 면담, 키워드 공부👨‍💻2025.03.17
  141. [0310] 입소 당일📅2025.03.15
  142. [0312] 디지털 포춘쿠키🍪2025.03.15
  143. [0311] 정글 입성🏕2025.03.15
  144. [0313] cookie4u.store🍪 + 1주차 발제📚 + 회식🍺2025.03.15
  145. [0314] 컴퓨팅 사고로의 전환🧠2025.03.15

[0714] 경험을 압축하는 알고리즘은 존재하지 않는다 ⏳

2025.07.18 · 정글

오늘은 클릭하우스를 듀얼 클러스터로 만들어서 쓰기 전용과 읽기 전용으로 데이터 베이스를 나누는 작업을 진행했다.

이를 CQRS(command query responsibility segregation,명령 쿼리 책임 분리)라고 한다.

우리가 데이터 베이스를 클릭하우스로 선택한 이유를 설명하려면 우리가 뭘 하는질 알아야하는데

클릭랩은 클릭스트림이라고 불리는 웹사이트 사용자 행동 데이터를 초고속으로 수집 분석하는 웹 애널리틱스 플랫폼이다(구글 애널리틱스같은)

이런 주제 특성상 다음과 같은 요구사항이 있는데

이처럼 수많은 이벤트를 빠르게 기록하고 대용량 데이터를 효율적으로 분석해야 하는 환경에서

일반적인 관계형 데이터베이스로는 초당 수만 건의 데이터를 빠르게 쓰기 어렵고

복잡한 조건의 분석 쿼리를 처리하면 금방 느려지는 문제가 생길 것이라고 생각했다

그래서 찾아보다 발견한게 클릭하우스이다

클릭하우스는 컬럼 지향 저장 방식과 벡터화된 실행 엔진을 기반으로 대규모 데이터를 초고속으로 집계하고 필터링할 수 있는 성능을 갖추고 있다

즉 프로젝트 클릭랩에 가장 적합한 선택지처럼 보였다.

페이즈2로 넘어오면서 CQRS를 할 수 밖에 없었던 이유는

클릭랩의 시스템은 한쪽으로는 수십만 건의 사용자 행동 이벤트를 지연 없이 받아들여야 하고

다른 한쪽으로는 복잡한 조건으로 사용자 흐름을 분석하거나 시각화해야 하는 이중적인 요구를 동시에 만족시켜야 하기 때문인데

이 두 가지 작업은 기술적으로 성격이 완전히 다르다 쓰기 작업은 단순하지만 고빈도이고 읽기 작업은 빈도는 낮지만 계산이 복잡하고 리소스를 많이 사용한다

하나의 데이터베이스에 이 두 작업을 동시에 처리하려고 하면 성능 병목이나 데이터 유실의 위험이 존재하게 되고

실제로 API게이트웨이 병목으로 인한 접근 차단과 80%수준의 데이터 전송율을 통해서 직접 경험해보았기 때문에 단일 데이터베이스의 문제점을 체감했다

이를 해결하기 위해 CQRS패턴을 도입한것이다 즉, 쓰기 전용 인스턴스와 읽기 전용 인스턴스를 분리하여 데이터베이스의 분업화를 이룬 것이다

쓰기 전용 데이터베이스는 오직 이벤트 수집에 집중할 수 있도록 설계되어 SDK를 통해 수집된 클릭스트림 데이터는 쓰기전용 데이터베이스에 쌓이고

읽기 전용 데이터베이스는 쿼리 최적화와 캐싱 분석에 집중하여 프론트엔드(대시보드)와 연결되어있다.

그리고 그 둘을 동기화 시켜주기위해 클릭하우스 키퍼라는 개념또한 도입하였다.

키퍼는 쉽게 말해서 조율 도구이다

여러 데이터 베이스 인스턴스가 서로 동시기화 할때 헷갈리지 않게, 데이터를 올바르게 복제-동기화할 수 있도록 해주는 중심축이라고 보면 된다.

우리 클릭랩은 읽기전용 서버와 쓰기 전용 서버를 분리해 놓았는데 고객사 프론트에 설치된 SDK를 통해 발생한 이벤트는 먼저 우리 쓰기 전용 서버에 쓰여지고 읽기 전용 서버는 업데이트되는 쓰기 전용 서버의 데이터를 따라잡기 위해 ReplicatedMergeTree라는 엔진을 사용한다.

이 엔진은 쓰기 전용 서버의 데이터를 보면서 어떤 데이터가 새로 생겼는지 어떤 파티션이 병합됐는지 같은 걸 추적한다

그걸 키퍼를 통해 주기적으로 동기화하면서 읽기 전용 서버가 항상 최신 데이터를 갖고 있도록 해주는 것이다

결국 키퍼가 있어야, 읽기 전용 서버가 안정적으로 분석 쿼리를 처리하면서도 쓰기 서버와 데이터 불일치 없이 잘 따라갈 수 있는 구조가 만들어진다는 것.

이렇게 CQRS구현이 끝나고 이제 오토스케일링 그룹의 시작 템플릿을 만져야 했는데…

시작 템플릿은 나를 밤새게 했다…

월요일과 화요일의 기억은 오로지 시작 템플릿 뿐이다.

경험을 압축하는 알고리즘은 존재하지 않는다.

AWS가 이야기하는 격언으로서, 인류를 지속적으로 진화시키는 것은 ‘직감’이 아닌, ‘직접 겪은 경험을 기반으로 한 데이터와 사고방식’이라는 뜻에서 유래되었다. 실제로 아마존은 타 회사들을 압도적으로 상회하는 수준의 Data-Driven 사고방식을 보여준다.