<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>developer_Ryu</title>
    <link>https://squash29.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 23 Sep 2026 05:14:16 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Ry-</managingEditor>
    <image>
      <title>developer_Ryu</title>
      <url>https://tistory1.daumcdn.net/tistory/5921206/attach/b5c86ad9859c45879d3d6b9d2720713f</url>
      <link>https://squash29.tistory.com</link>
    </image>
    <item>
      <title>AWS 2026 컨퍼런스 후기</title>
      <link>https://squash29.tistory.com/96</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;되게 늦게 후기글을 작성합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS 2026년 컨퍼런스&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS 컨퍼런스는 5월20~21일 삼성 코엑스에서 진행되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에 친구 회사가 거기서 부스를 열게되서 구경도하고 기업들이 AWS의 서비스를 어떻게 사용하는지를 알아보기 위해 갔습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신청 당시에 21일로 잡혔는데 다시 신청하게 되어 20일까지 확정 받았습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;739&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5MdlM/dJMcac4scE4/dpTz88b3ERMOjWnFlpAxkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5MdlM/dJMcac4scE4/dpTz88b3ERMOjWnFlpAxkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5MdlM/dJMcac4scE4/dpTz88b3ERMOjWnFlpAxkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5MdlM%2FdJMcac4scE4%2FdpTz88b3ERMOjWnFlpAxkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;540&quot; height=&quot;535&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;739&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZ0NUG/dJMcabdnbpc/ZLt5sdGigxcIN5sephMXjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZ0NUG/dJMcabdnbpc/ZLt5sdGigxcIN5sephMXjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZ0NUG/dJMcabdnbpc/ZLt5sdGigxcIN5sephMXjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZ0NUG%2FdJMcabdnbpc%2FZLt5sdGigxcIN5sephMXjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;694&quot; height=&quot;925&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아침 8시 30분쯤인데 벌써 사람들이 많이 서 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;다시 한번 AWS의 위엄을 느꼈다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Qn6QT/dJMcaiQ8KXV/gfXcdmOVkY41GMog7vOaFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Qn6QT/dJMcaiQ8KXV/gfXcdmOVkY41GMog7vOaFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Qn6QT/dJMcaiQ8KXV/gfXcdmOVkY41GMog7vOaFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQn6QT%2FdJMcaiQ8KXV%2FgfXcdmOVkY41GMog7vOaFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;660&quot; height=&quot;495&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기를 들어가게 되면 기조연설하는 장소로 넘어오게됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의자가 엄청 많이 깔려있었는데 그 많은 의자들이 연설 시작하자 다 채워졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기조 연설장에는 의자에 헤드셋을 통해 자동 통역을 해주었습니다. 그 밖에도 바로바로 화면에서 번역되어 나오기 때문에 큰 걱정없이 발표를 들을수 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Upstage에서는 절차형 AI와 자율형 AI에 대한 내용을 소개하면서 Upstage가 가고자 하는 방향과 AWS를 서비스에 도입한 결과를 설명해주었다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biKEeh/dJMcahrdCj5/Fx7f9npW8MKyK9D8prdSF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biKEeh/dJMcahrdCj5/Fx7f9npW8MKyK9D8prdSF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biKEeh/dJMcahrdCj5/Fx7f9npW8MKyK9D8prdSF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiKEeh%2FdJMcahrdCj5%2FFx7f9npW8MKyK9D8prdSF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;692&quot; height=&quot;519&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Uk2xs/dJMcacKdShM/gFjBGlgNRmvqDHCFezvHPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Uk2xs/dJMcacKdShM/gFjBGlgNRmvqDHCFezvHPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Uk2xs/dJMcacKdShM/gFjBGlgNRmvqDHCFezvHPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUk2xs%2FdJMcacKdShM%2FgFjBGlgNRmvqDHCFezvHPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;695&quot; height=&quot;521&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주된 포인트가 AI-DLC 라는 SDLC의 개념을 넘는 AI-DLC의 세계가 오면서 현재 우리 IT 업계가 도입해야될 방법론에 대해서 잘 알려준거 습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이어서 작년 12월 라스베가스에서 소개되었던&amp;nbsp; 새롭게 개발된 AWS 서비스 기술들이 소개 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5pN1u/dJMcahdFadB/bzNUNyoONqkLcfUj2c5PFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5pN1u/dJMcahdFadB/bzNUNyoONqkLcfUj2c5PFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5pN1u/dJMcahdFadB/bzNUNyoONqkLcfUj2c5PFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5pN1u%2FdJMcahdFadB%2FbzNUNyoONqkLcfUj2c5PFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;745&quot; height=&quot;559&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTgcrf/dJMcabEt0c3/cOVkB9SmgXqcPSN5YInIfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTgcrf/dJMcabEt0c3/cOVkB9SmgXqcPSN5YInIfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTgcrf/dJMcabEt0c3/cOVkB9SmgXqcPSN5YInIfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTgcrf%2FdJMcabEt0c3%2FcOVkB9SmgXqcPSN5YInIfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;540&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 부분에서 대해서 따로 알아보며 나의 스킬을 높여보는것도 좋은 기회가 될거 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연설을 다 듣고나서 C룸으로 이동해 다양한 기업들의 부스들을 살펴보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부스들 돌아다니면서 관심있었던 모니터링, 보안쪽 파트를 위주로 살펴보았고 궁금했던 내용도 물어보면서 다녔습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로&amp;nbsp;POSCO 광양제철소 설비 예지정비 혁신: AWS KiroS- MLOps 세션을 듣고 나왔습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CVuQg/dJMcahrdCGc/BF5d87erkAikXPUNoUA9S1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CVuQg/dJMcahrdCGc/BF5d87erkAikXPUNoUA9S1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CVuQg/dJMcahrdCGc/BF5d87erkAikXPUNoUA9S1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCVuQg%2FdJMcahrdCGc%2FBF5d87erkAikXPUNoUA9S1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;652&quot; height=&quot;869&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mhkJc/dJMcaar5c1Q/WkPGDVjlz0KPKq54Wk4Nd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mhkJc/dJMcaar5c1Q/WkPGDVjlz0KPKq54Wk4Nd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mhkJc/dJMcaar5c1Q/WkPGDVjlz0KPKq54Wk4Nd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmhkJc%2FdJMcaar5c1Q%2FWkPGDVjlz0KPKq54Wk4Nd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;661&quot; height=&quot;881&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kS1eP/dJMcabYPT1R/2ju7zF7vjZoHJwJKKZVE3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kS1eP/dJMcabYPT1R/2ju7zF7vjZoHJwJKKZVE3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kS1eP/dJMcabYPT1R/2ju7zF7vjZoHJwJKKZVE3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkS1eP%2FdJMcabYPT1R%2F2ju7zF7vjZoHJwJKKZVE3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;667&quot; height=&quot;889&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음으로 AWS 컨퍼런스에 참석하느냐 제대로 즐기질 못했던거 같습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음에 또 컨퍼런스를 하게된다면 또 오고 싶고 다들 한번씩 경험해보면 좋을거 같습니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하고 공부할게 많다는걸 다시 한번 배운 하루였습니다&lt;/p&gt;</description>
      <category>이것저것</category>
      <author>Ry-</author>
      <guid isPermaLink="true">https://squash29.tistory.com/96</guid>
      <comments>https://squash29.tistory.com/96#entry96comment</comments>
      <pubDate>Tue, 9 Jun 2026 22:51:42 +0900</pubDate>
    </item>
    <item>
      <title>Grafana Mimir 아키텍처</title>
      <link>https://squash29.tistory.com/95</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Prometheus 호환 대규모 TSDB 4대장(Thanos, Cortex, VictoriaMetrics, Mimir) 비교 및 Mimir 내부 원리 정리.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;4대장 비교&quot; data-ke-size=&quot;size26&quot;&gt;4대장 비교&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제품 핵심 정의 최대 장점 최대 단점&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;VictoriaMetrics&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;쓰기/저장/읽기 3개 컴포넌트의 초단순 아키텍처&lt;/td&gt;
&lt;td&gt;압도적 관리 편의성, 높은 성능&lt;/td&gt;
&lt;td&gt;Block Storage 종속 &amp;rarr; 장기 보관 비용&amp;middot;확장성 저하. Hash ring 없어 rebalancing 수동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Thanos&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;기존 Prometheus 위에 Sidecar를 얹는 확장형&lt;/td&gt;
&lt;td&gt;기존 Prometheus 환경 재사용 가능&lt;/td&gt;
&lt;td&gt;신규 구축 시 아키텍처 기형. 실시간 분산 집계 병목&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Grafana Mimir&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;처음부터 대규모를 타깃한 Object Storage 네이티브 분산 클러스터&lt;/td&gt;
&lt;td&gt;무한 확장성, Query Frontend 조회 속도, 철저한 멀티테넌시&lt;/td&gt;
&lt;td&gt;마이크로서비스 컴포넌트 多 &amp;rarr; 운영 복잡도 높음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Cortex&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Mimir의 모태인 1세대 분산 TSDB&lt;/td&gt;
&lt;td&gt;검증된 아키텍처&lt;/td&gt;
&lt;td&gt;Grafana Labs의 Mimir 집중으로 사실상 deprecated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Mimir를 선택한 이유&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Cortex co-author + 주요 contributor가 Grafana 소속 &amp;rarr; Cortex 기여 87%가 Grafana&lt;/li&gt;
&lt;li&gt;Prometheus 확장에서 진화한 Thanos와 달리 &lt;b&gt;처음부터 대규모 설계&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Grafana(metric consumer 압도적 1위)와의 유착 관계&lt;/li&gt;
&lt;li&gt;Loki, Tempo와 아키텍처&amp;middot;컴포넌트 이름을 공유 &amp;rarr; 운영 지식 재사용&lt;/li&gt;
&lt;li&gt;PromQL 100% 호환 (VictoriaMetrics는 74%)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;전체 파이프라인 구조&quot; data-ke-size=&quot;size26&quot;&gt;전체 파이프라인 구조&lt;/h2&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;쓰기
[Prometheus scrape / OTEL Collector]
          │ remote_write
          ▼
    ┌─── Distributor ───┐     &amp;larr; stateless. 유효성 검사 + 복제 분산
    │    Hash Ring 조회  │
    └───────────────────┘
       │           │         │
       ▼           ▼         ▼
  Ingester-1  Ingester-2  Ingester-3   &amp;larr; stateful (RF=3, Quorum=2)
  WAL + Mem   WAL + Mem   WAL + Mem
       │
  2h flush
       ▼
  Object Storage (S3 / GCS)
       │
  Compactor ─── 수직 압축(dedup) &amp;rarr; 수평 압축(merge)
       │
  Store Gateway ─── index 캐시, bucket view 유지
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;읽기
[Grafana PromQL]
       ▼
 Query Frontend  ── ① Results Cache (memcached) 확인
       │             ② 캐시 미스 &amp;rarr; FIFO Queue
       ▼
 Query Scheduler (optional) ── 큐 부하 분산
       ▼
    Querier  ── 최근: Ingester 직접 / 장기: Store Gateway &amp;rarr; S3
       │
 결과 반환 &amp;rarr; Query Frontend 병합 &amp;rarr; Grafana
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4vTcm/dJMcadIU5qA/IYfLyp72Ctvd8v1Pp3Ibp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4vTcm/dJMcadIU5qA/IYfLyp72Ctvd8v1Pp3Ibp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4vTcm/dJMcadIU5qA/IYfLyp72Ctvd8v1Pp3Ibp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4vTcm%2FdJMcadIU5qA%2FIYfLyp72Ctvd8v1Pp3Ibp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;484&quot; height=&quot;396&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;https://grafana.com/docs/mimir/latest/get-started/about-grafana-mimir-architecture/about-ingest-storage-architecture/#how-ingest-storage-architecture-works&quot;&gt;https://grafana.com/docs/mimir/latest/get-started/about-grafana-mimir-architecture/about-ingest-storage-architecture/#how-ingest-storage-architecture-works&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-heading=&quot;Write Path 상세&quot; data-ke-size=&quot;size26&quot;&gt;Write Path 상세&lt;/h2&gt;
&lt;h3 data-heading=&quot;Distributor &amp;mdash; 분산 + 복제&quot; data-ke-size=&quot;size23&quot;&gt;Distributor &amp;mdash; 분산 + 복제&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Hash Ring 동작&lt;/b&gt;:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Tenant ID + Metric Name + Labels 조합을 해시 &amp;rarr; 토큰 생성&lt;/li&gt;
&lt;li&gt;Memberlist(Gossip 프로토콜) 기반 Hash ring 조회 &amp;rarr; 담당 Ingester 3대 선택&lt;/li&gt;
&lt;li&gt;3대에 동시 전송 &amp;rarr; &lt;b&gt;과반수(2대) 응답 시 클라이언트에 성공 반환&lt;/b&gt; (Mimir의 고가용성)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Quorum 일관성&lt;/b&gt;: RF=3, Quorum=2 (N/2+1). Ingester 1대 죽어도 읽기/쓰기 모두 정상.&lt;/p&gt;
&lt;h3 data-heading=&quot;Ingester &amp;mdash; 이중 기록과 플러시&quot; data-ke-size=&quot;size23&quot;&gt;Ingester &amp;mdash; 이중 기록과 플러시&lt;/h3&gt;
&lt;pre class=&quot;mathematica&quot;&gt;&lt;code&gt;수신 샘플
    ├── in-memory Head Block (빠른 읽기용)
    └── WAL on EBS (장애 복구용)

2시간마다:
    Head Block &amp;rarr; 압축 &amp;rarr; Chunk 블록 파일
    &amp;rarr; S3 업로드 완료 후 WAL truncate
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;StatefulSet 배포 이유 2가지&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;WAL을 EBS 같은 영구 디스크에 유지해야 함&lt;/li&gt;
&lt;li&gt;Pod 고유 네트워크 Identity 유지 &amp;rarr; Querier가 2시간 이내 최신 데이터를 끊김 없이 읽어갈 수 있어야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;책 이론의 &quot;Kafka 유실 방지 버퍼&quot;&lt;/b&gt; = Mimir에서는 Ingester의 WAL이 동일 역할 수행&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;Read Path 상세&quot; data-ke-size=&quot;size26&quot;&gt;Read Path 상세&lt;/h2&gt;
&lt;h3 data-heading=&quot;Query Frontend &amp;mdash; Spiky Read 제어&quot; data-ke-size=&quot;size23&quot;&gt;Query Frontend &amp;mdash; Spiky Read 제어&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책 5장의 &quot;High Write / Spiky Read&quot; 요구사항을 query-frontend가 해결한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;① 쿼리 슈레딩 (Query Splitting)&lt;/b&gt;:&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;&quot;지난 30일 P99 레이턴시&quot; 요청
    &amp;darr; query-frontend가 1일 단위 30개 서브쿼리로 분할
    &amp;darr; 30개 병렬 실행
    &amp;darr; S3 블록도 일 단위로 분할되어 있음 &amp;rarr; 30 Querier가 각자 다른 파일 블록 읽기
    &amp;darr; Share-Nothing: 병목 전무
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;② Results Cache&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;memcached 기반 (results-cache, chunks-cache, index-cache 3종)&lt;/li&gt;
&lt;li&gt;캐시 히트 시 TSDB 조회 없이 즉시 반환&lt;/li&gt;
&lt;li&gt;책의 &quot;Redis 캐시&quot; 역할&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;③ FIFO Queue + Query Scheduler&lt;/b&gt;:&lt;/p&gt;
&lt;pre class=&quot;gcode&quot;&gt;&lt;code&gt;출근 시간 수백 명 동시 대시보드 로딩 (Spiky Read)
    &amp;darr;
FIFO Queue에 적재 (TSDB로 바로 던지지 않음)
    &amp;darr;
Querier가 CPU/메모리 여유 있을 때만 Pull
    &amp;darr;
OOM 방지, 시스템 안정성 유지
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Query Scheduler 없으면: query-frontend 수평 확장 시 큐가 인스턴스마다 분산 &amp;rarr; 불균형. Scheduler가 큐를 단일 관리.&lt;/p&gt;
&lt;h3 data-heading=&quot;Querier &amp;mdash; 데이터 소스 2원화&quot; data-ke-size=&quot;size23&quot;&gt;Querier &amp;mdash; 데이터 소스 2원화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 출처&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;최근 2시간 이내&lt;/td&gt;
&lt;td&gt;Ingester 직접 조회 (in-memory)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2시간 이상 장기&lt;/td&gt;
&lt;td&gt;Store Gateway &amp;rarr; S3 블록 조회&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Store Gateway는 stateful &amp;mdash; bucket index를 로컬 디스크에 캐싱, 주기적으로 S3와 동기화.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;Compactor 상세&quot; data-ke-size=&quot;size26&quot;&gt;Compactor 상세&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;책 이론의 &quot;저장소 계층 최적화&quot;&lt;/b&gt;를 두 단계로 구현&lt;/p&gt;
&lt;h3 data-heading=&quot;수직 압축 (Vertical Compaction) &amp;mdash; 중복 제거&quot; data-ke-size=&quot;size23&quot;&gt;수직 압축 (Vertical Compaction) &amp;mdash; 중복 제거&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;동일 시간대(2h) 블록이 Ingester RF=3 때문에 3개 존재
&amp;rarr; 타임스탬프+값 완전 일치 샘플 2개 제거
&amp;rarr; 스토리지 1/3으로 압축
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-heading=&quot;수평 압축 (Horizontal Compaction) &amp;mdash; 블록 병합&quot; data-ke-size=&quot;size23&quot;&gt;수평 압축 (Horizontal Compaction) &amp;mdash; 블록 병합&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;2h 블록 여러 개 &amp;rarr; 12h 블록 &amp;rarr; 24h 블록
인접 시간 블록 병합 &amp;rarr; 인덱스 크기 감소 &amp;rarr; 쿼리 스캔 범위 축소
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-heading=&quot;Split-and-Merge &amp;mdash; 64GiB 한계 돌파&quot; data-ke-size=&quot;size23&quot;&gt;Split-and-Merge &amp;mdash; 64GiB 한계 돌파&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Prometheus 기본 규격: 인덱스 파일 최대 64GiB 제한.&lt;br /&gt;장기 블록(24h 이상)은 이 한계를 초과할 수 있음.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Mimir 해결책:
블록 병합 시 series.hash() mod 32 &amp;rarr; 32개 샤드 블록으로 분할 출력
각 샤드는 64GiB 이하 유지
&amp;rarr; 인덱스 크기 제한 없이 무한 수평 확장 가능
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;Multi-tenancy&quot; data-ke-size=&quot;size26&quot;&gt;Multi-tenancy&lt;/h2&gt;
&lt;pre class=&quot;gauss&quot;&gt;&lt;code&gt;HTTP Header: X-Scope-OrgId: tenant-id

각 Ingester가 테넌트별 독립 TSDB 유지
Compactor도 테넌트별 독립 압축
Grafana datasource에 custom header 설정으로 테넌트 격리
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실용 활용: dev / stage / prod를 tenant로 분리 &amp;rarr; 단일 Mimir 클러스터로 3개 환경 운용 가능.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;Loki, Tempo와의 공통 아키텍처&quot; data-ke-size=&quot;size26&quot;&gt;Loki, Tempo와의 공통 아키텍처&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Grafana에서 만든 3개 백엔드가 동일한 컴포넌트 구조를 공유한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴포넌트 Mimir (Metrics) Loki (Logs) Tempo (Traces)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;수신&lt;/td&gt;
&lt;td&gt;Distributor&lt;/td&gt;
&lt;td&gt;Distributor&lt;/td&gt;
&lt;td&gt;Distributor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;저장&lt;/td&gt;
&lt;td&gt;Ingester&lt;/td&gt;
&lt;td&gt;Ingester&lt;/td&gt;
&lt;td&gt;Ingester&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;압축&lt;/td&gt;
&lt;td&gt;Compactor&lt;/td&gt;
&lt;td&gt;Compactor&lt;/td&gt;
&lt;td&gt;Compactor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;조회&lt;/td&gt;
&lt;td&gt;Querier&lt;/td&gt;
&lt;td&gt;Querier&lt;/td&gt;
&lt;td&gt;Querier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;쿼리 최적화&lt;/td&gt;
&lt;td&gt;Query Frontend&lt;/td&gt;
&lt;td&gt;Query Frontend&lt;/td&gt;
&lt;td&gt;Query Frontend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;장기 저장&lt;/td&gt;
&lt;td&gt;S3&lt;/td&gt;
&lt;td&gt;S3&lt;/td&gt;
&lt;td&gt;S3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; Mimir 운영 지식이 Loki, Tempo에 그대로 전이됨. Loki 데이터 모델도 Prometheus와 동일 (value만 float &amp;rarr; string).&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;책 이론 &amp;rarr; Mimir 구현 매핑 요약&quot; data-ke-size=&quot;size26&quot;&gt;책 이론 &amp;rarr; Mimir 구현 매핑 요약&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책 5장 이론 Mimir 구현체&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;지표 수집기&lt;/td&gt;
&lt;td&gt;Distributor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kafka 유실 방지 버퍼&lt;/td&gt;
&lt;td&gt;Ingester WAL (EBS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;수집기 해시 링 샤딩&lt;/td&gt;
&lt;td&gt;Memberlist 기반 Hash ring + Quorum&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TSDB&lt;/td&gt;
&lt;td&gt;Ingester(최근) + Store Gateway + S3(장기)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;질의 서비스&lt;/td&gt;
&lt;td&gt;Querier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redis 캐시&lt;/td&gt;
&lt;td&gt;memcached (results/chunks/index 3종)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;스파이크 읽기 제어&lt;/td&gt;
&lt;td&gt;Query Frontend FIFO Queue + Query Scheduler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;데이터 압축&lt;/td&gt;
&lt;td&gt;Compactor 수직 압축 (dedup)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;다운샘플링&lt;/td&gt;
&lt;td&gt;Compactor 수평 압축 + Split-and-Merge&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 글을 작성하기 위해 참고한 글 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://joeunvit.tistory.com/19&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://joeunvit.tistory.com/19&amp;nbsp;&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1780487052134&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Grafana mimir overview&quot; data-og-description=&quot;Grafana mimir에 대한 전반적인 자료 수집 내용을 정리해봤습니다. Grafana Labs에서 Cortex 개발을 주도하고 있었지만, Mimir를 출시하면서 Cortex는 더 이상 개발하지 않습니다. https://grafana.com/blog/2020/01/16/&quot; data-og-host=&quot;joeunvit.tistory.com&quot; data-og-source-url=&quot;https://joeunvit.tistory.com/19&quot; data-og-url=&quot;https://joeunvit.tistory.com/19&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/LvA6s/dJMb84qfY72/IsIhk6ZMet6XAbLIzaYI0k/img.png?width=800&amp;amp;height=633&amp;amp;face=0_0_800_633,https://scrap.kakaocdn.net/dn/dgAeoW/dJMb887gakQ/RJ9NVKr1cuFVC11qUDMtm1/img.png?width=800&amp;amp;height=633&amp;amp;face=0_0_800_633,https://scrap.kakaocdn.net/dn/oFdTF/dJMb85W0I0t/1UUkCUGpOzpUC9b81SbCvk/img.png?width=2000&amp;amp;height=1458&amp;amp;face=0_0_2000_1458&quot;&gt;&lt;a href=&quot;https://joeunvit.tistory.com/19&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://joeunvit.tistory.com/19&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/LvA6s/dJMb84qfY72/IsIhk6ZMet6XAbLIzaYI0k/img.png?width=800&amp;amp;height=633&amp;amp;face=0_0_800_633,https://scrap.kakaocdn.net/dn/dgAeoW/dJMb887gakQ/RJ9NVKr1cuFVC11qUDMtm1/img.png?width=800&amp;amp;height=633&amp;amp;face=0_0_800_633,https://scrap.kakaocdn.net/dn/oFdTF/dJMb85W0I0t/1UUkCUGpOzpUC9b81SbCvk/img.png?width=2000&amp;amp;height=1458&amp;amp;face=0_0_2000_1458');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Grafana mimir overview&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Grafana mimir에 대한 전반적인 자료 수집 내용을 정리해봤습니다. Grafana Labs에서 Cortex 개발을 주도하고 있었지만, Mimir를 출시하면서 Cortex는 더 이상 개발하지 않습니다. https://grafana.com/blog/2020/01/16/&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;joeunvit.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.anyflow.net/sw-engineer/prometheus-large-scale-comparison&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.anyflow.net/sw-engineer/prometheus-large-scale-comparison&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1780487059164&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Prometheus: 대용량 처리 제품 비교&quot; data-og-description=&quot;대용량 메트릭 운용을 위한 Prometheus 호환 제품 비교로 Thanos, Cortex, VictoriaMetrics, Mimir를 중심으로 다룬다. Prometheus는 대용량 처리를 위해 Federation 아키텍처를 제안하나 여러모로 제한이 있기에, 대&quot; data-og-host=&quot;www.anyflow.net&quot; data-og-source-url=&quot;https://www.anyflow.net/sw-engineer/prometheus-large-scale-comparison&quot; data-og-url=&quot;https://www.anyflow.net/sw-engineer/prometheus-large-scale-comparison&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ELVkq/dJMb9b3Zk9K/Gkd2RGe462dHnlSYmpdjeK/img.png?width=2048&amp;amp;height=851&amp;amp;face=0_0_2048_851,https://scrap.kakaocdn.net/dn/cWm9TN/dJMb9iIOeA4/3bDqzaSKPE0di95y7TVDAK/img.png?width=2048&amp;amp;height=851&amp;amp;face=0_0_2048_851&quot;&gt;&lt;a href=&quot;https://www.anyflow.net/sw-engineer/prometheus-large-scale-comparison&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.anyflow.net/sw-engineer/prometheus-large-scale-comparison&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ELVkq/dJMb9b3Zk9K/Gkd2RGe462dHnlSYmpdjeK/img.png?width=2048&amp;amp;height=851&amp;amp;face=0_0_2048_851,https://scrap.kakaocdn.net/dn/cWm9TN/dJMb9iIOeA4/3bDqzaSKPE0di95y7TVDAK/img.png?width=2048&amp;amp;height=851&amp;amp;face=0_0_2048_851');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Prometheus: 대용량 처리 제품 비교&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;대용량 메트릭 운용을 위한 Prometheus 호환 제품 비교로 Thanos, Cortex, VictoriaMetrics, Mimir를 중심으로 다룬다. Prometheus는 대용량 처리를 위해 Federation 아키텍처를 제안하나 여러모로 제한이 있기에, 대&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.anyflow.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Computer Science/CS</category>
      <author>Ry-</author>
      <guid isPermaLink="true">https://squash29.tistory.com/95</guid>
      <comments>https://squash29.tistory.com/95#entry95comment</comments>
      <pubDate>Wed, 3 Jun 2026 20:44:32 +0900</pubDate>
    </item>
    <item>
      <title>[대규모 시스템 설계2] 5장 지표 모니터링 및 경보 시스템</title>
      <link>https://squash29.tistory.com/94</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책의 이론 아키텍처 + 네이버 검색 SRE + 당근마켓 SRE 실제 구현 비교 정리&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;설계 범위 및 요구사항&quot; data-ke-size=&quot;size26&quot;&gt;설계 범위 및 요구사항&lt;/h2&gt;
&lt;h3 data-heading=&quot;처리 스케일&quot; data-ke-size=&quot;size23&quot;&gt;처리 스케일&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DAU 1억 명 기준&lt;/li&gt;
&lt;li&gt;서버 풀 1,000개 &amp;times; 풀당 서버 100대 &amp;times; 서버당 지표 100개 = &lt;b&gt;천만 개 지표&lt;/b&gt; 수집&lt;/li&gt;
&lt;li&gt;데이터 보관 및 다운샘플링 정책:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;~ 7일    : Raw 그대로 보관 (실시간성 확보)
7 ~ 30일 : 1분 단위로 롤업(Roll-up) 후 보관
30일 ~ 1년: 1시간 단위로 다운샘플링 후 콜드 스토리지
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-heading=&quot;비기능 요구사항&quot; data-ke-size=&quot;size23&quot;&gt;비기능 요구사항&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;High Write / Spiky Read&lt;/b&gt;: 초당 수백만 건 쓰기, 읽기는 대시보드 조회/경보 시점에만 일시 폭증&lt;/li&gt;
&lt;li&gt;&lt;b&gt;낮은 질의 레이턴시&lt;/b&gt;: 대시보드 로딩과 경보 평가 신속 처리&lt;/li&gt;
&lt;li&gt;&lt;b&gt;안정성&lt;/b&gt;: 과부하 상태에서도 중요 경보 절대 누락 금지&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;데이터 모델&quot; data-ke-size=&quot;size26&quot;&gt;데이터 모델&lt;/h2&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;// 지표 이름 + 라벨(Key-Value) + 타임스탬프 + 값
cpu.load {host: &quot;server-i631&quot;, env: &quot;prod&quot;, zone: &quot;us-west&quot;} -&amp;gt; [1685670000, 65%]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-heading=&quot;⚠️ 카디널리티 폭발 (Cardinality Explosion) &amp;mdash; 반드시 주의&quot; data-ke-size=&quot;size23&quot;&gt;⚠️ 카디널리티 폭발 (Cardinality Explosion) &amp;mdash; 반드시 주의&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라벨에 user_id, request_id 같이 무한히 변하는 값을 넣으면 TSDB 인덱스가 메모리를 초과(OOM)해서 전체 모니터링 시스템이 다운된다. &lt;b&gt;라벨의 고유 조합은 반드시 제한&lt;/b&gt;해야 한다. (샘플링 or mimir -&amp;gt; 컴팩터 이용)&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;전체 아키텍처 파이프라인&quot; data-ke-size=&quot;size26&quot;&gt;전체 아키텍처 파이프라인&lt;/h2&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;[지표 출처 / 에이전트]
        │
   (Pull / Push)
        ▼
[지표 수집기] ──(해시 링으로 샤딩)──&amp;gt; [수집기 클러스터]
        │
   (안전한 버퍼링)
        ▼
[Apache Kafka] ──&amp;gt; [스트림 처리 서비스] ──&amp;gt; [TSDB]
                                                │
                              ┌─────────────────┴──────────────────┐
                              ▼                                     ▼
                    [질의 서비스 + 캐시]                    [경보 관리자]
                              │                                     │
                              ▼                                     ▼
                     [시각화 (Grafana)]                  [Kafka] ──&amp;gt; [알림 채널]
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;수집 모델: Pull vs Push&quot; data-ke-size=&quot;size26&quot;&gt;수집 모델: Pull vs Push&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;항목 Pull 모델 (Prometheus) Push 모델 (CloudWatch, Datadog)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;방식&lt;/td&gt;
&lt;td&gt;수집기가 대상 서버를 주기적으로 스크랩&lt;/td&gt;
&lt;td&gt;에이전트가 수집기로 직접 전송&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;상태 진단&lt;/td&gt;
&lt;td&gt;쉬움 (안 오면 죽은 것)&lt;/td&gt;
&lt;td&gt;별도 헬스체크 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;짧은 생명주기 프로세스&lt;/td&gt;
&lt;td&gt;불리 (스크랩 전 종료 가능)&lt;/td&gt;
&lt;td&gt;유리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;방화벽 복잡 환경&lt;/td&gt;
&lt;td&gt;불리&lt;/td&gt;
&lt;td&gt;유리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;프로토콜&lt;/td&gt;
&lt;td&gt;TCP (오버헤드 낮음)&lt;/td&gt;
&lt;td&gt;UDP (지연 낮음)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;데이터 신뢰성&lt;/td&gt;
&lt;td&gt;미리 정의된 지표만 수집&lt;/td&gt;
&lt;td&gt;인증 강제 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;대규모 Pull 모델의 확장법&lt;/b&gt;: 수집기를 &lt;b&gt;일관된 해시 링(Consistent Hashing Ring)&lt;/b&gt;으로 묶어 특정 수집기가 특정 서버군만 전담하도록 분산 샤딩.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;카프카 &amp;mdash; 유실 방지 버퍼&quot; data-ke-size=&quot;size26&quot;&gt;카프카 &amp;mdash; 유실 방지 버퍼&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수집기와 TSDB 사이에 Kafka를 두는 이유:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TSDB 장애 시에도 데이터 유실 없이 Kafka가 보관&lt;/li&gt;
&lt;li&gt;수집/처리 컴포넌트 사이의 결합도 감소&lt;/li&gt;
&lt;li&gt;지표 이름/라벨 기준으로 파티션 분리 &amp;rarr; 컨수머 그룹 병렬 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;데이터 집계 지점 3가지&quot; data-ke-size=&quot;size26&quot;&gt;데이터 집계 지점 3가지&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방식 특징 단점&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;수집 에이전트에서 집계&lt;/td&gt;
&lt;td&gt;클라이언트 측, 단순 집계만 가능&lt;/td&gt;
&lt;td&gt;복잡한 집계 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;파이프라인에서 집계&lt;/td&gt;
&lt;td&gt;저장 전 처리&lt;/td&gt;
&lt;td&gt;원본 데이터 소실&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;질의 시 집계&lt;/td&gt;
&lt;td&gt;Raw 보관 후 필요할 때 집계&lt;/td&gt;
&lt;td&gt;&lt;b&gt;속도 느림&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-heading=&quot;1. 클라이언트(에이전트)에서 집계&quot; data-ke-size=&quot;size23&quot;&gt;1. 클라이언트(에이전트)에서 집계&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱 프로세스 &lt;b&gt;안에서&lt;/b&gt; 이미 집계된 값을 노출하는 방식.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Prometheus client library&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;# SDK가 내부적으로 버킷별 카운트를 누적 집계
histogram = Histogram('http_request_duration_seconds',
                       buckets=[0.1, 0.5, 1.0, 2.0])
histogram.observe(0.3)  # SDK가 0.1~0.5 버킷 카운트 +1
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Prometheus가 /metrics를 스크랩하면 이미 집계된 _bucket, _sum, _count만 받음. raw 요청 데이터는 존재하지 않음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;OTEL SDK&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;views:
  - selector:
      instrument_name: http.server.duration
    aggregation:
      type: explicit_bucket_histogram
      boundaries: [0.1, 0.5, 1.0]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한계&lt;/b&gt;: 각 인스턴스가 자기 것만 집계 &amp;rarr; 서비스 전체 합산 불가. 퍼센타일 정밀도 낮음.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-heading=&quot;2. 파이프라인에서 집계&quot; data-ke-size=&quot;size23&quot;&gt;2. 파이프라인에서 집계&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터가 TSDB에 들어가기 &lt;b&gt;전&lt;/b&gt; 중간 단계에서 집계.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;OTEL Collector&lt;/b&gt; &amp;mdash; 파이프라인 집계의 대표 도구&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;processors:
  groupbyattrs:           # 수천 개 파드를 service 단위로 합산
    keys: [service.name, env]
  metricstransform:
    transforms:
      - include: http_requests_total
        action: update
        operations:
          - action: delete_label_value
            label: pod_id   # 고카디널리티 라벨 제거
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;[파드 1000개 &amp;rarr; http_requests{pod_id=&quot;xxx&quot;}]
        &amp;darr;  OTEL Collector groupbyattrs
[service=&quot;order-api&quot; 단위 시계열 1개]
        &amp;darr;  TSDB
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Prometheus Recording Rules&lt;/b&gt; (Prometheus의 파이프라인 집계에 해당)&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;groups:
  - name: aggregations
    interval: 1m
    rules:
      - record: service:http_requests:rate5m   # 미리 계산해 새 시계열로 저장
        expr: sum(rate(http_requests_total[5m])) by (service)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Grafana가 service:http_requests:rate5m을 조회하면 raw 데이터를 건드리지 않음 &amp;rarr; 네이버 VictoriaMetrics Pre-calculate에서 &lt;b&gt;10배 성능&lt;/b&gt; 개선.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한계&lt;/b&gt;: 저장 전 집계면 원본 소실 &amp;rarr; 나중에 &quot;파드별로 다시 보고 싶다&quot;가 불가능.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-heading=&quot;3. 질의 시 집계&quot; data-ke-size=&quot;size23&quot;&gt;3. 질의 시 집계&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Raw 데이터를 그대로 저장해두고, 조회할 때마다 집계.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Prometheus PromQL&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;axapta&quot;&gt;&lt;code&gt;# Grafana 대시보드 로딩 시마다 실행
sum(rate(http_requests_total[5m])) by (service)
# 1000개 파드 &amp;times; 5분치 raw 데이터를 매번 스캔해서 합산
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Thanos / Cortex (대규모 분산 Prometheus)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;[Prometheus 샤드 A] ──┐
[Prometheus 샤드 B] ──┼──&amp;rarr; Thanos Querier ──&amp;rarr; PromQL 실행 (질의 시 합산)
[Prometheus 샤드 C] ──┘
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 샤드는 raw를 보관, Thanos가 조회 시점에 분산 집계 &amp;rarr; 당근마켓 Cortex가 이 패턴.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한계&lt;/b&gt;: 조회할 때마다 수백만 포인트 스캔 &amp;rarr; 대시보드 로딩 느림. 아키텍처에서 Redis 캐시로 흡수하는 이유.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-heading=&quot;3가지 비교 정리&quot; data-ke-size=&quot;size23&quot;&gt;3가지 비교 정리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트 집계 파이프라인 집계 질의 시 집계&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;도구 예시&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Prometheus SDK, OTEL SDK&lt;/td&gt;
&lt;td&gt;OTEL Collector, Recording Rules&lt;/td&gt;
&lt;td&gt;PromQL, Thanos Querier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;원본 보존&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;TSDB 부하&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;낮음&lt;/td&gt;
&lt;td&gt;낮음&lt;/td&gt;
&lt;td&gt;높음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;유연성&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;낮음&lt;/td&gt;
&lt;td&gt;중간&lt;/td&gt;
&lt;td&gt;높음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;속도&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;빠름&lt;/td&gt;
&lt;td&gt;빠름&lt;/td&gt;
&lt;td&gt;느림&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-heading=&quot;실제 운용 패턴 (혼합 사용)&quot; data-ke-size=&quot;size23&quot;&gt;실제 운용 패턴 (혼합 사용)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;소규모&lt;/b&gt; &amp;mdash; Prometheus 단독&lt;/p&gt;
&lt;pre class=&quot;gcode&quot;&gt;&lt;code&gt;앱(SDK 집계) &amp;rarr; Prometheus scrape &amp;rarr; PromQL 질의 시 집계
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;중간 규모&lt;/b&gt; &amp;mdash; Prometheus + Recording Rules&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;앱(SDK 집계) &amp;rarr; Prometheus scrape &amp;rarr; Recording Rules 선행 계산 &amp;rarr; PromQL
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 네이버 VictoriaMetrics Pre-calculate 패턴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;대규모&lt;/b&gt; &amp;mdash; OTEL + Thanos/Cortex&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;앱(OTEL SDK) &amp;rarr; OTEL Collector(파이프라인 집계, 라벨 정리) &amp;rarr; Prometheus 샤드(raw) &amp;rarr; Thanos(질의 시 분산 집계)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 당근마켓 Cortex 패턴의 변형&lt;/p&gt;
&lt;h2 data-heading=&quot;선행 계산 (Pre-aggregation) &amp;mdash; 핵심 성능 기법&quot; data-ke-size=&quot;size26&quot;&gt;선행 계산 (Pre-aggregation) &amp;mdash; 핵심 성능 기법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대시보드를 열 때마다 수만 대 서버 지표를 실시간 합산하면 TSDB가 터진다.&lt;br /&gt;백그라운드에서 &lt;b&gt;무거운 쿼리를 미리 실행해 단일 타임 시리즈로 저장&lt;/b&gt;해두는 방식.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Prometheus: &lt;b&gt;레코딩 룰(Recording Rules)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;VictoriaMetrics: &lt;b&gt;프리컴퓨터(Pre-calculate)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;InfluxDB: &lt;b&gt;Continuous Tasks&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;질의 서비스 + 캐시 계층&quot; data-ke-size=&quot;size26&quot;&gt;질의 서비스 + 캐시 계층&lt;/h2&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;[그라파나 / 시각화]
        │
[질의 API 서버] ──&amp;gt; [Redis 캐시] ──(캐시 히트)──&amp;gt; 즉시 반환
        │
   (캐시 미스)
        ▼
      [TSDB]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수많은 개발자가 동시에 같은 대시보드를 열 때 TSDB 부하를 Redis 캐시로 흡수.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;경보 시스템&quot; data-ke-size=&quot;size26&quot;&gt;경보 시스템&lt;/h2&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;[경보 설정 캐시]
       │
[경보 관리자] ──&amp;gt; [질의 서비스] ──&amp;gt; (이상 감지)
                                          │
                              [경보 저장소 (Cassandra)]
                                          │
                                       [Kafka]
                                          │
                              [경보 소비자] ──&amp;gt; 슬랙/이메일/PagerDuty
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-heading=&quot;경보 관리자 핵심 기능&quot; data-ke-size=&quot;size23&quot;&gt;경보 관리자 핵심 기능&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기능 설명&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;중복 제거 (Deduplication)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;수백 대 파드에서 동일 에러가 동시 발생 &amp;rarr; 단 하나의 알람으로 묶어서 전송&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;침묵 (Silencing)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;인지된 점검/작업 중 특정 알람 뮤트 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;그루핑 (Grouping)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;관련 경보들을 하나로 묶어 맥락 파악 용이&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;저장소 계층 최적화&quot; data-ke-size=&quot;size26&quot;&gt;저장소 계층 최적화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기법 설명&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;데이터 압축&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Gorilla 압축, 델타 인코딩으로 디스크 I/O&amp;middot;용량 절감&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;다운샘플링&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;오래된 데이터는 해상도 낮춰서 저장 (1분 &amp;rarr; 1시간 단위)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;콜드 스토리지&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;오래된 다운샘플링 데이터를 S3 등 저렴한 스토리지로 이동&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;이론 vs 실제 기업 구현 비교&quot; data-ke-size=&quot;size26&quot;&gt;이론 vs 실제 기업 구현 비교&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설계 항목 책 이론 네이버 검색 SRE 당근마켓 SRE&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;규모&lt;/td&gt;
&lt;td&gt;DAU 1억, 천만 지표&lt;/td&gt;
&lt;td&gt;수만 대 물리 장비, 수백 서비스&lt;/td&gt;
&lt;td&gt;MAU 1,800만, 400개 워크로드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TSDB&lt;/td&gt;
&lt;td&gt;InfluxDB / Prometheus&lt;/td&gt;
&lt;td&gt;&lt;b&gt;VictoriaMetrics&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Cortex&lt;/b&gt; (프로메테우스 확장)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;수집 모델&lt;/td&gt;
&lt;td&gt;Pull/Push 선택 가이드&lt;/td&gt;
&lt;td&gt;Pull 기반 + 라벨링 커스텀&lt;/td&gt;
&lt;td&gt;로컬 프로메테우스 &lt;b&gt;샤딩&lt;/b&gt; + Cortex 집중&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;선행 계산&lt;/td&gt;
&lt;td&gt;파이프라인 집계 권장&lt;/td&gt;
&lt;td&gt;VictoriaMetrics &lt;b&gt;Pre-calculate&lt;/b&gt; (10배 성능)&lt;/td&gt;
&lt;td&gt;로키 &lt;b&gt;레코딩 룰&lt;/b&gt; (로그 캐싱)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;경보 방식&lt;/td&gt;
&lt;td&gt;배치 기반 주기적 평가&lt;/td&gt;
&lt;td&gt;배치 &amp;rarr; &lt;b&gt;스트리밍(Kafka)&lt;/b&gt; 전환&lt;/td&gt;
&lt;td&gt;Prometheus Alert + &lt;b&gt;Datadog&lt;/b&gt; 워치독&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;질의 서비스&lt;/td&gt;
&lt;td&gt;질의 서버 + Redis 캐시&lt;/td&gt;
&lt;td&gt;&lt;b&gt;RDB 쿼리 메타 테이블&lt;/b&gt; + WITH 템플릿&lt;/td&gt;
&lt;td&gt;그라파나 직접 연동 + 네임스페이스별 대시보드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;알람 관리&lt;/td&gt;
&lt;td&gt;Alert Manager 중복 제거&lt;/td&gt;
&lt;td&gt;스트리밍으로 1분 내 경보&lt;/td&gt;
&lt;td&gt;&lt;b&gt;깨진 유리창 법칙&lt;/b&gt; 기반 노이즈 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;로그 저장&lt;/td&gt;
&lt;td&gt;별도 파이프라인&lt;/td&gt;
&lt;td&gt;Loki&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Loki&lt;/b&gt; (비용 이유로 Datadog 로그 미사용)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;시각화&lt;/td&gt;
&lt;td&gt;Grafana 추천&lt;/td&gt;
&lt;td&gt;Grafana + &lt;b&gt;커스텀 쿼리 DB 연동&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Grafana + &lt;b&gt;Datadog APM&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;각 기업이 가장 집중했던 포인트&quot; data-ke-size=&quot;size26&quot;&gt;각 기업이 가장 집중했던 포인트&lt;/h2&gt;
&lt;h3 data-heading=&quot;네이버 검색 SRE &amp;mdash; &amp;quot;경보 레이턴시 최소화 + 쿼리 관리 효율화&amp;quot;&quot; data-ke-size=&quot;size23&quot;&gt;네이버 검색 SRE &amp;mdash; &quot;경보 레이턴시 최소화 + 쿼리 관리 효율화&quot;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제&lt;/b&gt;: 배치 구조로 인한 2분 30초 이상의 경보 지연.&lt;br /&gt;&lt;b&gt;해결&lt;/b&gt;: 경보 파이프라인을 메시지 큐 기반 &lt;b&gt;스트리밍 구조&lt;/b&gt;로 전환 &amp;rarr; 1분 내외 경보.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실증&lt;/b&gt;: 2022 카타르 월드컵 당시 트래픽이 &lt;b&gt;7배&lt;/b&gt; 폭증하는 순간, 경보 수신 후 &lt;b&gt;3~4분 만에&lt;/b&gt; 장애 해소. 기존 시스템이었으면 경보가 오기 전에 다른 시스템으로 장애가 전파될 수 있었던 상황.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;쿼리 관리&lt;/b&gt;: 200개 이상의 쿼리를 코드에서 분리해 &lt;b&gt;RDB 테이블로 데이터화&lt;/b&gt; + VictoriaMetrics &lt;b&gt;WITH 구문&lt;/b&gt;으로 중복 제거 &amp;rarr; 쿼리 30% 경량화, API 서버 재배포 없이 쿼리 변경 가능.&lt;/p&gt;
&lt;pre class=&quot;mathematica&quot;&gt;&lt;code&gt;Before: 코드에 쿼리 하드코딩 &amp;rarr; 변경 시 API 서버 재배포 필요
After:  RDB 쿼리 테이블 조회 &amp;rarr; DB Row 수정만으로 실시간 변경
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-heading=&quot;당근마켓 SRE &amp;mdash; &amp;quot;소수 인원의 확장성 + 비용 절감 인프라 지원&amp;quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=j_5HOboU3lk&amp;amp;t=1486s&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=j_5HOboU3lk&amp;amp;t=1486s&lt;/a&gt;&lt;/p&gt;
&lt;h3 data-heading=&quot;당근마켓 SRE &amp;mdash; &amp;quot;소수 인원의 확장성 + 비용 절감 인프라 지원&amp;quot;&quot; data-ke-size=&quot;size23&quot;&gt;당근마켓 SRE &amp;mdash; &quot;소수 인원의 확장성 + 비용 절감 인프라 지원&quot;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;구조적 선택&lt;/b&gt;: 멀티 테넌시 대신 &lt;b&gt;전사 단일 K8s 클러스터&lt;/b&gt; + 프로젝트별 네임스페이스 분리.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;역할 분리&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SRE: 인프라/네트워크/K8s 공통 영역 대시보드 (K8s 닥터, Istio 닥터) 구축&lt;/li&gt;
&lt;li&gt;개발팀: 비즈니스 지표는 Datadog/Superset으로 직접 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;깨진 유리창 법칙 기반 알람 관리&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;평상시 노이즈 관리 &amp;rarr; 진짜 장애 알람이 무시되지 않는 환경 구축&lt;/li&gt;
&lt;li&gt;에러 로그가 너무 자주 튀면 개발팀에 &quot;워닝 로그로 내려달라&quot; 요청&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;비용 절감 + 안정성 동시 달성&lt;/b&gt;:&lt;/p&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;CPU 리밋 해제   &amp;rarr; 노드 스로틀링 모니터링 강화
스팟 인스턴스   &amp;rarr; 파드 에비션 리스트 대시보드 추가
멀티 AZ         &amp;rarr; 리전 스큐(Region Skew) 모니터링 추가
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=3iLTBBC9ZX4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=3iLTBBC9ZX4&lt;/a&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;모니터링 방법론 3가지&quot; data-ke-size=&quot;size26&quot;&gt;모니터링 방법론 3가지&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방법론 제안자 핵심 지표 적합 대상&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;USE&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Brendan Gregg (Netflix)&lt;/td&gt;
&lt;td&gt;Utilization, Saturation, Errors&lt;/td&gt;
&lt;td&gt;인프라/시스템 자원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;RED&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Tom Wilkie (Google)&lt;/td&gt;
&lt;td&gt;Rate, Errors, Duration&lt;/td&gt;
&lt;td&gt;애플리케이션/서비스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;4 Golden Signals&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Google SRE Book&lt;/td&gt;
&lt;td&gt;Latency, Traffic, Errors, Saturation&lt;/td&gt;
&lt;td&gt;분산 시스템 전반&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;핵심 교훈 정리&quot; data-ke-size=&quot;size26&quot;&gt;핵심 교훈 정리&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네이버는 &lt;b&gt;선행 계산(Pre-aggregation)&lt;/b&gt; 원리를 VictoriaMetrics 프리컴퓨터로 구현해 수만 대 검색 장비의 조회 지연을 10배 개선했다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당근마켓은 &lt;b&gt;안정적 파이프라인 + 포스트모템 문화&lt;/b&gt;를 Cortex/Loki 인프라와 매주 목요일 5-Whys 회고로 실현해 지식 공유의 선순환을 만들었다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 기업 모두 오픈소스를 그대로 쓰지 않고, 자사 규모와 팀 상황에 맞게 &lt;b&gt;트레이드 오프를 선택&lt;/b&gt;하여 커스텀했다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Book</category>
      <author>Ry-</author>
      <guid isPermaLink="true">https://squash29.tistory.com/94</guid>
      <comments>https://squash29.tistory.com/94#entry94comment</comments>
      <pubDate>Wed, 3 Jun 2026 20:40:28 +0900</pubDate>
    </item>
    <item>
      <title>AWS VPC 물리서버 기준 통신 원리</title>
      <link>https://squash29.tistory.com/93</link>
      <description>&lt;h1 data-heading=&quot;AWS VPC 물리서버 기준 통신 원리&quot;&gt;AWS VPC 물리서버 기준 통신 원리&lt;/h1&gt;
&lt;p data-heading=&quot;핵심 전제 &amp;mdash; AWS 네트워크 3대 원칙&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://gasidaseo.notion.site/AWS-VPC-1f7cdcb19a784e2b97fa73466d269053#a5da4600197f438ea28970580e348c09&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://gasidaseo.notion.site/AWS-VPC-1f7cdcb19a784e2b97fa73466d269053#a5da4600197f438ea28970580e348c09&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 내용의 글을 보고 내용을 한번 정리해보았습니다. 이때 추가적으로 나오는 궁금한 사항들을 포함해서 이어서 정리해보았습니다.&lt;/p&gt;
&lt;h2 data-heading=&quot;핵심 전제 &amp;mdash; AWS 네트워크 3대 원칙&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-heading=&quot;핵심 전제 &amp;mdash; AWS 네트워크 3대 원칙&quot; data-ke-size=&quot;size26&quot;&gt;핵심 전제 &amp;mdash; AWS 네트워크 3대 원칙&lt;/h2&gt;
&lt;h3 data-heading=&quot;1. 브로드캐스트/멀티캐스트 전면 차단&quot; data-ke-size=&quot;size23&quot;&gt;1. 브로드캐스트/멀티캐스트 전면 차단&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;온프레미스에서는 모르는 MAC 주소를 찾기 위해 ffff:ffff:ffff로 브로드캐스트를 뿌린다.&lt;br /&gt;AWS 데이터센터에는 수십만 고객의 EC2가 공존하므로 이를 허용하면 전체 망이 마비된다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 3사 모두 동일: AWS(유니캐스트만), GCP(유니캐스트만), Azure(멀티캐스트/브로드캐스트 차단)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;영향 받는 온프레미스 기술들&lt;/b&gt; (클라우드에서 그대로 못 씀):&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HSRP / VRRP (라우터 이중화)&lt;/li&gt;
&lt;li&gt;Tomcat Clustering&lt;/li&gt;
&lt;li&gt;Oracle WebLogic Clustering&lt;br /&gt;&amp;rarr; 클라우드에서는 유니캐스트 기반 이중화로 대체 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-heading=&quot;2. 매핑 서버 (Mapping Service / SDN 컨트롤러)&quot; data-ke-size=&quot;size23&quot;&gt;2. 매핑 서버 (Mapping Service / SDN 컨트롤러)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브로드캐스트 없이 주소를 찾기 위한 AWS의 핵심 인프라.&lt;br /&gt;전 세계 EC2의 주민등록 DB 역할:&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;보유 정보:
  VPC ID + 가상 IP + 가상 MAC + 물리 서버 실제 IP
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하이퍼바이저가 ARP 브로드캐스트를 가로채고 &amp;rarr; 매핑 서버에 유니캐스트로 질의&lt;/li&gt;
&lt;li&gt;&lt;b&gt;권한 없는 통신 차단&lt;/b&gt;: 매핑 서버가 보안 그룹(Security Group) / NACL 규칙을 검증(Validation)하여 허용되지 않은 트래픽 차단&lt;/li&gt;
&lt;li&gt;결과를 하이퍼바이저 &lt;b&gt;매핑 캐시&lt;/b&gt;에 저장 &amp;rarr; 이후 통신은 캐시 활용 (매핑 서버 재질의 불필요)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-heading=&quot;3. 오버레이 네트워크 (Overlay Network)&quot; data-ke-size=&quot;size23&quot;&gt;3. 오버레이 네트워크 (Overlay Network)&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;EC2가 보는 세계 (가상):          실제 물리 세계:
  src: 10.1.1.1 / aa11             src: 192.168.0.1
  dst: 10.1.1.2 / aa12      &amp;rarr;      dst: 192.168.0.2
                                    (+ 가상 패킷 캡슐화)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EC2는 가상 IP/MAC만 보고, 하이퍼바이저가 물리 주소로 캡슐화(Encapsulation)하여 실제 전송.&lt;br /&gt;수신 측 하이퍼바이저가 디캡슐화(Decapsulation)하여 EC2에 전달.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캡슐화 프로토콜: &lt;b&gt;Geneve&lt;/b&gt; 또는 &lt;b&gt;VXLAN&lt;/b&gt; (AWS 내부 구현)&lt;/p&gt;
&lt;h2 data-heading=&quot;ENI (Elastic Network Interface) &amp;mdash; 가상 랜카드&quot; data-ke-size=&quot;size26&quot;&gt;ENI (Elastic Network Interface) &amp;mdash; 가상 랜카드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EC2에 붙는 가상 네트워크 인터페이스.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;EC2
 └── ENI (가상 랜카드)
       ├── 가상 IP (Private IP)
       ├── 가상 MAC
       ├── 보안 그룹 적용 지점  &amp;larr; 패킷이 ENI를 통과할 때 SG 검사
       └── EIP 연결 가능
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보안 그룹은 ENI 단위로 적용됨&lt;/li&gt;
&lt;li&gt;EC2에 ENI 여러 개 붙이기 가능 (멀티홈 구성)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-heading=&quot;1. 동일 VPC &amp;mdash; 동일 서브넷 &amp;mdash; EC2 간 통신&quot; data-ke-size=&quot;size26&quot;&gt;1. 동일 VPC &amp;mdash; 동일 서브넷 &amp;mdash; EC2 간 통신&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상황&lt;/b&gt;: 서로 다른 물리 서버에 있는 EC2-1(10.1.1.1) &amp;rarr; EC2-2(10.1.1.2) 최초 통신&lt;/p&gt;
&lt;h3 data-heading=&quot;ARP 단계 (가상 ARP를 유니캐스트로 처리)&quot; data-ke-size=&quot;size23&quot;&gt;ARP 단계 (가상 ARP를 유니캐스트로 처리)&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;EC2-1
 &amp;rarr; ARP Request 브로드캐스트 발송
    &amp;darr;
 하이퍼바이저가 가로챔 (브로드캐스트 외부 차단)
    &amp;darr;
 매핑 캐시 확인 &amp;rarr; 없음
    &amp;darr;
 매핑 서버에 유니캐스트 질의
 (&quot;vpcA의 10.1.1.2 MAC과 물리 서버 위치는?&quot;)
    &amp;darr;
 매핑 서버 응답: MAC=aa12, 물리서버=192.168.0.2
    &amp;darr;
 매핑 캐시에 저장
    &amp;darr;
 EC2-1에 가짜 ARP Response 전달 &amp;rarr; aa12 학습 완료
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-heading=&quot;실제 데이터 전송 단계 (캡슐화 통신)&quot; data-ke-size=&quot;size23&quot;&gt;실제 데이터 전송 단계 (캡슐화 통신)&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;EC2-1
 &amp;rarr; ping 패킷 (src: 10.1.1.1/aa11, dst: 10.1.1.2/aa12)
    &amp;darr;
 하이퍼바이저: 매핑 캐시 조회 &amp;rarr; 캡슐화
 [물리 헤더: src 192.168.0.1, dst 192.168.0.2]
 [VPC ID: vpcA]
 [가상 패킷: 10.1.1.1 &amp;rarr; 10.1.1.2]
    &amp;darr;
 물리 스위치: FCS(CRC) 에러 검사 &amp;rarr; 정상 패킷만 통과
    &amp;darr;
 물리서버(192.168.0.2) 도착
    &amp;darr;
 하이퍼바이저: 디캡슐화 &amp;rarr; VPC ID 확인 &amp;rarr; 보안 그룹 검증
    &amp;darr;
 EC2-2의 ENI에 최종 전달
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;FCS (Frame Check Sequence)&lt;/b&gt;: 물리 장비(광케이블, 스위치) 통과 시 CRC 계산으로 비트 오류 검출.&lt;br /&gt;오류 있으면 패킷 드롭. 물리 계층(L1/L2) 무결성 보장.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이후 통신&lt;/b&gt;: 매핑 캐시 활용 &amp;rarr; 매핑 서버 재질의 없이 캡슐화 고속 통신 반복&lt;/p&gt;
&lt;h2 data-heading=&quot;2. 동일 VPC &amp;mdash; 다른 서브넷 &amp;mdash; EC2 간 통신&quot; data-ke-size=&quot;size26&quot;&gt;2. 동일 VPC &amp;mdash; 다른 서브넷 &amp;mdash; EC2 간 통신&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상황&lt;/b&gt;: 10.1.1.2(EC2-1) &amp;rarr; 10.1.2.2(EC2-3) (다른 서브넷)&lt;/p&gt;
&lt;h3 data-heading=&quot;핵심 차이: L3 라우팅 필요&quot; data-ke-size=&quot;size23&quot;&gt;핵심 차이: L3 라우팅 필요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 서브넷은 L2(MAC)로 직접 통신 가능.&lt;br /&gt;다른 서브넷은 라우터(L3)를 경유해야 한다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;EC2-1 (10.1.1.2)
 &amp;rarr; 서브넷 마스크 계산: 목적지(10.1.2.2)는 다른 대역
 &amp;rarr; 직접 ARP 하지 않고, 기본 게이트웨이(가상 라우터 10.1.1.1)로 전송
    &amp;darr;
 AWS 가상 라우터 수신
 &amp;rarr; VPC 라우팅 테이블 확인:
   10.1.0.0/16 &amp;rarr; Local (VPC 내부)
    &amp;darr;
 L2 헤더 변경 (라우터를 경유했으므로 MAC 주소 변경)
    &amp;darr;
 하이퍼바이저: 매핑 서버 조회 &amp;rarr; EC2-3의 물리 서버(192.168.1.2) 확인
 &amp;rarr; 캡슐화하여 물리망 전송
    &amp;darr;
 물리서버(192.168.1.2) 도착 &amp;rarr; 디캡슐화 &amp;rarr; EC2-3 전달
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;라우팅 테이블 기반 단번 이동&lt;/b&gt;: 라우터는 모든 곳을 탐색하지 않고 CIDR 이정표를 보고 목적지를 단번에 결정한다.&lt;/p&gt;
&lt;h2 data-heading=&quot;3. VPC &amp;rarr; (Edge 장비) &amp;rarr; 외부 통신&quot; data-ke-size=&quot;size26&quot;&gt;3. VPC &amp;rarr; (Edge 장비) &amp;rarr; 외부 통신&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VPC 사설 대역을 벗어날 때는 AWS &lt;b&gt;Edge 장비 (Blackfoot Edge Device)&lt;/b&gt;를 무조건 경유.&lt;br /&gt;라우팅 테이블에 전용 가상 장치를 명시적으로 연결해야 통신 성립.&lt;/p&gt;
&lt;h3 data-heading=&quot;3.1 인터넷 게이트웨이 (IGW) &amp;rarr; 일반 인터넷&quot; data-ke-size=&quot;size23&quot;&gt;3.1 인터넷 게이트웨이 (IGW) &amp;rarr; 일반 인터넷&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;EC2 (10.1.1.2)
 &amp;rarr; 목적지 8.8.8.8
 &amp;rarr; 라우팅 테이블: 0.0.0.0/0 &amp;rarr; IGW
 &amp;rarr; 하이퍼바이저: IGW(Edge 장비, 192.168.0.100)로 캡슐화 전송
    &amp;darr;
 IGW(Edge 장비)
 &amp;rarr; 캡슐 제거 &amp;rarr; VPC ID 검증
 &amp;rarr; EC2의 사설 IP(10.1.1.2) &amp;rarr; EIP(59.1.1.2)로 NAT 수행
 &amp;rarr; 인터넷으로 발송
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;EIP(탄력적 IP)가 없으면&lt;/b&gt;: 인터넷 통신 불가. EC2에 EIP 또는 Public IP 할당 필수.&lt;/p&gt;
&lt;h3 data-heading=&quot;3.2 관리형 VPN (Virtual Private Gateway) &amp;rarr; 온프레미스 본사&quot; data-ke-size=&quot;size23&quot;&gt;3.2 관리형 VPN (Virtual Private Gateway) &amp;rarr; 온프레미스 본사&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;EC2 &amp;rarr; 온프레미스 사설 대역(172.30.0.0/16)
 &amp;rarr; 라우팅 테이블: 172.30.0.0/16 &amp;rarr; VGW
 &amp;rarr; Edge 장비에서 IPSec 암호화 터널링
 &amp;rarr; 인터넷 공용망을 통해 본사 VPN 장비에 안전하게 전달
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;IPSec&lt;/b&gt;: 공용 인터넷을 통해 데이터를 암호화하여 마치 전용선처럼 안전하게 통신.&lt;/p&gt;
&lt;h3 data-heading=&quot;3.3 다이렉트 커넥트 (Direct Connect) &amp;rarr; 본사 물리 전용선&quot; data-ke-size=&quot;size23&quot;&gt;3.3 다이렉트 커넥트 (Direct Connect) &amp;rarr; 본사 물리 전용선&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&amp;nbsp;&lt;/th&gt;
&lt;th&gt;VPN&lt;/th&gt;
&lt;th&gt;Direct Connect&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;경로&lt;/td&gt;
&lt;td&gt;인터넷 공용망&lt;/td&gt;
&lt;td&gt;물리 전용선&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;보안&lt;/td&gt;
&lt;td&gt;IPSec 암호화&lt;/td&gt;
&lt;td&gt;전용선 자체가 격리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;속도/안정성&lt;/td&gt;
&lt;td&gt;인터넷 품질에 의존&lt;/td&gt;
&lt;td&gt;보장된 대역폭&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;비용&lt;/td&gt;
&lt;td&gt;저렴&lt;/td&gt;
&lt;td&gt;고가&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;EC2 &amp;rarr; 본사 전용선
 &amp;rarr; Edge 장비에서 Q-in-Q VLAN 태깅 (이중 VLAN 헤더 추가)
 &amp;rarr; AWS &amp;harr; 기업 간 물리 광케이블 전용선으로 전송
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-heading=&quot;3.4 게이트웨이 엔드포인트 &amp;rarr; S3 / DynamoDB&quot; data-ke-size=&quot;size23&quot;&gt;3.4 게이트웨이 엔드포인트 &amp;rarr; S3 / DynamoDB&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;EC2 &amp;rarr; S3 버킷
 &amp;rarr; 라우팅 테이블: S3 prefix list &amp;rarr; Gateway Endpoint
 &amp;rarr; Edge 장비: VPC Endpoint ID를 헤더에 추가
 &amp;rarr; AWS 내부 백본망으로 고속 전달 (인터넷 미경유)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점&lt;/b&gt;: 인터넷을 타지 않으므로 더 안전하고 빠름. NAT Gateway 비용 절감.&lt;/p&gt;
&lt;h2 data-heading=&quot;Gateway Endpoint vs Interface Endpoint 비교&quot; data-ke-size=&quot;size26&quot;&gt;Gateway Endpoint vs Interface Endpoint 비교&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gateway Endpoint Interface Endpoint (PrivateLink)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;대상 서비스&lt;/td&gt;
&lt;td&gt;S3, DynamoDB만&lt;/td&gt;
&lt;td&gt;나머지 모든 AWS 서비스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;구현 방식&lt;/td&gt;
&lt;td&gt;라우팅 테이블 기반, Edge 장비 경유&lt;/td&gt;
&lt;td&gt;ENI로 VPC 안에 프라이빗 IP 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;내부 처리&lt;/td&gt;
&lt;td&gt;Edge 장비 + Endpoint ID 치환&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Hyperplane&lt;/b&gt; 인스턴스 경유&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;비용&lt;/td&gt;
&lt;td&gt;무료&lt;/td&gt;
&lt;td&gt;시간당 + 데이터 전송 요금&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Hyperplane&lt;/b&gt;: AWS가 만든 가상 라우팅 칩셋. Interface Endpoint, NAT Gateway, NLB 등의 내부 처리를 담당하는 AWS 내부 분산 시스템.&lt;/p&gt;
&lt;h2 data-heading=&quot;전체 흐름 요약&quot; data-ke-size=&quot;size26&quot;&gt;전체 흐름 요약&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;[같은 서브넷] EC2 &amp;rarr; 하이퍼바이저 ARP 프록시 &amp;rarr; 매핑 서버 &amp;rarr; 캡슐화 &amp;rarr; 물리망 &amp;rarr; 디캡슐화 &amp;rarr; EC2
[다른 서브넷] EC2 &amp;rarr; 가상 라우터 &amp;rarr; L2 헤더 교체 &amp;rarr; 캡슐화 &amp;rarr; 물리망 &amp;rarr; EC2
[인터넷]      EC2 &amp;rarr; IGW(Edge) &amp;rarr; NAT(사설&amp;rarr;공인 IP) &amp;rarr; 인터넷
[VPN]         EC2 &amp;rarr; VGW(Edge) &amp;rarr; IPSec 암호화 &amp;rarr; 인터넷 터널 &amp;rarr; 본사
[전용선]      EC2 &amp;rarr; DX(Edge) &amp;rarr; Q-in-Q VLAN &amp;rarr; 광케이블 &amp;rarr; 본사
[S3/DynamoDB] EC2 &amp;rarr; Gateway Endpoint(Edge) &amp;rarr; AWS 백본 &amp;rarr; S3
[기타 AWS 서비스] EC2 &amp;rarr; Interface Endpoint(Hyperplane) &amp;rarr; AWS 서비스
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-heading=&quot;연결 개념&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;</description>
      <category>Network</category>
      <author>Ry-</author>
      <guid isPermaLink="true">https://squash29.tistory.com/93</guid>
      <comments>https://squash29.tistory.com/93#entry93comment</comments>
      <pubDate>Mon, 1 Jun 2026 20:42:41 +0900</pubDate>
    </item>
    <item>
      <title>Docker란?</title>
      <link>https://squash29.tistory.com/92</link>
      <description>&lt;h1 data-heading=&quot;01 Docker 기초&quot;&gt;01 Docker 기초&lt;/h1&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-heading=&quot;Docker 등장 배경 &amp;mdash; Before Docker&quot; data-ke-size=&quot;size18&quot;&gt;CKA 공부를 시작하면서 기초적인 Docker에 대한 내용을 한번 정리 해보았습니다.&lt;/p&gt;
&lt;h2 data-heading=&quot;Docker 등장 배경 &amp;mdash; Before Docker&quot; data-ke-size=&quot;size26&quot;&gt;Docker 등장 배경 &amp;mdash; Before Docker&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발(Dev) / 테스트(Test) / 운영(Prod) 환경이 각각 독립된 VM으로 운영되던 시절의 문제:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제 내용&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;의존성 불일치&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Dev는 Python 3.4, Prod는 Python 3.1 &amp;rarr; 배포하면 깨짐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;비효율적 자원 사용&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;VM마다 OS 따로 설치 &amp;rarr; 스토리지 낭비, 라이선스 비용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;복잡하고 오류 잦은 배포&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;팀마다 수동 설치, 포트/라이브러리 설정이 제각각&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;격리 부재&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;같은 VM에 앱 여러 개 &amp;rarr; 포트 충돌, 라이브러리 충돌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;내 컴퓨터에서는 되는데요&quot; &amp;mdash; Docker 이전의 고질적 문제&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;Docker란?&quot; data-ke-size=&quot;size26&quot;&gt;Docker란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;컨테이너화(Containerization) 플랫폼&lt;/b&gt; &amp;mdash; 애플리케이션을 모든 의존성과 함께 패키징해 어디서든 동일하게 실행되도록 함.&lt;/p&gt;
&lt;h3 data-heading=&quot;배송 컨테이너 비유&quot; data-ke-size=&quot;size23&quot;&gt;배송 컨테이너 비유&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배송 컨테이너 Docker&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;규격 표준화&lt;/td&gt;
&lt;td&gt;Dockerfile로 구조 표준화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;어디든 운반 가능&lt;/td&gt;
&lt;td&gt;Docker Engine만 있으면 어디서든 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;내용물 격리&lt;/td&gt;
&lt;td&gt;컨테이너별 독립 환경&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;필요한 만큼 추가&lt;/td&gt;
&lt;td&gt;컨테이너 수평 확장&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-heading=&quot;Docker가 해결하는 것&quot; data-ke-size=&quot;size23&quot;&gt;Docker가 해결하는 것&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;표준화&lt;/b&gt;: Dockerfile이라는 통일된 형식&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이식성&lt;/b&gt;: Docker Engine만 있으면 Mac, Linux, Windows 어디든 동일 동작&lt;/li&gt;
&lt;li&gt;&lt;b&gt;격리&lt;/b&gt;: 컨테이너마다 독립 환경 &amp;rarr; 충돌 없음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;효율&lt;/b&gt;: 컨테이너는 Host OS 커널 공유 &amp;rarr; VM보다 가볍고 빠른 부팅&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;VM vs Docker 아키텍처&quot; data-ke-size=&quot;size26&quot;&gt;VM vs Docker 아키텍처&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;VM 구조                          Docker 구조
─────────────────────            ─────────────────────
물리 서버                         물리 서버
  └── Hypervisor                   └── Hypervisor (선택)
        ├── OS + App 1                   └── VM (Linux OS)
        ├── OS + App 2                         └── Docker Engine
        └── OS + App 3                               ├── Container 1
                                                     ├── Container 2
                                                     └── Container 3
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;VM: OS를 각각 설치 &amp;rarr; 무겁고 느림&lt;/li&gt;
&lt;li&gt;Docker: Host 커널 공유 &amp;rarr; 가볍고 빠른 부팅&lt;/li&gt;
&lt;li&gt;실제로는 VM 위에 Docker Engine 설치해서 사용하는 게 일반적&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;핵심 개념 3가지&quot; data-ke-size=&quot;size26&quot;&gt;핵심 개념 3가지&lt;/h2&gt;
&lt;h3 data-heading=&quot;Docker Image&quot; data-ke-size=&quot;size23&quot;&gt;Docker Image&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Dockerfile로 만들어진 빌드 결과물&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;코드 + 모든 의존성(라이브러리, 설정 파일 등) 포함&lt;/li&gt;
&lt;li&gt;불변(Immutable) &amp;mdash; 한번 만들면 내용이 변하지 않음&lt;/li&gt;
&lt;li&gt;생성 명령어: docker build&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-heading=&quot;Docker Container&quot; data-ke-size=&quot;size23&quot;&gt;Docker Container&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Image의 실행 인스턴스&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Image = 설계도, Container = 실제로 돌아가는 것&lt;/li&gt;
&lt;li&gt;실행 명령어: docker run&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-heading=&quot;Docker Registry&quot; data-ke-size=&quot;size23&quot;&gt;Docker Registry&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Image를 저장하고 배포하는 저장소&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;docker push로 업로드, docker pull로 다운로드&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;종류 예시&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;공개 Registry&lt;/td&gt;
&lt;td&gt;Docker Hub, Ubuntu 이미지 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;비공개 Registry&lt;/td&gt;
&lt;td&gt;AWS ECR, Azure ACR, JFrog Artifactory, Nexus&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;Docker Engine 구성&quot; data-ke-size=&quot;size26&quot;&gt;Docker Engine 구성&lt;/h2&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;Docker CLI  &amp;rarr;  REST API  &amp;rarr;  Docker Daemon
 (대시보드)      (배선)        (엔진/두뇌)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구성요소 역할&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Docker CLI&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;사용자가 명령을 입력하는 인터페이스 (docker build, docker run 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;REST API&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;CLI 명령을 Daemon이 이해하는 HTTP 형식으로 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Docker Daemon&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;실제로 이미지 빌드, 컨테이너 실행 등을 수행하는 핵심 프로세스&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;Docker 워크플로우&quot; data-ke-size=&quot;size26&quot;&gt;Docker 워크플로우&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;개발자
  1. 코드 작성 + Dockerfile 작성 (버전 관리 시스템에 저장)
  2. docker build &amp;rarr; Docker Image 생성 (로컬 저장)
  3. docker push  &amp;rarr; Docker Registry에 업로드
  4. docker run   &amp;rarr; 로컬 VM에서 컨테이너 실행 (개발 검증)

DevOps 팀
  5. docker pull  &amp;rarr; Registry에서 Image 다운로드
  6. docker run   &amp;rarr; 테스트/운영 환경에서 동일하게 실행
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dev에서 동작하면 Test, Prod에서도 동일하게 동작 &amp;rarr; &quot;내 컴퓨터에서는 되는데요&quot; 문제 해결&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;의존성(Dependency)이란?&quot; data-ke-size=&quot;size26&quot;&gt;의존성(Dependency)이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애플리케이션이 실행되기 위해 필요한 모든 것:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Docker Engine (컨테이너 실행 환경)&lt;/li&gt;
&lt;li&gt;런타임 (Java 9, Python 3.4 등)&lt;/li&gt;
&lt;li&gt;라이브러리&lt;/li&gt;
&lt;li&gt;설정 파일 (DB 연결 정보 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; Docker Image 안에 이 모든 것을 함께 패키징&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;Dockerfile 예시 (최소)&quot; data-ke-size=&quot;size26&quot;&gt;Dockerfile 예시 (최소)&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;FROM ubuntu:latest       # 베이스 이미지 지정
CMD [&quot;echo&quot;, &quot;hello docker&quot;]  # 컨테이너 실행 시 실행할 명령
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;현대 DevOps에서의 역할 분담&quot; data-ke-size=&quot;size26&quot;&gt;현대 DevOps에서의 역할 분담&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역할 주요 책임&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Developer&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;코드 작성 + Dockerfile 작성 (99% 케이스)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;DevOps Engineer&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Dockerfile 검토, Registry 관리, 배포 자동화 (CI/CD)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=r3QWVLeA5qM&amp;amp;list=PLmPit9IIdzwRjqD-l_sZBDdPlcSfKqpAt&amp;amp;index=2&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=r3QWVLeA5qM&amp;amp;list=PLmPit9IIdzwRjqD-l_sZBDdPlcSfKqpAt&amp;amp;index=2&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=r3QWVLeA5qM&amp;amp;list=PLmPit9IIdzwRjqD-l_sZBDdPlcSfKqpAt&amp;amp;index=2&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bRhQDp/dJMb87N3Irp/Sf3iLtRB4X6Z1dIgKRw7aK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=20_284_242_526,https://scrap.kakaocdn.net/dn/c4eEBW/dJMb8Rj86HG/KMK8skJJmn64RChwkU6xTK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=20_284_242_526&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;Day 1: Docker Fundamentals for Kubernetes | CKA Certification Course 2025&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/r3QWVLeA5qM&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Network</category>
      <author>Ry-</author>
      <guid isPermaLink="true">https://squash29.tistory.com/92</guid>
      <comments>https://squash29.tistory.com/92#entry92comment</comments>
      <pubDate>Mon, 1 Jun 2026 10:02:15 +0900</pubDate>
    </item>
    <item>
      <title>AI Expo 26 후기</title>
      <link>https://squash29.tistory.com/91</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-12 오후 8.21.23.png&quot; data-origin-width=&quot;1849&quot; data-origin-height=&quot;731&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DoyMY/dJMcagyHfsO/EpjIR00UUEABPVNUQJS2RK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DoyMY/dJMcagyHfsO/EpjIR00UUEABPVNUQJS2RK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DoyMY/dJMcagyHfsO/EpjIR00UUEABPVNUQJS2RK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDoyMY%2FdJMcagyHfsO%2FEpjIR00UUEABPVNUQJS2RK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1849&quot; height=&quot;731&quot; data-filename=&quot;스크린샷 2026-05-12 오후 8.21.23.png&quot; data-origin-width=&quot;1849&quot; data-origin-height=&quot;731&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시간: 05/06(수) - 05/08(금) 10:00 - 17:00&lt;/li&gt;
&lt;li&gt;장소: 코엑스 Hall A&lt;/li&gt;
&lt;li&gt;코엑스 : &lt;a href=&quot;https://www.coex.co.kr/exhibitions/국제인공지능대전-2/&quot;&gt;https://www.coex.co.kr/exhibitions/국제인공지능대전-2/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;국제인공지능대전:&amp;nbsp;&lt;a href=&quot;http://www.aiexpo.co.kr/home/v4.php?s=34&quot;&gt;http://www.aiexpo.co.kr/home/v4.php?s=34&lt;/a&gt;&amp;nbsp; &amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에 아는 지인분의 정보공유로 AI Expo에 다녀왔습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5월 6일 부터 8일까지 운영을 했는데 금요일은 일반 관람객들도 다 올 수 있는 형태로 열려있어 저는 금요일날 방문했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 엑스포의 취지는 AI 모델들이 요즘 실생활에서 많이들 볼 수 있는데 이러한 AI 모델을 어떻게 사용하고 있고, 클라우드 부트캠프를 수료하고 보니 AI 모델들이 클라우드 환경에서는 어떻게 사용되고 있는지 궁금해서 찾아가게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k3XVi/dJMcacJSYgw/D3b8Fx1KGLrPfXAWNJ8aEk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k3XVi/dJMcacJSYgw/D3b8Fx1KGLrPfXAWNJ8aEk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k3XVi/dJMcacJSYgw/D3b8Fx1KGLrPfXAWNJ8aEk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk3XVi%2FdJMcacJSYgw%2FD3b8Fx1KGLrPfXAWNJ8aEk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;425&quot; height=&quot;567&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이떄가 11시쯤인데요 박람회가 10시에 시작하는거 치고 사람들이 되게 많이 서있는것을 볼 수 가 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 생각보다 빠르게 줄이 줄어들었고 금방 들어갔습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-12 오후 8.30.42.png&quot; data-origin-width=&quot;1308&quot; data-origin-height=&quot;551&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tfi3x/dJMcabKZyUS/4ufbPAlVuGqvWU9ZO0RU90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tfi3x/dJMcabKZyUS/4ufbPAlVuGqvWU9ZO0RU90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tfi3x/dJMcabKZyUS/4ufbPAlVuGqvWU9ZO0RU90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftfi3x%2FdJMcabKZyUS%2F4ufbPAlVuGqvWU9ZO0RU90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1308&quot; height=&quot;551&quot; data-filename=&quot;스크린샷 2026-05-12 오후 8.30.42.png&quot; data-origin-width=&quot;1308&quot; data-origin-height=&quot;551&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주요 주제들은 AI 솔루션, AI 인프라 및 플랫폼 , AI + X 융합이 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;76D92F29-9FAF-459F-BA08-4BDC8A880E5B_1_105_c.jpeg&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbziBu/dJMcadhHkAE/b00em80gGnvwG4T4dBkVSK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbziBu/dJMcadhHkAE/b00em80gGnvwG4T4dBkVSK/img.jpg&quot; data-alt=&quot;넥스브이 부스 마음 상담&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbziBu/dJMcadhHkAE/b00em80gGnvwG4T4dBkVSK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbziBu%2FdJMcadhHkAE%2Fb00em80gGnvwG4T4dBkVSK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;455&quot; height=&quot;607&quot; data-filename=&quot;76D92F29-9FAF-459F-BA08-4BDC8A880E5B_1_105_c.jpeg&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;넥스브이 부스 마음 상담&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 제품들을 확인하고 궁금했던 내용들을 물어보기도 했었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-12 오후 8.46.53.png&quot; data-origin-width=&quot;986&quot; data-origin-height=&quot;1230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dWp0wf/dJMcagZK0cT/heboUkWt95wOGEvLmrm9qK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dWp0wf/dJMcagZK0cT/heboUkWt95wOGEvLmrm9qK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dWp0wf/dJMcagZK0cT/heboUkWt95wOGEvLmrm9qK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdWp0wf%2FdJMcagZK0cT%2FheboUkWt95wOGEvLmrm9qK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;398&quot; height=&quot;496&quot; data-filename=&quot;스크린샷 2026-05-12 오후 8.46.53.png&quot; data-origin-width=&quot;986&quot; data-origin-height=&quot;1230&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biZ0f2/dJMcagZK0dB/owuHOOEy97JoZOZadZ7KtK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biZ0f2/dJMcagZK0dB/owuHOOEy97JoZOZadZ7KtK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biZ0f2/dJMcagZK0dB/owuHOOEy97JoZOZadZ7KtK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiZ0f2%2FdJMcagZK0dB%2FowuHOOEy97JoZOZadZ7KtK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;522&quot; height=&quot;696&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨벤션장 기준으로 오른쪽 부스에서는 대부분 AI를 활용한 비서, RAG 기술, 데이터를 보다 쉽게 처리할 수 있는 솔루션들을 선보이고 있었습니다. 다양한 솔루션을 둘러보면서 가장 크게 든 생각은 이러한 아이템들이 실제로 경쟁력이 있을까 하는 점이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 도메인에 강점을 갖고 있지 않은 형태라면 해당 솔루션을 선뜻 도입하기 어렵겠다는 생각이 들었습니다. 한 가지 예로 삼일회계법인은 다른 기업들과 동일하게 멀티모달 LLM 솔루션을 운영하고 있었는데, 삼일이 보유한 회계 도메인 전문성이 해당 모델에 잘 녹아든다면 더 큰 시너지를 낼 수 있겠다는 생각이 들었습니다. 그 외의 경우에는 크게 차별점이 느껴지지 않았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'AI의 끝은 피지컬 AI'라는 말을 들은 적이 있는데, 이번 행사에서도 많은 기업들이 피지컬 AI를 개발하고 도입하고 있는 것을 확인할 수 있었습니다. AI 기술이 점점 고도화되면서 실체 있는 형태로 다양한 산업에 적용될 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부스를 돌면서 계속 느낀 건 결국 데이터가 핵심이 될 것 같다는 점이었습니다. 클라우드를 공부하고 있는 입장에서 데이터를 안전하고 효율적으로 처리하는 방법(SaaS, 온프레미스 등 다양한 형태)에 대해서도 더 깊이 고민해봐야겠다고 생각했습니다. MinIO 부스에서는 서비스 구현 방식, DR 방식, 서비스 형태 등을 직접 질문하면서 궁금했던 부분들을 해소할 수 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 가지 아쉬웠던 점은 기업 채용 동향이나 AI 발전에 따른 인력 수요 변화 같은 부분을 대표님께 직접 여쭤보지 못한 것입니다. 다음 기회에는 꼭 물어봐야겠다고 생각했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>이것저것</category>
      <author>Ry-</author>
      <guid isPermaLink="true">https://squash29.tistory.com/91</guid>
      <comments>https://squash29.tistory.com/91#entry91comment</comments>
      <pubDate>Tue, 12 May 2026 20:50:48 +0900</pubDate>
    </item>
    <item>
      <title>[대규모 시스템 설계 기초 2] 4장 분산 메시지 큐</title>
      <link>https://squash29.tistory.com/90</link>
      <description>&lt;h1&gt;대규모 시스템 설계 공부하다가 생긴 궁금증들&amp;nbsp;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;시작하며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;《대규모 시스템 설계 기초 2》를 읽으면서 분산 메시지 큐 챕터를 정리하다 보니, 책에 나온 내용보다 오히려&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;근데 이건 왜 이렇게 하는 거지?&quot;, &quot;이게 그거랑 같은 개념인가?&quot; 싶은 질문들이 계속 쌓였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 단순한 요약이 아니라 공부하면서 파생된 궁금증들을 하나씩 짚어보면서 정리한 글입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비슷하게 공부하시는 분들께 도움이 되길 바랍니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;메시지 큐 vs 이벤트 스트리밍 플랫폼, 뭐가 다른가?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4장 첫 주제 가장 먼저 정리가 필요했던 개념입니다.&lt;/p&gt;
&lt;div&gt;항목메시지 큐이벤트 스트리밍 플랫폼
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;재소비&lt;/td&gt;
&lt;td&gt;불가 (소비 후 삭제)&lt;/td&gt;
&lt;td&gt;가능 (로그 보관)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;소비 형태&lt;/td&gt;
&lt;td&gt;1:1&lt;/td&gt;
&lt;td&gt;발행-구독&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;순서 보장&lt;/td&gt;
&lt;td&gt;보통 미보장&lt;/td&gt;
&lt;td&gt;파티션 내 보장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;저장 방식&lt;/td&gt;
&lt;td&gt;메모리 기반&lt;/td&gt;
&lt;td&gt;디스크 기반&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;예시&lt;/td&gt;
&lt;td&gt;RabbitMQ, SQS&lt;/td&gt;
&lt;td&gt;Kafka, Pulsar&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 큰 차이는 두 가지입니다. &lt;b&gt;한 번 보낸 메시지를 다시 읽을 수 있냐&lt;/b&gt;, 그리고 &lt;b&gt;여러 소비자가 구독 형태로 메시지를 처리하냐&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 Kafka는 같은 메시지를 분석 서비스, 알림 서비스, 로그 서비스가 각각 독립적으로 읽을 수 있어요. RabbitMQ는 한 번 소비되면 사라집니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1단계. 요구사항 정의&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기능적 요구사항&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;텍스트 메시지만 지원&lt;/li&gt;
&lt;li&gt;생산된 순서 그대로 유지 (전통적 메시지 큐는 순서 미보장)&lt;/li&gt;
&lt;li&gt;메시지 지속성 보장 (디스크 저장, 장애 후에도 복구 가능)&lt;/li&gt;
&lt;li&gt;최소 한 번 전달 지원&lt;/li&gt;
&lt;li&gt;소비자 설정에 따라 전달 방식 선택 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;비기능적 요구사항&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;높은 처리량(대역폭)과 낮은 전송 지연 동시 지원&lt;/li&gt;
&lt;li&gt;수평적 확장 가능&lt;/li&gt;
&lt;li&gt;장애 내성 (고가용성)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단대단(End-to-End)이란?&lt;/b&gt; 책에서 &quot;단대단 지연&quot;이라는 표현이 나오는데, 이건 생산자가 메시지를 보내는 시점부터 소비자가 받는 시점까지의 &lt;b&gt;전체 구간&lt;/b&gt;을 의미합니다. 중간에 거치는 네트워크, 브로커 처리, 디스크 쓰기 등을 모두 합친 시간이 짧아야 한다는 뜻이에요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2단계. 개략적 설계&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;발행-구독 모델과 토픽&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발행-구독 모델의 핵심은 &lt;b&gt;토픽&lt;/b&gt;입니다. 생산자가 특정 토픽에 메시지를 발행하면, 그 토픽을 구독하는 소비자 그룹들이 메시지를 받는 구조예요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 양이 많아지면 서버 한 대로 처리가 불가능하기 때문에, &lt;b&gt;파티션 샤딩 기법&lt;/b&gt;으로 토픽을 여러 파티션으로 분리합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;yaml&quot; style=&quot;color: #eaecf0;&quot;&gt;&lt;code&gt;Topic: orders
  Partition 0 &amp;rarr; Broker 1
  Partition 1 &amp;rarr; Broker 2
  Partition 2 &amp;rarr; Broker 3&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;같은 키를 가진 메시지 &amp;rarr; 항상 같은 파티션 (순서 보장)&lt;/li&gt;
&lt;li&gt;키가 없는 메시지 &amp;rarr; 무작위 파티션으로 전송&lt;/li&gt;
&lt;li&gt;파티션 내 메시지 위치는 &lt;b&gt;오프셋&lt;/b&gt;으로 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;소비자 그룹&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 그룹 안의 소비자들이 파티션을 나눠서 병렬 처리합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1778584046620&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Topic: orders (Partition 0, 1, 2) 

Group A: C1&amp;rarr;P0, C2&amp;rarr;P1, C3&amp;rarr;P2  &amp;larr; 각각 다른 파티션 담당
Group B: C4&amp;rarr;P0, C5&amp;rarr;P1, C6&amp;rarr;P2  &amp;larr; Group A와 독립적으로 동일 메시지 소비&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;같은 그룹 내 C1, C2가 동일 메시지를 읽을 수 없나요?&quot;&lt;/b&gt; 맞습니다. 같은 그룹 안에서는 하나의 파티션을 한 소비자만 담당해요. C1이 P0을 맡으면 C2는 P0을 읽을 수 없습니다. 이게 결국 1:1처럼 보이지만, &lt;b&gt;같은 메시지를 여러 시스템이 처리해야 한다면 다른 그룹으로 구성&lt;/b&gt;하면 됩니다. Group A와 Group B는 서로 독립적으로 같은 메시지를 읽을 수 있거든요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;전체 구성요소&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1778584058104&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Application Server
  &amp;rarr; Producer (버퍼 + 라우팅)
    &amp;rarr; Broker 1 (Leader Partition 0) ─┐
    &amp;rarr; Broker 2 (Leader Partition 1)  ├── 각자 팔로워에게 복제
    &amp;rarr; Broker 3 (Leader Partition 2) ─┘
      &amp;rarr; Consumer Group A (서비스 A)
      &amp;rarr; Consumer Group B (서비스 B)

별도로
  &amp;rarr; ZooKeeper / KRaft (코디네이터, 리더 선출, 메타데이터)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;리더와 코디네이터는 다른 역할입니다.&lt;/b&gt; 리더 브로커는 특정 파티션의 읽기/쓰기를 담당하고, 코디네이터는 소비자 그룹 관리와 리밸런싱을 담당해요. 브로커 하나가 여러 파티션의 리더를 맡으면서 동시에 특정 소비자 그룹의 코디네이터 역할도 할 수 있지만, 같은 개념은 아닙니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파티션 복제 브로커가 별도로 분리된 게 아닙니다.&lt;/b&gt; 브로커 1, 2, 3이 각각 어떤 파티션의 리더이면서 동시에 다른 파티션의 팔로워예요. 리더/팔로워는 브로커의 고정 역할이 아니라 &lt;b&gt;파티션 단위 역할&lt;/b&gt;입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1778584067918&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Broker 1: Partition 0 리더, Partition 1 팔로워, Partition 2 팔로워
Broker 2: Partition 0 팔로워, Partition 1 리더, Partition 2 팔로워
Broker 3: Partition 0 팔로워, Partition 1 팔로워, Partition 2 리더&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3단계. 상세 설계&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터 저장소 &amp;mdash; 왜 DB가 아니라 WAL인가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;읽기/쓰기가 빈번하고, 갱신/삭제는 거의 없는 특성상 일반 DB는 오버헤드가 큽니다.&lt;/p&gt;
&lt;div&gt;저장소문제점
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RDB&lt;/td&gt;
&lt;td&gt;빈번한 읽기/쓰기에 오버헤드, 데이터 모델 부적합&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;인메모리&lt;/td&gt;
&lt;td&gt;용량 한계, 장애 시 유실&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WAL 디스크&lt;/td&gt;
&lt;td&gt;순차 쓰기로 고성능, 영속성 보장 ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;WAL + 세그먼트 구조&lt;/b&gt;로 저장합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1778584078280&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/partition-0/
  00000000.log    &amp;larr; 실제 메시지 (바이너리)
  00000000.index  &amp;larr; offset &amp;rarr; byte 위치 매핑
  00001000.log
  00001000.index&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 하나에 계속 쌓으면 OS 파일 핸들링 한계에 부딪히고 오래된 메시지 삭제도 불가능해집니다. 세그먼트로 나누면 오래된 세그먼트를 파일 통째로 삭제할 수 있어요.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실제로 SSD인지 HDD인지, 어떻게 읽고 쓰는지?&lt;/b&gt; Kafka는 OS의 sendfile() 시스템 콜과 페이지 캐시를 활용합니다. 클라우드 환경(AWS MSK 등)은 대부분 SSD 기반이에요. 쓰기는 Java의 FileChannel.write()로 순차 append하고, 읽기는 transferTo()(제로카피)를 사용합니다. 제로카피는 디스크&amp;rarr;커널 버퍼&amp;rarr;네트워크로 유저 공간을 거치지 않아 복사 횟수를 줄여 처리량을 높입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;페이지 캐시 활용&lt;/b&gt;도 중요한 포인트입니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1778584086280&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;생산자가 방금 쓴 메시지
&amp;rarr; 소비자가 바로 읽으면 디스크 접근 없이 OS 페이지 캐시에서 서빙
&amp;rarr; 디스크 I/O 최소화&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kafka가 JVM 힙 메모리를 작게 쓰는 이유도 이 때문이에요. 대신 OS 페이지 캐시를 최대한 활용합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;메시지 구조&lt;/h3&gt;
&lt;div&gt;필드설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;topic&lt;/td&gt;
&lt;td&gt;메시지가 속한 토픽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;partition&lt;/td&gt;
&lt;td&gt;파티션 번호&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;offset&lt;/td&gt;
&lt;td&gt;파티션 내 위치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;timestamp&lt;/td&gt;
&lt;td&gt;생성 시각&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;key&lt;/td&gt;
&lt;td&gt;파티션 결정용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;value&lt;/td&gt;
&lt;td&gt;실제 데이터 (바이너리)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;size&lt;/td&gt;
&lt;td&gt;메시지 크기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CRC&lt;/td&gt;
&lt;td&gt;무결성 검사&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CRC 종류가 여러 가지인데 Kafka는 뭘 쓰나요?&lt;/b&gt; Kafka는 &lt;b&gt;CRC32C&lt;/b&gt;를 사용합니다. 패리티 검사, 해밍 코드 같은 건 오류 정정(FEC)용이라 목적이 달라요. CRC는 오류 탐지만 하고, 해밍 코드는 탐지+정정까지 해요. 메시지 전송 무결성 확인용으로는 CRC32C가 속도와 신뢰성 균형이 좋습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;생산자 측 작업 흐름&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1778584095850&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Producer
  &amp;rarr; 메시지 직렬화 (바이너리)
  &amp;rarr; 키 해싱으로 파티션 결정 (hash(key) % partitionCount)
  &amp;rarr; 사본 분산 계획 캐시 조회 (어느 브로커가 리더?)
  &amp;rarr; 리더 브로커에 직접 전송
  &amp;rarr; 버퍼에 모아서 배치로 전송&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;메시지 키 해싱은 누가 처리하나요?&lt;/b&gt; 브로커가 아니라 **생산자(Producer)**가 처리합니다. 생산자 내부 라우팅 로직에서 파티션을 결정한 후 해당 파티션의 리더 브로커로 직접 전송해요. 브로커는 그냥 받아서 저장만 합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;버퍼가 어떻게 네트워크를 거칠 필요가 없다는 건가요?&lt;/b&gt; 원래 라우팅 계층이 별도 서버로 존재하면 생산자&amp;rarr;라우터&amp;rarr;브로커 2번 네트워크를 거쳐야 해요. 라우팅 로직을 생산자 내부로 편입시키면 생산자&amp;rarr;브로커 1번만 거치면 됩니다. 버퍼는 그 내부에서 메시지를 모아서 한 번에 배치 전송하는 역할이에요. 즉 버퍼는 &lt;b&gt;일괄처리(배치)를 위해 두는 것&lt;/b&gt;입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1778584106960&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;linger.ms 높임 &amp;rarr; 더 많이 모아서 전송 &amp;rarr; 처리량 증가, 지연 증가
linger.ms 낮춤 &amp;rarr; 바로 전송              &amp;rarr; 처리량 감소, 지연 감소&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;소비자 측 작업 흐름&lt;/h3&gt;
&lt;div&gt;방식설명단점
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;푸시&lt;/td&gt;
&lt;td&gt;브로커가 소비자에게 밀어넣음&lt;/td&gt;
&lt;td&gt;소비자 처리 속도보다 빠르면 부하 폭증&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;풀&lt;/td&gt;
&lt;td&gt;소비자가 직접 요청&lt;/td&gt;
&lt;td&gt;메시지 없어도 계속 폴링 &amp;rarr; 자원 낭비&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;롱폴링&lt;/td&gt;
&lt;td&gt;메시지 생길 때까지 연결 유지&lt;/td&gt;
&lt;td&gt;풀의 자원 낭비 문제 해결 ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kafka는 &lt;b&gt;풀 + 롱폴링&lt;/b&gt; 방식을 채택합니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;컴퓨터 자원을 어떻게 조절하나요?&lt;/b&gt; 소비자 쪽에서 max.poll.records, fetch.max.bytes 같은 설정으로 한 번에 가져올 메시지 양을 조절해요. 브로커는 각 소비자 그룹별로 오프셋만 관리하고, 실제 처리 속도 조절은 소비자가 담당합니다. 이게 풀 모델의 핵심 장점인 &lt;b&gt;백프레셔(backpressure)&lt;/b&gt; 제어예요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;소비자 재조정 (Rebalancing)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소비자가 연결이 끊기거나 새로 추가되면 파티션을 재배치합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1778584114751&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[재조정 흐름]
1. Group Coordinator가 이상 감지 (하트비트 없음)
2. 모든 소비자에게 JoinGroup 요청
3. 리더 소비자가 파티션 재할당 결정
4. Coordinator가 각 소비자에게 결과 통보
5. onPartitionsRevoked() &amp;rarr; onPartitionsAssigned() 콜백&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주의할 점은 재조정 중에는 &lt;b&gt;전체 소비가 잠시 중단&lt;/b&gt;된다는 거예요. CooperativeStickyAssignor를 사용하면 영향받는 파티션만 점진적으로 재조정해서 이 문제를 최소화할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;상태 저장소와 메타데이터 저장소&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상태 저장소&lt;/b&gt; &amp;mdash; 소비자별 파티션 오프셋 정보 저장&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지속적 읽기/쓰기 &amp;rarr; 데이터 일관성 중요&lt;/li&gt;
&lt;li&gt;구버전: ZooKeeper에 저장&lt;/li&gt;
&lt;li&gt;현재: __consumer_offsets 토픽 (Kafka 내부)으로 이전&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;메타데이터 저장소&lt;/b&gt; &amp;mdash; 토픽 설정, 파티션 수, 복제 설정 등 저장&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변경 빈도 낮고 일관성 중요 &amp;rarr; ZooKeeper 또는 KRaft 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주키퍼가 계층적이라서 뭐가 좋은 건가요?&lt;/b&gt; 파일 시스템처럼 /brokers/ids/1, /topics/orders/partitions/0 형태로 경로 구조를 갖고 있어요. 덕분에 특정 경로에 &lt;b&gt;watch&lt;/b&gt;를 걸어 변경사항을 이벤트로 받을 수 있습니다. 브로커가 죽으면 해당 경로가 사라지고, watch 중인 컴포넌트가 즉시 감지하는 방식이에요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;etcd가 Kubernetes에서 쓰는 etcd랑 같은 건가요?&lt;/b&gt; 네, 완전히 같은 etcd입니다. 분산 키-값 저장소로 클러스터 상태, 리더 선출, 서비스 탐색 등에 사용돼요. Kubernetes는 클러스터 상태 관리에, Kafka는 브로커 상태/메타데이터 관리에 동일한 etcd를 사용할 수 있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;복제 (Replication)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하드웨어 장애로 데이터가 사라지는 것을 방지하기 위해 복제를 사용합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1778584125351&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Partition 0
  Broker 1: Leader  &amp;larr; 읽기/쓰기 모두 여기서
  Broker 2: Follower (ISR)
  Broker 3: Follower (ISR)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ack 모드&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;모드설명신뢰성속도
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;acks=0&lt;/td&gt;
&lt;td&gt;응답 안 기다림&lt;/td&gt;
&lt;td&gt;낮음&lt;/td&gt;
&lt;td&gt;가장 빠름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;acks=1&lt;/td&gt;
&lt;td&gt;리더만 저장하면 OK&lt;/td&gt;
&lt;td&gt;중간&lt;/td&gt;
&lt;td&gt;중간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;acks=all&lt;/td&gt;
&lt;td&gt;ISR 전체 저장해야 OK&lt;/td&gt;
&lt;td&gt;높음&lt;/td&gt;
&lt;td&gt;느림&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISR(In-Sync Replica)은 리더와 동기화 상태인 복제본 목록입니다. 팔로워가 느리거나 끊기면 ISR에서 제거되고, 리더 장애 시 ISR 중 하나가 새 리더로 선출됩니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실제 운영에서는 어떻게 처리하나요?&lt;/b&gt; 대부분 acks=all + min.insync.replicas=2 조합을 씁니다. ISR이 2개 이상일 때만 쓰기를 허용해서 리더 장애 시 데이터 손실을 막아요. 결제 같은 민감한 시스템은 여기에 exactly-once까지 추가합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;메시지 전달 방식&lt;/h3&gt;
&lt;div&gt;방식유실중복사용 사례
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;최대 한 번 (At Most Once)&lt;/td&gt;
&lt;td&gt;가능&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;모니터링, 로그&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;최소 한 번 (At Least Once)&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;가능&lt;/td&gt;
&lt;td&gt;주문, 알림&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;정확히 한 번 (Exactly Once)&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;결제, 재고&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;java&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1778584138399&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 최소 한 번
process(record);       // 처리 먼저
commitOffset();        // 그 다음 커밋 (장애 시 재처리 발생 가능)

// 정확히 한 번
producer.initTransactions();
producer.beginTransaction();
producer.send(...);
consumer.commitSync();
producer.commitTransaction();  // 전송+커밋 원자적 처리&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서는 대부분 &lt;b&gt;최소 한 번 + 멱등성 처리(중복 방지 로직)&lt;/b&gt; 조합을 씁니다. 정확히 한 번은 성능 비용과 구현 복잡도가 큽니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;세그먼트라는 단어, 어디서나 보이는데 같은 개념인가?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공부하다 보면 세그먼트라는 단어가 여러 곳에서 나옵니다. 헷갈릴 수 있어서 정리해봤어요.&lt;/p&gt;
&lt;div&gt;맥락세그먼트 의미레벨
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CPU 8086 레지스터&lt;/td&gt;
&lt;td&gt;16비트 레지스터로 20비트 주소 접근&lt;/td&gt;
&lt;td&gt;하드웨어&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OS 메모리 관리&lt;/td&gt;
&lt;td&gt;Code/Data/Stack/Heap 영역 분리&lt;/td&gt;
&lt;td&gt;OS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TCP 네트워크&lt;/td&gt;
&lt;td&gt;전송 단위 패킷&lt;/td&gt;
&lt;td&gt;네트워크 4계층&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kafka&lt;/td&gt;
&lt;td&gt;로그 파일 분할 단위&lt;/td&gt;
&lt;td&gt;애플리케이션&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전부 **&quot;나눈다&quot;**는 의미에서 같은 단어를 차용한 것이고, 기술적으로 같은 개념은 아닙니다. 세그먼트(Segment)의 영어 뜻 자체가 &quot;조각, 구간&quot;이라 분야마다 가져다 쓰는 거예요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마찬가지로 오프셋도 맥락마다 다르게 사용됩니다. Kafka에서 오프셋은 &lt;b&gt;메시지의 고유 순번&lt;/b&gt;이고, 세그먼트 파일명이 시작 오프셋이라 어느 파일에서 찾아야 할지 바로 알 수 있어 O(1)에 가까운 탐색이 가능합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;바이너리 저장 vs 세그먼트, 같은 개념인가?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것도 헷갈렸던 부분입니다. 같은 단어를 다른 형태로 많이 사용해서 헷갈렸습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바이너리는 &lt;b&gt;저장 포맷&lt;/b&gt;, 세그먼트는 &lt;b&gt;파일 관리 전략&lt;/b&gt;으로 독립적인 개념입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kafka는 두 가지를 함께 씁니다. 바이너리로 직렬화한 메시지를 세그먼트 파일에 저장하는 구조예요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;바이너리 직렬화 포맷 비교&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;포맷특징
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Protocol Buffers (protobuf)&lt;/td&gt;
&lt;td&gt;Google 개발, JSON 대비 3~10배 작음, 스키마 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apache Avro&lt;/td&gt;
&lt;td&gt;Kafka와 많이 사용, 스키마 함께 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MessagePack&lt;/td&gt;
&lt;td&gt;JSON을 바이너리로 압축한 형태&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파일 관리 전략 비교&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;방식대표 사례특징
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;단일 파일&lt;/td&gt;
&lt;td&gt;Redis AOF&lt;/td&gt;
&lt;td&gt;단순하지만 무한정 커짐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;롤링 파일&lt;/td&gt;
&lt;td&gt;Logback&lt;/td&gt;
&lt;td&gt;날짜/크기 기준 교체&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;세그먼트&lt;/td&gt;
&lt;td&gt;Kafka&lt;/td&gt;
&lt;td&gt;offset 기반 탐색 최적화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;스냅샷&lt;/td&gt;
&lt;td&gt;Redis RDB&lt;/td&gt;
&lt;td&gt;특정 시점 전체 상태 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WAL&lt;/td&gt;
&lt;td&gt;PostgreSQL&lt;/td&gt;
&lt;td&gt;장애 복구용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LSM Tree&lt;/td&gt;
&lt;td&gt;Cassandra&lt;/td&gt;
&lt;td&gt;쓰기 최적화&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;모니터링은 풀 모델인가, 푸시 모델인가?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책 내용과 연결되는 내용이라 같이 정리했습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Prometheus&lt;/b&gt; &amp;rarr; 풀(Pull) 모델. 주기적으로 각 서비스의 /metrics 엔드포인트를 직접 scrape&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Loki&lt;/b&gt; &amp;rarr; 푸시(Push) 모델. Promtail 같은 에이전트가 로그를 Loki로 밀어넣음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Grafana&lt;/b&gt; &amp;rarr; 둘 다 아님. 시각화 도구로 Prometheus/Loki에서 데이터를 조회해서 표시&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;OpenTelemetry(OTel)는 둘 다 지원&lt;/b&gt;합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1778584153131&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;서비스 &amp;rarr; (push) &amp;rarr; OTel Collector &amp;rarr; (pull) &amp;rarr; Prometheus
                                 &amp;rarr; (push) &amp;rarr; Loki
                                 &amp;rarr; (push) &amp;rarr; Jaeger (트레이싱)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀 모델이 부하 제어에 유리한 이유는 수집기가 &lt;b&gt;scrape 간격을 조절&lt;/b&gt;할 수 있기 때문입니다. OTel Collector가 중간에서 버퍼링/배치 처리도 해줘서 부하를 완화합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;배운 점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공부하면서 느낀 건, 개념을 단순히 외우는 것보다 &lt;b&gt;&quot;왜 이렇게 설계했을까&quot;를 따라가는 게 훨씬 기억에 오래 남는다&lt;/b&gt;는 점입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세그먼트를 왜 쓰는지, 버퍼가 왜 필요한지, 풀/푸시 중 왜 풀을 선택했는지를 이해하면 비슷한 상황에서 스스로 판단할 수 있게 됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마치며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분산 메시지 큐는 처음에는 개념이 많아서 복잡하게 느껴지지만, 전체 흐름을 한 번 잡고 나면 각 컴포넌트가 왜 그 자리에 있는지가 보이기 시작합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글이 같은 책을 공부하시는 분들께 도움이 됐으면 좋겠습니다. 잘못된 내용이나 추가할 내용이 있으면 편하게 댓글로 알려주세요!&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;《대규모 시스템 설계 기초 2》 4장 분산 메시지 큐&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kafka.apache.org/documentation/&quot;&gt;Apache Kafka Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kafka.apache.org/documentation/#kraft&quot;&gt;Kafka KRaft Mode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Book</category>
      <author>Ry-</author>
      <guid isPermaLink="true">https://squash29.tistory.com/90</guid>
      <comments>https://squash29.tistory.com/90#entry90comment</comments>
      <pubDate>Tue, 12 May 2026 20:10:18 +0900</pubDate>
    </item>
    <item>
      <title>진짜 공격인 줄 알았는데 우리가 만든 장애였다</title>
      <link>https://squash29.tistory.com/89</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 KT Cloud Tech Up 과정에서 마지막 실무 프로젝트를 진행하면서 발생했던 문제를 하나 소개하고자 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저희 팀에서는 CDN을 CloudFlare로 사용하였습니다. 저번 프로젝트에 이미 Cloudfront을 사용해보기도 했고 여러번 경험을 해봤기 때문에 다른 CDN을 사용하고자 했습니다. 찾아보니 Versel 등 여러 CDN 서버들이 있더라고요 그중에 많이들 접근해봤고 알고 있는 CloudFlare을 사용해보자 했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bC3xfh/dJMcahjEyLZ/3RGw33gVroC9iewJzdTF0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bC3xfh/dJMcahjEyLZ/3RGw33gVroC9iewJzdTF0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bC3xfh/dJMcahjEyLZ/3RGw33gVroC9iewJzdTF0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbC3xfh%2FdJMcahjEyLZ%2F3RGw33gVroC9iewJzdTF0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;390&quot; height=&quot;129&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;129&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다들 많이들 보셨을 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 본 내용에 들어가기 전에 저희 팀이 CloudFlare을 어떻게 도입했고 어떤 방식으로 사용중인지에 대해 간략하게 소개하고자 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS의 CDN 처럼 프론트 웹 페이지를 S3에 담아서 운영하지 않습니다. 저도 놀랐던게 깃허브에 있는 리퍼지토를 기반으로 바로 서비스를 하는 형태였습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-02 오후 10.10.59.png&quot; data-origin-width=&quot;1645&quot; data-origin-height=&quot;869&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oL5Ys/dJMcabRd5oC/z9t1q5bkLP9rHx2cwUEMR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oL5Ys/dJMcabRd5oC/z9t1q5bkLP9rHx2cwUEMR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oL5Ys/dJMcabRd5oC/z9t1q5bkLP9rHx2cwUEMR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoL5Ys%2FdJMcabRd5oC%2Fz9t1q5bkLP9rHx2cwUEMR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1645&quot; height=&quot;869&quot; data-filename=&quot;스크린샷 2026-04-02 오후 10.10.59.png&quot; data-origin-width=&quot;1645&quot; data-origin-height=&quot;869&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이제 이 페이지에 WAF 설정을 걸을수가 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-02 오후 10.14.18.png&quot; data-origin-width=&quot;1629&quot; data-origin-height=&quot;862&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQAvUO/dJMcafe4FBF/3FKaZleIOatYZQMkgtLSwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQAvUO/dJMcafe4FBF/3FKaZleIOatYZQMkgtLSwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQAvUO/dJMcafe4FBF/3FKaZleIOatYZQMkgtLSwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQAvUO%2FdJMcafe4FBF%2F3FKaZleIOatYZQMkgtLSwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1629&quot; height=&quot;862&quot; data-filename=&quot;스크린샷 2026-04-02 오후 10.14.18.png&quot; data-origin-width=&quot;1629&quot; data-origin-height=&quot;862&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 WAF 옵션을 걸을수가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이떄 주요하게 살펴볼것은&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OWASP 설정 부분 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OWASP Top 10은 웹에서 가장 위험한 보안 취약점 10가지 목록 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 공격 데이터를 기반으로 OWASP 재단이 주기적으로 발표하는 가이드 라인입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;top-102025-list&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Top 10:2025 List&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #4051b5;&quot; href=&quot;https://owasp.org/Top10/2025/A01_2025-Broken_Access_Control/&quot;&gt;A01:2025 - Broken Access Control&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #4051b5;&quot; href=&quot;https://owasp.org/Top10/2025/A02_2025-Security_Misconfiguration/&quot;&gt;A02:2025 - Security Misconfiguration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #4051b5;&quot; href=&quot;https://owasp.org/Top10/2025/A03_2025-Software_Supply_Chain_Failures/&quot;&gt;A03:2025 - Software Supply Chain Failures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #4051b5;&quot; href=&quot;https://owasp.org/Top10/2025/A04_2025-Cryptographic_Failures/&quot;&gt;A04:2025 - Cryptographic Failures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #4051b5;&quot; href=&quot;https://owasp.org/Top10/2025/A05_2025-Injection/&quot;&gt;A05:2025 - Injection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #4051b5;&quot; href=&quot;https://owasp.org/Top10/2025/A06_2025-Insecure_Design/&quot;&gt;A06:2025 - Insecure Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #4051b5;&quot; href=&quot;https://owasp.org/Top10/2025/A07_2025-Authentication_Failures/&quot;&gt;A07:2025 - Authentication Failures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #4051b5;&quot; href=&quot;https://owasp.org/Top10/2025/A08_2025-Software_or_Data_Integrity_Failures/&quot;&gt;A08:2025 - Software or Data Integrity Failures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #4051b5;&quot; href=&quot;https://owasp.org/Top10/2025/A09_2025-Security_Logging_and_Alerting_Failures/&quot;&gt;A09:2025 - Security Logging and Alerting Failures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #4051b5;&quot; href=&quot;https://owasp.org/Top10/2025/A10_2025-Mishandling_of_Exceptional_Conditions/&quot;&gt;A10:2025 - Mishandling of Exceptional Conditions&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 WAF 설정으로도 막을 수없는 항목들이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 지금 얘기하려는 중요한 포인트입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당시에 해당 프로젝트에서 보안 공격을 수행하는 기간이 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저희 서비스를 마음대로 공격하고 그거에 대한 취약점을 공격팀이 발견하면 피드백해서 저희는 고치고 개선하는 기간이였죠&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;해킹 공경 waf 관제 상황.png&quot; data-origin-width=&quot;1903&quot; data-origin-height=&quot;927&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3oSqV/dJMcahxatPv/7t0L14NV0WjVuQKS0xvhSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3oSqV/dJMcahxatPv/7t0L14NV0WjVuQKS0xvhSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3oSqV/dJMcahxatPv/7t0L14NV0WjVuQKS0xvhSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3oSqV%2FdJMcahxatPv%2F7t0L14NV0WjVuQKS0xvhSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1903&quot; height=&quot;927&quot; data-filename=&quot;해킹 공경 waf 관제 상황.png&quot; data-origin-width=&quot;1903&quot; data-origin-height=&quot;927&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 이런식으로 계속 공격이 들어왔습니다. 그리고 CloudFlare가 이런식으로 공격이 어떻게 들어오고 있고 이런거를 관제 할 수 있었죠&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-02 오후 10.33.16.png&quot; data-origin-width=&quot;1637&quot; data-origin-height=&quot;868&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5LrpH/dJMcabqb3HJ/RtAXw7JOAk8l0f3l2U0M21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5LrpH/dJMcabqb3HJ/RtAXw7JOAk8l0f3l2U0M21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5LrpH/dJMcabqb3HJ/RtAXw7JOAk8l0f3l2U0M21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5LrpH%2FdJMcabqb3HJ%2FRtAXw7JOAk8l0f3l2U0M21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1637&quot; height=&quot;868&quot; data-filename=&quot;스크린샷 2026-04-02 오후 10.33.16.png&quot; data-origin-width=&quot;1637&quot; data-origin-height=&quot;868&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 당시 로그인을 수행하던 도중에 갑자기 모든 API가 동작을 하지 않는 겁니다. 그래서 저희는 그 순간 공격을 받고 있는 줄 알고 어떻게 대처하지, 지금 모니터링 관제해서 어디부분을 공격하고 있는 이런거를 부랴부랴 찾기 시작했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모니터링도 동작하지 않고, 접근은 가능하지만 매트릭을 확인하지 못하는 상황이였습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러다가 RDS의 상태를 확인해봤는데 RDS의 상태가&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;db 인스턴스 작은 문제 페이징 데이터 많음.png&quot; data-origin-width=&quot;1597&quot; data-origin-height=&quot;234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WU81O/dJMcaflN7SD/rncrfZva2cx3p8u84jswrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WU81O/dJMcaflN7SD/rncrfZva2cx3p8u84jswrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WU81O/dJMcaflN7SD/rncrfZva2cx3p8u84jswrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWU81O%2FdJMcaflN7SD%2FrncrfZva2cx3p8u84jswrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1597&quot; height=&quot;234&quot; data-filename=&quot;db 인스턴스 작은 문제 페이징 데이터 많음.png&quot; data-origin-width=&quot;1597&quot; data-origin-height=&quot;234&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 활동 세션의 상태가 이상했습니다. 거기 들어가서 확인해보니 특정 쿼리문을 수행하는데 58초가 걸리는 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RDS는 야구 더미 데이터를 천만건을 넣어둔 상황이였습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 쿼리문이 경기에 대한 모든 데이터를 join형태로 다 가져오는 형태로 구성되어 있었고 , 그 많은 경기가 다 가져와지는 상황이였습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2026-04-02_11.36.41.png&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWtra1/dJMcaf0nIph/QwkxD49JOzwF4shOozW6w0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWtra1/dJMcaf0nIph/QwkxD49JOzwF4shOozW6w0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWtra1/dJMcaf0nIph/QwkxD49JOzwF4shOozW6w0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWtra1%2FdJMcaf0nIph%2FQwkxD49JOzwF4shOozW6w0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;777&quot; height=&quot;230&quot; data-filename=&quot;2026-04-02_11.36.41.png&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;230&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 해당 문제를 백엔드팀과 공유하였고 개선 하였습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rds 문제 느림.png&quot; data-origin-width=&quot;1609&quot; data-origin-height=&quot;243&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9R78e/dJMcahYdthF/Iy8KkfHoh9VW2E9bKYFkd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9R78e/dJMcahYdthF/Iy8KkfHoh9VW2E9bKYFkd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9R78e/dJMcahYdthF/Iy8KkfHoh9VW2E9bKYFkd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9R78e%2FdJMcahYdthF%2FIy8KkfHoh9VW2E9bKYFkd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1609&quot; height=&quot;243&quot; data-filename=&quot;rds 문제 느림.png&quot; data-origin-width=&quot;1609&quot; data-origin-height=&quot;243&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 RDS의 성능을 높였더니 이제 제대로 동작하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 부분들이 OWASP 10 A6 Insecure Design 부분 입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 그 순간에는 정말 공격을 받고 있다고 생각해서 많이 당황했습니다. 하지만 돌이켜보면 외부의 공격보다 우리가 만든 코드가 더 위험했던 순간이었습니다. Cloudflare가 수많은 공격을 막아주고 있었지만, 정작 서비스를 멈추게 한 건 페이지네이션 하나 없이 천만 건을 통째로 조회하던 우리의 쿼리였으니까요. 앞으로는 기능 구현만큼이나 설계 단계에서의 보안 고민도 함께 가져가고 싶습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WAF 성능은 잘되는거 같습니다!!&lt;/p&gt;</description>
      <category>Network</category>
      <author>Ry-</author>
      <guid isPermaLink="true">https://squash29.tistory.com/89</guid>
      <comments>https://squash29.tistory.com/89#entry89comment</comments>
      <pubDate>Thu, 2 Apr 2026 22:35:29 +0900</pubDate>
    </item>
    <item>
      <title>AWS SAA-CO3 합격 후기</title>
      <link>https://squash29.tistory.com/88</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-03-07 오전 12.39.24.png&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dJ1w8l/dJMcaadoBAx/Mz1LBS1hkXTU9e5A0TQxQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dJ1w8l/dJMcaadoBAx/Mz1LBS1hkXTU9e5A0TQxQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dJ1w8l/dJMcaadoBAx/Mz1LBS1hkXTU9e5A0TQxQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJ1w8l%2FdJMcaadoBAx%2FMz1LBS1hkXTU9e5A0TQxQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1258&quot; height=&quot;464&quot; data-filename=&quot;스크린샷 2026-03-07 오전 12.39.24.png&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;464&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;시험 개요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS SAA(Solutions Architect Associate)는 아키텍처 설계 능력을 평가하는 자격증으로, 아래 4가지 영역을 다룹니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보안 아키텍처 설계&lt;/li&gt;
&lt;li&gt;복원력을 갖춘 아키텍처 설계&lt;/li&gt;
&lt;li&gt;고성능 아키텍처 설계&lt;/li&gt;
&lt;li&gt;비용에 최적화된 아키텍처 설계&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;유효 기간 :&lt;b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;3&lt;/span&gt;년&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;합격 점수 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;720점&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이상&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;b&gt;130분&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;동안&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;65 문제&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;진행 (&lt;b&gt;ESL +30Minutes&lt;/b&gt;를 신청했을 경우,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;160분&lt;/b&gt;)
&lt;ul style=&quot;list-style-type: circle; color: #353638;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li style=&quot;list-style-type: circle;&quot;&gt;사실 신청한 시간은 총 140/170분이지만, 실제 문제 풀이 시간은 130/160분이다. 왜냐하면 빠진 10분은 설문지 답변 시간으로 쓰이기 때문이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;문제 유형 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;4지 택일형&lt;/b&gt;(보기 4개 중 1개 정답)과&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;복수 응답형&lt;/b&gt;(보기 5개 이상 중 2개 이상 정답)으로 구성&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;총 65문제 중&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;15문제&lt;/b&gt;는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;채점 안됨&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(실제 점수 채점되는 건 총 50문제이다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;시험 장소 &amp;mdash; 안양 앤아버어학원&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://m.place.naver.com/place/938306589/home&quot;&gt;https://m.place.naver.com/place/938306589/home&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1772812483340&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;앤아버어학원 안양점 : 네이버 &quot; data-og-description=&quot;방문자리뷰 19 &amp;middot; 블로그리뷰 184&quot; data-og-host=&quot;m.place.naver.com&quot; data-og-source-url=&quot;https://m.place.naver.com/place/938306589/home&quot; data-og-url=&quot;https://m.place.naver.com/place/938306589/home&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cAXUvQ/dJMb8UHM5Bh/C1pXtzaqpe5k6HTbfv4fjk/img.jpg?width=640&amp;amp;height=380&amp;amp;face=0_0_640_380,https://scrap.kakaocdn.net/dn/QHnXJ/dJMb8T9Xovc/5BFBSc7kHlBBG22kzFnSIK/img.jpg?width=640&amp;amp;height=380&amp;amp;face=0_0_640_380,https://scrap.kakaocdn.net/dn/wnQHC/dJMb8SpFSfM/zAnlCQi8KiVit4CkYfJ2M0/img.jpg?width=750&amp;amp;height=563&amp;amp;face=0_0_750_563&quot;&gt;&lt;a href=&quot;https://m.place.naver.com/place/938306589/home&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://m.place.naver.com/place/938306589/home&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cAXUvQ/dJMb8UHM5Bh/C1pXtzaqpe5k6HTbfv4fjk/img.jpg?width=640&amp;amp;height=380&amp;amp;face=0_0_640_380,https://scrap.kakaocdn.net/dn/QHnXJ/dJMb8T9Xovc/5BFBSc7kHlBBG22kzFnSIK/img.jpg?width=640&amp;amp;height=380&amp;amp;face=0_0_640_380,https://scrap.kakaocdn.net/dn/wnQHC/dJMb8SpFSfM/zAnlCQi8KiVit4CkYfJ2M0/img.jpg?width=750&amp;amp;height=563&amp;amp;face=0_0_750_563');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;앤아버어학원 안양점 : 네이버 &lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;방문자리뷰 19 &amp;middot; 블로그리뷰 184&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;m.place.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nrNFK/dJMcaibq36A/2Y5k66V2cUFFx2ZiPThqZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nrNFK/dJMcaibq36A/2Y5k66V2cUFFx2ZiPThqZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nrNFK/dJMcaibq36A/2Y5k66V2cUFFx2ZiPThqZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnrNFK%2FdJMcaibq36A%2F2Y5k66V2cUFFx2ZiPThqZ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;426&quot; height=&quot;568&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시험은 안양에 위치한 앤아버어학원에서 응시했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예약 시간은 11시 45분이었는데, 11시 23분쯤 도착하자마자 바로 입실해서 시험을 시작할 수 있었습니다. 시험 전에 복습할 시간을 기대했지만, 예상보다 일찍 시작하게 되었네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시험실은 한 방에 약 7개의 개인 칸막이가 있는 구조였고, 저는 4번 자리에 앉았습니다. 히터 소음이 생각보다 있는 편이었는데, 시험에 집중하다 보니 크게 방해가 되지는 않았습니다. 다만 소음에 예민하신 분들은 참고하시면 좋을 것 같습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;시험 난이도 &amp;amp; 결과&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;13시 쯤 제출을 했고, 문제 난이도는 생각보다 평이한 편이었습니다. 65문제를 풀면서 &quot;이 문제는 채점 안 되는 문제겠구나&quot; 싶은 것들도 있었는데, 막상 결과는 &lt;b&gt;턱걸이 합격&lt;/b&gt;이었습니다. 방심은 금물이네요  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2012&quot; data-origin-height=&quot;534&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vz10Z/dJMcagklVZQ/ypTN7nvNSkJ2GDjKFKeU6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vz10Z/dJMcagklVZQ/ypTN7nvNSkJ2GDjKFKeU6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vz10Z/dJMcagklVZQ/ypTN7nvNSkJ2GDjKFKeU6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvz10Z%2FdJMcagklVZQ%2FypTN7nvNSkJ2GDjKFKeU6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2012&quot; height=&quot;534&quot; data-origin-width=&quot;2012&quot; data-origin-height=&quot;534&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;공부 방법 (약 1개월 준비)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;약 한 달간 아래 세 가지 방식으로 준비했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 유데미 강의&lt;/b&gt; 스테판 마렉(Stephane Maarek)의 &quot;AWS Certified Solutions Architect Associate 시험합격! 2025&quot; 강의를 수강하며 전체 개념을 잡았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 모의고사 풀이(스테판)&lt;/b&gt;&amp;nbsp;모의고사 6세트를 풀면서 모르는 개념을 별도로 정리했습니다. (모의고사 문제가 생각보다 어려웠습니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 덤프 문제 풀이&lt;/b&gt; 덤프 문제 약 380문제를 풀며 부족한 내용을 보완했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/dLODvs/dJMcahwPe36/1QwX0cyIg7AecSbFPHX2M0/%E1%84%83%E1%85%A5%E1%86%B7%E1%84%91%E1%85%B3%20%E1%84%8B%E1%85%A9%E1%84%83%E1%85%A1%E1%86%B8.pdf?attach=1&amp;amp;knm=tfile.pdf&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;덤프 오답.pdf&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.87MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개념 정리한 자료입니다. 여기에 몇 개념들이 빠진게 있으니 공부하면서 부족한 내용을 채워야 할 겁니다.&lt;/p&gt;</description>
      <category>Network</category>
      <author>Ry-</author>
      <guid isPermaLink="true">https://squash29.tistory.com/88</guid>
      <comments>https://squash29.tistory.com/88#entry88comment</comments>
      <pubDate>Sat, 7 Mar 2026 01:01:51 +0900</pubDate>
    </item>
    <item>
      <title>Terraform으로 EC2 관리하면서 겪은 AMI 필터링과 SSM 연결 이슈</title>
      <link>https://squash29.tistory.com/87</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;시작하며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Terraform으로 인프라를 관리하다 보면 &quot;분명히 코드는 맞는 것 같은데 왜 안 되지?&quot; 싶은 순간이 있습니다. 이번에는 AMI 필터링 설정 하나로 엉뚱한 이미지가 선택된 사건과, NAT Gateway와 EC2 시작 순서 때문에 SSM 연결이 안 됐던 경험을 공유해보려고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저처럼 삽질하지 않으셨으면 하는 마음으로 정리했습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 1: AMI 필터가 Minimal 버전을 잡아버림&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제 상황&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EC2 인스턴스를 프로비저닝할 때, 항상 최신 Amazon Linux 2023 AMI를 자동으로 선택하도록 Terraform 코드를 작성했습니다.&lt;/p&gt;
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;################################################################################
# Amazon Linux 2023 AMI (최신 자동 조회)
################################################################################
data &quot;aws_ami&quot; &quot;amazon_linux_2023&quot; {
  most_recent = true
  owners      = [&quot;amazon&quot;]

  filter {
    name   = &quot;name&quot;
    values = [&quot;al2023-ami-*-x86_64&quot;]  # ⚠️ 문제의 패턴
  }

  filter {
    name   = &quot;virtualization-type&quot;
    values = [&quot;hvm&quot;]
  }

  filter {
    name   = &quot;architecture&quot;
    values = [&quot;x86_64&quot;]
  }
}

resource &quot;aws_instance&quot; &quot;main&quot; {
  ami                    = data.aws_ami.amazon_linux_2023.id
  instance_type          = var.instance_type
  subnet_id              = var.private_subnet_id
  vpc_security_group_ids = [var.ec2_security_group_id]
  iam_instance_profile   = var.ec2_instance_profile_name
  monitoring             = true

  user_data = templatefile(&quot;${path.module}/user_data.sh.tftpl&quot;, {
    project     = var.project
    environment = var.environment
  })

  root_block_device {
    volume_type           = &quot;gp3&quot;
    volume_size           = 30
    delete_on_termination = false
    tags = {
      Name = &quot;${var.project}-${var.environment}-ec2-root&quot;
    }
  }

  tags = {
    Name = &quot;${var.project}-${var.environment}-ec2&quot;
  }

  lifecycle {
    ignore_changes = [ami]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언뜻 보면 문제없어 보이지만, 실제로 이 코드를 적용했더니 의도치 않게 &lt;b&gt;Minimal 버전 AMI&lt;/b&gt;가 선택됐습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;원인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;al2023-ami-*-x86_64 패턴은 다음 두 가지를 모두 매칭합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;al2023-ami-2023.x.x-x86_64 &amp;rarr; 일반 버전&lt;/li&gt;
&lt;li&gt;al2023-ami-minimal-2023.x.x-x86_64 &amp;rarr; Minimal 버전&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;most_recent = true 옵션 때문에 가장 최신 AMI가 선택되는데, 타이밍에 따라 Minimal 버전이 가장 최신으로 잡히면서 선택된 것이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Minimal 버전은 SSM Agent를 포함한 여러 패키지가 빠져있어서, 이후 SSM 연결이나 자동화 작업에서 예상치 못한 문제가 생길 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;해결 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AMI filter의 name 패턴을 조금 더 구체적으로 수정해서 Minimal이 매칭되는 경우를 제외했습니다.&lt;/p&gt;
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;################################################################################
# Amazon Linux 2023 AMI (최신 자동 조회)
################################################################################
data &quot;aws_ami&quot; &quot;amazon_linux_2023&quot; {
  most_recent = true
  owners      = [&quot;amazon&quot;]

  filter {
    name   = &quot;name&quot;
    values = [&quot;al2023-ami-2023*-x86_64&quot;]  # ✅ 수정된 패턴
  }

  filter {
    name   = &quot;virtualization-type&quot;
    values = [&quot;hvm&quot;]
  }

  filter {
    name   = &quot;architecture&quot;
    values = [&quot;x86_64&quot;]
  }
}

resource &quot;aws_instance&quot; &quot;main&quot; {
  ami                    = data.aws_ami.amazon_linux_2023.id
  instance_type          = var.instance_type
  subnet_id              = var.private_subnet_id
  vpc_security_group_ids = [var.ec2_security_group_id]
  iam_instance_profile   = var.ec2_instance_profile_name
  monitoring             = true

  user_data = templatefile(&quot;${path.module}/user_data.sh.tftpl&quot;, {
    project     = var.project
    environment = var.environment
  })

  root_block_device {
    volume_type           = &quot;gp3&quot;
    volume_size           = 30
    delete_on_termination = false
    tags = {
      Name = &quot;${var.project}-${var.environment}-ec2-root&quot;
    }
  }

  tags = {
    Name = &quot;${var.project}-${var.environment}-ec2&quot;
  }

  lifecycle {
    ignore_changes = [ami]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;al2023-ami-2023* 으로 바꾸면 이름이 반드시 2023으로 시작해야 하므로 minimal이 들어간 AMI는 자연스럽게 제외됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 2: NAT 재생성 후 SSM 연결이 안 됨&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제 상황&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비용 절약을 위해 운영 시간 외에는 EC2와 NAT Gateway를 내리도록 관리하고 있었습니다. Terraform으로 compute 모듈(EC2)과 billing 모듈(NAT Gateway)을 분리해서 관리했는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느 날 아래 순서로 인프라를 올렸더니 SSM 연결이 되지 않는 문제가 생겼습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;EC2 인스턴스 실행&lt;/li&gt;
&lt;li&gt;NAT Gateway 생성 (terraform apply -target=module.billing)&lt;/li&gt;
&lt;li&gt;SSM 연결 시도 &amp;rarr; &lt;b&gt;실패&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분명히 NAT도 있고, 라우팅 테이블도 정상인데 SSM이 붙지 않았습니다. EC2를 재시작하니 바로 연결됐습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;원인: SSM Agent의 Backoff 메커니즘&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSM 연결 흐름은 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;sqf&quot;&gt;&lt;code&gt;EC2 부팅 &amp;rarr; SSM Agent 자동 시작 &amp;rarr; SSM 서비스 연결 시도
              (Private Subnet이면 NAT를 통해 인터넷으로)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EC2가 먼저 부팅되면 SSM Agent가 즉시 SSM 서비스에 연결을 시도합니다. 이때 NAT가 없으면 연결에 실패하고, Agent는 &lt;b&gt;Exponential Backoff&lt;/b&gt; 방식으로 재시도 간격을 점점 늘립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음엔 몇 초 간격으로 재시도하다가, 계속 실패하면 최대 수십 분 간격으로 늘어납니다. NAT를 나중에 올려도 Agent가 긴 대기 상태에 있어서 즉시 연결되지 않는 것이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재시작을 하면 Agent가 새로 초기화되면서 NAT가 이미 올라가 있는 상태에서 연결을 시도하니 바로 성공하는 것이고요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;해결 방법: 시작 순서 보장&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;NAT Gateway를 먼저 올리고, EC2를 올려야 합니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# 올바른 순서
terraform apply -target=module.billing   # NAT 먼저
terraform apply -target=module.compute   # EC2 나중에
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 순서를 지키면 EC2 부팅 시점에 NAT가 이미 준비되어 있어서 SSM Agent가 첫 시도에 바로 연결됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;main.tf에 주석으로 순서를 명시해두면 팀원 모두가 실수하지 않을 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# main.tf
# ⚠️ 리소스 생성/시작 순서 주의:
# 1. module.billing (NAT Gateway) 먼저
# 2. module.compute (EC2) 나중에
# NAT 없이 EC2가 먼저 뜨면 SSM Agent backoff로 인해 연결이 지연됩니다.
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;배운 점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 경험을 통해 두 가지를 크게 느꼈습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째는 &lt;b&gt;와일드카드 패턴은 생각보다 넓게 매칭된다&lt;/b&gt;는 점입니다. *는 편리하지만, 의도하지 않은 리소스를 잡을 수 있습니다. AMI 필터처럼 most_recent와 함께 쓸 때는 특히 구체적으로 작성하는 게 안전합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째는 &lt;b&gt;의존성이 없는 리소스도 시작 순서가 중요할 수 있다&lt;/b&gt;는 점입니다. Terraform은 명시적 의존성이 없으면 순서를 보장하지 않습니다. SSM Agent처럼 부팅 시 한 번만 연결을 시도하는 컴포넌트는 의존하는 인프라가 먼저 준비되어 있어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;++ Cloudfront도 테라폼으로 운영하게되면&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-25 오전 10.30.21.png&quot; data-origin-width=&quot;1371&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSQ2SN/dJMcahwJtKJ/xDiaZbvVoX1ob8fbUSEPtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSQ2SN/dJMcahwJtKJ/xDiaZbvVoX1ob8fbUSEPtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSQ2SN/dJMcahwJtKJ/xDiaZbvVoX1ob8fbUSEPtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSQ2SN%2FdJMcahwJtKJ%2FxDiaZbvVoX1ob8fbUSEPtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1371&quot; height=&quot;646&quot; data-filename=&quot;스크린샷 2026-02-25 오전 10.30.21.png&quot; data-origin-width=&quot;1371&quot; data-origin-height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 Pay as you go로 설정이 되는 경험을 해서 부하 테스트시 비용이 갑자기 많이 오르는 경험을 했습니다.!!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마치며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작은 설정 하나, 실행 순서 하나가 생각보다 큰 문제로 이어질 수 있다는 걸 다시 한번 느꼈습니다. 비슷한 상황에서 헤매고 계신 분들께 이 글이 도움이 됐으면 좋겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹시 비슷한 경험이 있거나, 더 좋은 방법을 알고 계신다면 댓글로 공유해주세요!&lt;/p&gt;</description>
      <category>Network</category>
      <author>Ry-</author>
      <guid isPermaLink="true">https://squash29.tistory.com/87</guid>
      <comments>https://squash29.tistory.com/87#entry87comment</comments>
      <pubDate>Wed, 25 Feb 2026 10:31:57 +0900</pubDate>
    </item>
  </channel>
</rss>