<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Infrastructure on IT Comparison</title><link>https://comparison.metacog.co.kr/tags/infrastructure/</link><description>Recent content in Infrastructure on IT Comparison</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 06 Sep 2026 09:36:59 +0900</lastBuildDate><atom:link href="https://comparison.metacog.co.kr/tags/infrastructure/index.xml" rel="self" type="application/rss+xml"/><item><title>Vertical vs Horizontal Scaling: Bigger Box vs More Boxes</title><link>https://comparison.metacog.co.kr/posts/2026-09-06-vertical-vs-horizontal-scaling-bigger-box-vs-more-boxes/</link><pubDate>Sun, 06 Sep 2026 09:36:59 +0900</pubDate><guid>https://comparison.metacog.co.kr/posts/2026-09-06-vertical-vs-horizontal-scaling-bigger-box-vs-more-boxes/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Vertical scaling grows capacity by adding more &lt;strong class="kw"&gt;CPU/RAM&lt;/strong&gt; to a single machine, while horizontal scaling grows capacity by adding &lt;strong class="kw"&gt;more nodes&lt;/strong&gt; behind a load balancer. The choice shapes your application&amp;rsquo;s architecture, failure model, and cost curve as it grows.&lt;/p&gt;
&lt;h2 id="comparison-diagram"&gt;Comparison Diagram&lt;/h2&gt;
&lt;div class="compare-diagram"&gt;
&lt;svg viewBox="0 0 640 360" xmlns="http://www.w3.org/2000/svg"&gt;&lt;text x="160" y="40" text-anchor="middle" font-size="18" style="fill:var(--primary)"&gt;Vertical&lt;/text&gt;&lt;text x="480" y="40" text-anchor="middle" font-size="18" style="fill:var(--primary)"&gt;Horizontal&lt;/text&gt;&lt;line x1="320" y1="20" x2="320" y2="340" style="stroke:var(--border)" stroke-width="1" stroke-dasharray="4 4"/&gt;&lt;rect x="120" y="230" width="80" height="60" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="160" y="265" text-anchor="middle" font-size="11" style="fill:var(--content)"&gt;Server&lt;/text&gt;&lt;rect x="110" y="150" width="100" height="70" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="2"/&gt;&lt;text x="160" y="180" text-anchor="middle" font-size="12" style="fill:var(--content)"&gt;Server&lt;/text&gt;&lt;text x="160" y="197" text-anchor="middle" font-size="11" style="fill:var(--secondary)"&gt;+CPU +RAM&lt;/text&gt;&lt;rect x="95" y="60" width="130" height="80" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="2.5"/&gt;&lt;text x="160" y="95" text-anchor="middle" font-size="13" style="fill:var(--content)"&gt;Server&lt;/text&gt;&lt;text x="160" y="114" text-anchor="middle" font-size="11" style="fill:var(--secondary)"&gt;++CPU ++RAM&lt;/text&gt;&lt;path d="M160 145 L160 232" style="stroke:var(--compare-a)" stroke-width="1.5" stroke-dasharray="3 3" fill="none"/&gt;&lt;path d="M155 60 L155 -0" style="stroke:var(--border)" stroke-width="0"/&gt;&lt;line x1="160" y1="40" x2="160" y2="58" style="stroke:var(--compare-a)" stroke-width="1.5" stroke-dasharray="3 3"/&gt;&lt;rect x="430" y="60" width="100" height="36" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="2"/&gt;&lt;text x="480" y="83" text-anchor="middle" font-size="12" style="fill:var(--content)"&gt;Load Balancer&lt;/text&gt;&lt;line x1="480" y1="96" x2="400" y2="150" style="stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;line x1="480" y1="96" x2="480" y2="150" style="stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;line x1="480" y1="96" x2="560" y2="150" style="stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;rect x="365" y="150" width="70" height="50" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="400" y="180" text-anchor="middle" font-size="11" style="fill:var(--content)"&gt;Node&lt;/text&gt;&lt;rect x="445" y="150" width="70" height="50" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="480" y="180" text-anchor="middle" font-size="11" style="fill:var(--content)"&gt;Node&lt;/text&gt;&lt;rect x="525" y="150" width="70" height="50" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="560" y="180" text-anchor="middle" font-size="11" style="fill:var(--content)"&gt;Node&lt;/text&gt;&lt;rect x="485" y="230" width="70" height="50" rx="4" style="fill:none;stroke:var(--border)" stroke-width="1.5" stroke-dasharray="4 4"/&gt;&lt;text x="520" y="260" text-anchor="middle" font-size="11" style="fill:var(--secondary)"&gt;+Node&lt;/text&gt;&lt;line x1="480" y1="200" x2="520" y2="228" style="stroke:var(--border)" stroke-width="1" stroke-dasharray="3 3"/&gt;&lt;text x="160" y="330" text-anchor="middle" font-size="12" style="fill:var(--secondary)"&gt;Single node, growing&lt;/text&gt;&lt;text x="480" y="330" text-anchor="middle" font-size="12" style="fill:var(--secondary)"&gt;Many nodes, distributed&lt;/text&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;h2 id="comparison-table"&gt;Comparison Table&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Vertical Scaling&lt;/th&gt;
&lt;th&gt;Horizontal Scaling&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Scaling mechanism&lt;/td&gt;
&lt;td&gt;Add CPU, RAM, or faster disks to one machine&lt;/td&gt;
&lt;td&gt;Add more machines/nodes to a shared pool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Architecture requirement&lt;/td&gt;
&lt;td&gt;Works with any app, no code changes needed&lt;/td&gt;
&lt;td&gt;Requires stateless design, load balancing, and shared state (session store, distributed cache)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Upper limit&lt;/td&gt;
&lt;td&gt;Capped by the largest hardware SKU available&lt;/td&gt;
&lt;td&gt;Effectively unbounded, limited only by orchestration and cost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Downtime during scale-up&lt;/td&gt;
&lt;td&gt;Often requires reboot or migration to bigger instance&lt;/td&gt;
&lt;td&gt;New nodes join the pool live, no downtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fault tolerance&lt;/td&gt;
&lt;td&gt;Single point of failure — one box, one crash&lt;/td&gt;
&lt;td&gt;Node failures are absorbed by the remaining pool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost curve&lt;/td&gt;
&lt;td&gt;Price rises non-linearly at the high end (diminishing returns)&lt;/td&gt;
&lt;td&gt;Roughly linear cost per added unit of capacity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operational complexity&lt;/td&gt;
&lt;td&gt;Low — one server to patch, monitor, and secure&lt;/td&gt;
&lt;td&gt;Higher — needs service discovery, distributed monitoring, data consistency handling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical use case&lt;/td&gt;
&lt;td&gt;Monolithic apps, relational databases, legacy systems&lt;/td&gt;
&lt;td&gt;Stateless web services, microservices, cloud-native workloads&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="key-differences"&gt;Key Differences&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Vertical scaling upgrades a &lt;strong class="kw"&gt;single machine&lt;/strong&gt;; horizontal scaling adds &lt;strong class="kw"&gt;more machines&lt;/strong&gt; to a pool&lt;/li&gt;
&lt;li&gt;Horizontal scaling demands &lt;strong class="kw"&gt;stateless services&lt;/strong&gt;, while vertical scaling needs no architectural change&lt;/li&gt;
&lt;li&gt;Vertical scaling has a hard &lt;strong class="kw"&gt;hardware ceiling&lt;/strong&gt;; horizontal scaling scales near-linearly&lt;/li&gt;
&lt;li&gt;A single oversized server is a &lt;strong class="kw"&gt;single point of failure&lt;/strong&gt;, unlike a distributed node pool&lt;/li&gt;
&lt;li&gt;Horizontal scaling trades simplicity for &lt;strong class="kw"&gt;operational complexity&lt;/strong&gt; in orchestration and consistency&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="when-to-use-each"&gt;When to Use Each&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Vertical Scaling&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Edge Computing vs Cloud Computing: Where the Processing Happens</title><link>https://comparison.metacog.co.kr/posts/2026-08-03-edge-computing-vs-cloud-computing-where-the-processing-happe/</link><pubDate>Mon, 03 Aug 2026 06:31:33 +0900</pubDate><guid>https://comparison.metacog.co.kr/posts/2026-08-03-edge-computing-vs-cloud-computing-where-the-processing-happe/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Edge computing and cloud computing both run workloads away from the end-user device, but they differ in where that processing physically happens relative to the data source. &lt;strong class="kw"&gt;Edge computing&lt;/strong&gt; pushes compute to nodes near the device to cut latency, while &lt;strong class="kw"&gt;cloud computing&lt;/strong&gt; centralizes it in remote data centers for scale and simplicity. The choice shapes latency budgets, bandwidth costs, and how much infrastructure you have to manage yourself.&lt;/p&gt;
&lt;h2 id="comparison-diagram"&gt;Comparison Diagram&lt;/h2&gt;
&lt;div class="compare-diagram"&gt;
&lt;svg viewBox="0 0 640 360" xmlns="http://www.w3.org/2000/svg"&gt;&lt;text x="320" y="36" text-anchor="middle" font-size="18" style="fill:var(--primary)"&gt;Where Processing Happens&lt;/text&gt;&lt;text x="140" y="70" text-anchor="middle" font-size="15" style="fill:var(--compare-a)"&gt;Edge Computing&lt;/text&gt;&lt;rect x="60" y="100" width="60" height="40" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="90" y="124" text-anchor="middle" font-size="11" style="fill:var(--content)"&gt;Device&lt;/text&gt;&lt;line x1="120" y1="120" x2="195" y2="120" style="stroke:var(--compare-a)" stroke-width="2"/&gt;&lt;polygon points="195,115 205,120 195,125" style="fill:var(--compare-a)"/&gt;&lt;rect x="205" y="100" width="70" height="40" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="240" y="120" text-anchor="middle" font-size="10" style="fill:var(--content)"&gt;Edge&lt;/text&gt;&lt;text x="240" y="133" text-anchor="middle" font-size="10" style="fill:var(--content)"&gt;Node&lt;/text&gt;&lt;line x1="205" y1="150" x2="120" y2="150" style="stroke:var(--compare-a)" stroke-width="2"/&gt;&lt;polygon points="120,145 110,150 120,155" style="fill:var(--compare-a)"/&gt;&lt;text x="162" y="172" text-anchor="middle" font-size="11" style="fill:var(--secondary)"&gt;~1-5 ms round trip&lt;/text&gt;&lt;text x="500" y="70" text-anchor="middle" font-size="15" style="fill:var(--compare-b)"&gt;Cloud Computing&lt;/text&gt;&lt;rect x="60" y="210" width="60" height="40" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="90" y="234" text-anchor="middle" font-size="11" style="fill:var(--content)"&gt;Device&lt;/text&gt;&lt;line x1="120" y1="228" x2="555" y2="228" stroke-dasharray="5,4" style="stroke:var(--compare-b)" stroke-width="2"/&gt;&lt;polygon points="555,223 565,228 555,233" style="fill:var(--compare-b)"/&gt;&lt;rect x="565" y="205" width="55" height="46" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="592" y="224" text-anchor="middle" font-size="9" style="fill:var(--content)"&gt;Cloud&lt;/text&gt;&lt;text x="592" y="236" text-anchor="middle" font-size="9" style="fill:var(--content)"&gt;Data&lt;/text&gt;&lt;text x="592" y="248" text-anchor="middle" font-size="9" style="fill:var(--content)"&gt;Center&lt;/text&gt;&lt;line x1="565" y1="258" x2="120" y2="258" stroke-dasharray="5,4" style="stroke:var(--compare-b)" stroke-width="2"/&gt;&lt;polygon points="120,253 110,258 120,263" style="fill:var(--compare-b)"/&gt;&lt;text x="342" y="280" text-anchor="middle" font-size="11" style="fill:var(--secondary)"&gt;~50-150 ms round trip, multiple network hops&lt;/text&gt;&lt;line x1="32" y1="310" x2="32" y2="330" style="stroke:var(--border)" stroke-width="1"/&gt;&lt;text x="320" y="330" text-anchor="middle" font-size="12" style="fill:var(--secondary)"&gt;Same device, two distances to compute&lt;/text&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;h2 id="comparison-table"&gt;Comparison Table&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Edge Computing&lt;/th&gt;
&lt;th&gt;Cloud Computing&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Processing location&lt;/td&gt;
&lt;td&gt;Local nodes, gateways, or on-device hardware near the data source&lt;/td&gt;
&lt;td&gt;Centralized data centers operated by the provider, often far from the source&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latency&lt;/td&gt;
&lt;td&gt;Single-digit to low double-digit milliseconds due to physical proximity&lt;/td&gt;
&lt;td&gt;Tens to hundreds of milliseconds depending on distance and network path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network dependency&lt;/td&gt;
&lt;td&gt;Can operate with intermittent or low-bandwidth connectivity to the core network&lt;/td&gt;
&lt;td&gt;Requires a stable, sufficiently fast connection to reach the data center&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bandwidth usage&lt;/td&gt;
&lt;td&gt;Filters or pre-processes data locally, sending only summaries upstream&lt;/td&gt;
&lt;td&gt;Raw data typically travels over the network to be processed centrally&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compute and storage capacity&lt;/td&gt;
&lt;td&gt;Limited by the size and power of local hardware&lt;/td&gt;
&lt;td&gt;Effectively unlimited, elastic capacity provisioned on demand&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data handling and privacy&lt;/td&gt;
&lt;td&gt;Sensitive data can be processed and stay on-site, reducing exposure&lt;/td&gt;
&lt;td&gt;Data leaves the local environment and is subject to provider-side controls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scalability and management&lt;/td&gt;
&lt;td&gt;Scaling means deploying and maintaining more physical nodes across sites&lt;/td&gt;
&lt;td&gt;Scaling is a configuration change managed by the provider&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost model&lt;/td&gt;
&lt;td&gt;Upfront hardware and per-site operational costs&lt;/td&gt;
&lt;td&gt;Pay-as-you-go operating expense with no hardware to own&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="key-differences"&gt;Key Differences&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Edge computing minimizes &lt;strong class="kw"&gt;latency&lt;/strong&gt; by keeping processing physically close to the data source&lt;/li&gt;
&lt;li&gt;Cloud computing offers far greater &lt;strong class="kw"&gt;elastic capacity&lt;/strong&gt; since it draws on a shared, centralized pool of resources&lt;/li&gt;
&lt;li&gt;Edge deployments reduce &lt;strong class="kw"&gt;bandwidth&lt;/strong&gt; costs by filtering data before it ever leaves the site&lt;/li&gt;
&lt;li&gt;Cloud computing is simpler to &lt;strong class="kw"&gt;manage&lt;/strong&gt; since there&amp;rsquo;s no distributed hardware fleet to maintain&lt;/li&gt;
&lt;li&gt;Edge nodes can keep &lt;strong class="kw"&gt;sensitive data&lt;/strong&gt; local, while cloud centralization concentrates data in provider infrastructure&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="when-to-use-each"&gt;When to Use Each&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Edge Computing&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Load Balancer vs Reverse Proxy: Traffic Distribution vs Request Mediation</title><link>https://comparison.metacog.co.kr/posts/2026-08-03-load-balancer-vs-reverse-proxy-traffic-distribution-vs-reque/</link><pubDate>Mon, 03 Aug 2026 06:30:57 +0900</pubDate><guid>https://comparison.metacog.co.kr/posts/2026-08-03-load-balancer-vs-reverse-proxy-traffic-distribution-vs-reque/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;A &lt;strong class="kw"&gt;load balancer&lt;/strong&gt; spreads incoming traffic across many identical backend servers so no single machine gets overwhelmed, while a &lt;strong class="kw"&gt;reverse proxy&lt;/strong&gt; sits in front of one or more servers to mediate, secure, and transform requests on their behalf. The two overlap heavily in practice — most modern reverse proxies (NGINX, Envoy, HAProxy) can also load balance — but the distinction matters when you&amp;rsquo;re deciding which capability you actually need to configure or scale for.&lt;/p&gt;</description></item><item><title>Managed Database vs Self-Hosted Database: Who Runs the Stack</title><link>https://comparison.metacog.co.kr/posts/2026-08-03-managed-database-vs-self-hosted-database-who-runs-the-stack/</link><pubDate>Mon, 03 Aug 2026 06:30:21 +0900</pubDate><guid>https://comparison.metacog.co.kr/posts/2026-08-03-managed-database-vs-self-hosted-database-who-runs-the-stack/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;A managed database hands the operating system, patching, backups, and failover to a &lt;strong class="kw"&gt;cloud provider&lt;/strong&gt;, while a self-hosted database keeps the entire stack under your team&amp;rsquo;s &lt;strong class="kw"&gt;direct control&lt;/strong&gt;. The choice trades operational convenience against flexibility, cost structure, and how much low-level tuning you&amp;rsquo;re allowed to do.&lt;/p&gt;
&lt;h2 id="comparison-diagram"&gt;Comparison Diagram&lt;/h2&gt;
&lt;div class="compare-diagram"&gt;
&lt;svg viewBox="0 0 640 360" xmlns="http://www.w3.org/2000/svg"&gt;&lt;text x="160" y="30" text-anchor="middle" font-size="16" font-weight="bold" style="fill:var(--primary)"&gt;Managed Database&lt;/text&gt;&lt;text x="480" y="30" text-anchor="middle" font-size="16" font-weight="bold" style="fill:var(--primary)"&gt;Self-Hosted Database&lt;/text&gt;&lt;rect x="60" y="55" width="200" height="45" rx="4" style="fill:none;stroke:var(--border)" stroke-width="1.5"/&gt;&lt;text x="160" y="82" text-anchor="middle" font-size="12" style="fill:var(--content)"&gt;Application / Queries&lt;/text&gt;&lt;rect x="50" y="110" width="220" height="195" rx="6" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="160" y="128" text-anchor="middle" font-size="12" font-weight="600" style="fill:var(--compare-a)"&gt;Provider Manages&lt;/text&gt;&lt;rect x="70" y="140" width="180" height="40" rx="4" style="fill:none;stroke:var(--border)" stroke-width="1.5"/&gt;&lt;text x="160" y="164" text-anchor="middle" font-size="12" style="fill:var(--content)"&gt;DB Engine&lt;/text&gt;&lt;rect x="70" y="195" width="180" height="40" rx="4" style="fill:none;stroke:var(--border)" stroke-width="1.5"/&gt;&lt;text x="160" y="219" text-anchor="middle" font-size="12" style="fill:var(--content)"&gt;Operating System&lt;/text&gt;&lt;rect x="70" y="250" width="180" height="40" rx="4" style="fill:none;stroke:var(--border)" stroke-width="1.5"/&gt;&lt;text x="160" y="274" text-anchor="middle" font-size="12" style="fill:var(--content)"&gt;Hardware / Storage&lt;/text&gt;&lt;text x="160" y="330" text-anchor="middle" font-size="11" style="fill:var(--secondary)"&gt;Less control, less toil&lt;/text&gt;&lt;rect x="370" y="55" width="220" height="250" rx="6" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="480" y="73" text-anchor="middle" font-size="12" font-weight="600" style="fill:var(--compare-b)"&gt;You Manage Everything&lt;/text&gt;&lt;rect x="390" y="85" width="180" height="40" rx="4" style="fill:none;stroke:var(--border)" stroke-width="1.5"/&gt;&lt;text x="480" y="109" text-anchor="middle" font-size="12" style="fill:var(--content)"&gt;Application / Queries&lt;/text&gt;&lt;rect x="390" y="140" width="180" height="40" rx="4" style="fill:none;stroke:var(--border)" stroke-width="1.5"/&gt;&lt;text x="480" y="164" text-anchor="middle" font-size="12" style="fill:var(--content)"&gt;DB Engine&lt;/text&gt;&lt;rect x="390" y="195" width="180" height="40" rx="4" style="fill:none;stroke:var(--border)" stroke-width="1.5"/&gt;&lt;text x="480" y="219" text-anchor="middle" font-size="12" style="fill:var(--content)"&gt;Operating System&lt;/text&gt;&lt;rect x="390" y="250" width="180" height="40" rx="4" style="fill:none;stroke:var(--border)" stroke-width="1.5"/&gt;&lt;text x="480" y="274" text-anchor="middle" font-size="12" style="fill:var(--content)"&gt;Hardware / Storage&lt;/text&gt;&lt;text x="480" y="330" text-anchor="middle" font-size="11" style="fill:var(--secondary)"&gt;More control, more toil&lt;/text&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;h2 id="comparison-table"&gt;Comparison Table&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Managed Database&lt;/th&gt;
&lt;th&gt;Self-Hosted Database&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Provisioning &amp;amp; setup&lt;/td&gt;
&lt;td&gt;Spin up via console or API in minutes; provider installs and configures the engine&lt;/td&gt;
&lt;td&gt;Manually install and configure the OS, storage, and database software yourself&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Configuration &amp;amp; tuning access&lt;/td&gt;
&lt;td&gt;Limited to exposed parameters and flags; some engine internals and OS access are locked&lt;/td&gt;
&lt;td&gt;Full root or admin access to every config file, kernel setting, and storage layout&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scaling&lt;/td&gt;
&lt;td&gt;Resize compute or add read replicas with a click or API call; provider automates the process&lt;/td&gt;
&lt;td&gt;Provision new hardware and reconfigure sharding or replication topology yourself&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backups &amp;amp; recovery&lt;/td&gt;
&lt;td&gt;Automated snapshots and point-in-time restore built into the service&lt;/td&gt;
&lt;td&gt;You script, schedule, and test your own backup and restore procedures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Patching &amp;amp; upgrades&lt;/td&gt;
&lt;td&gt;Provider applies OS and engine security patches on a maintenance schedule&lt;/td&gt;
&lt;td&gt;You plan, test, and execute every patch and major version upgrade&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High availability &amp;amp; failover&lt;/td&gt;
&lt;td&gt;Multi-AZ replication and automatic failover configured with a toggle&lt;/td&gt;
&lt;td&gt;You design, build, and test the replication and failover setup yourself&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monitoring &amp;amp; support&lt;/td&gt;
&lt;td&gt;Built-in dashboards and alerts, plus vendor support tickets for engine-level issues&lt;/td&gt;
&lt;td&gt;You assemble your own monitoring stack; support is internal or community-based&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost model&lt;/td&gt;
&lt;td&gt;Higher per-hour price that bundles operational labor into the bill&lt;/td&gt;
&lt;td&gt;Lower raw infrastructure cost but a hidden cost in engineering time&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="key-differences"&gt;Key Differences&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Managed services abstract patching and OS maintenance behind a &lt;strong class="kw"&gt;provider&lt;/strong&gt; SLA.&lt;/li&gt;
&lt;li&gt;Self-hosted setups grant full &lt;strong class="kw"&gt;root access&lt;/strong&gt; to tune kernel, storage, and engine internals.&lt;/li&gt;
&lt;li&gt;Failover and multi-AZ replication are &lt;strong class="kw"&gt;automated&lt;/strong&gt; in managed offerings but hand-built elsewhere.&lt;/li&gt;
&lt;li&gt;Cost shifts from engineering hours to a recurring &lt;strong class="kw"&gt;subscription fee&lt;/strong&gt; with managed databases.&lt;/li&gt;
&lt;li&gt;Self-hosting permits any &lt;strong class="kw"&gt;custom extension&lt;/strong&gt; or fork that managed platforms often restrict.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="when-to-use-each"&gt;When to Use Each&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Managed Database&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Object Storage vs Block Storage: Data Model and Access Pattern</title><link>https://comparison.metacog.co.kr/posts/2026-08-03-object-storage-vs-block-storage-data-model-and-access-patter/</link><pubDate>Mon, 03 Aug 2026 06:22:17 +0900</pubDate><guid>https://comparison.metacog.co.kr/posts/2026-08-03-object-storage-vs-block-storage-data-model-and-access-patter/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Block storage exposes raw, fixed-size &lt;strong class="kw"&gt;disk blocks&lt;/strong&gt; to a single attached server, just like a physical hard drive — ideal for databases and boot volumes needing low-latency random reads and writes. Object storage instead organizes data as whole items with &lt;strong class="kw"&gt;rich metadata&lt;/strong&gt; in a flat, HTTP-accessible namespace, trading fine-grained in-place edits for virtually unlimited scale. The choice determines whether your application talks to storage like a disk or like a web API.&lt;/p&gt;</description></item><item><title>Public Cloud vs Private Cloud: Who Owns the Infrastructure</title><link>https://comparison.metacog.co.kr/posts/2026-08-03-public-cloud-vs-private-cloud-who-owns-the-infrastructure/</link><pubDate>Mon, 03 Aug 2026 06:18:50 +0900</pubDate><guid>https://comparison.metacog.co.kr/posts/2026-08-03-public-cloud-vs-private-cloud-who-owns-the-infrastructure/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Public and private cloud both deliver on-demand, virtualized IT resources, but differ in who owns and shares the underlying infrastructure. Public cloud pools &lt;strong class="kw"&gt;shared hardware&lt;/strong&gt; across many customers over the internet, while private cloud reserves &lt;strong class="kw"&gt;dedicated hardware&lt;/strong&gt; for a single organization. The choice shapes cost, control, and compliance posture.&lt;/p&gt;
&lt;h2 id="comparison-diagram"&gt;Comparison Diagram&lt;/h2&gt;
&lt;div class="compare-diagram"&gt;
&lt;svg viewBox="0 0 640 360" xmlns="http://www.w3.org/2000/svg"&gt;&lt;text x="160" y="28" text-anchor="middle" font-size="18" font-weight="bold" style="fill:var(--primary)"&gt;Public Cloud&lt;/text&gt;&lt;text x="480" y="28" text-anchor="middle" font-size="18" font-weight="bold" style="fill:var(--primary)"&gt;Private Cloud&lt;/text&gt;&lt;text x="160" y="46" text-anchor="middle" font-size="11" style="fill:var(--secondary)"&gt;via Public Internet&lt;/text&gt;&lt;text x="480" y="46" text-anchor="middle" font-size="11" style="fill:var(--secondary)"&gt;via Private Network / VPN&lt;/text&gt;&lt;rect x="30" y="55" width="260" height="245" rx="8" stroke-dasharray="6,4" stroke-width="1.5" style="fill:var(--compare-a-soft);stroke:var(--compare-a)"/&gt;&lt;rect x="50" y="75" width="100" height="90" rx="4" stroke-width="1.5" style="fill:var(--compare-a-soft);stroke:var(--compare-a)"/&gt;&lt;text x="100" y="124" text-anchor="middle" font-size="12" style="fill:var(--content)"&gt;Org A&lt;/text&gt;&lt;rect x="170" y="75" width="100" height="90" rx="4" stroke-width="2.5" style="fill:var(--compare-a-soft);stroke:var(--compare-a)"/&gt;&lt;text x="220" y="124" text-anchor="middle" font-size="12" font-weight="bold" style="fill:var(--primary)"&gt;You&lt;/text&gt;&lt;rect x="50" y="180" width="100" height="90" rx="4" stroke-width="1.5" style="fill:var(--compare-a-soft);stroke:var(--compare-a)"/&gt;&lt;text x="100" y="229" text-anchor="middle" font-size="12" style="fill:var(--content)"&gt;Org B&lt;/text&gt;&lt;rect x="170" y="180" width="100" height="90" rx="4" stroke-width="1.5" style="fill:var(--compare-a-soft);stroke:var(--compare-a)"/&gt;&lt;text x="220" y="229" text-anchor="middle" font-size="12" style="fill:var(--content)"&gt;Org C&lt;/text&gt;&lt;rect x="350" y="55" width="260" height="245" rx="8" stroke-width="1.5" style="fill:var(--compare-b-soft);stroke:var(--compare-b)"/&gt;&lt;text x="480" y="78" text-anchor="middle" font-size="12" font-weight="bold" style="fill:var(--primary)"&gt;Your Org Only&lt;/text&gt;&lt;rect x="370" y="90" width="220" height="60" rx="4" stroke-width="1.5" style="fill:var(--compare-b-soft);stroke:var(--compare-b)"/&gt;&lt;text x="480" y="124" text-anchor="middle" font-size="12" style="fill:var(--content)"&gt;Compute&lt;/text&gt;&lt;rect x="370" y="158" width="220" height="60" rx="4" stroke-width="1.5" style="fill:var(--compare-b-soft);stroke:var(--compare-b)"/&gt;&lt;text x="480" y="192" text-anchor="middle" font-size="12" style="fill:var(--content)"&gt;Storage&lt;/text&gt;&lt;rect x="370" y="226" width="220" height="60" rx="4" stroke-width="1.5" style="fill:var(--compare-b-soft);stroke:var(--compare-b)"/&gt;&lt;text x="480" y="260" text-anchor="middle" font-size="12" style="fill:var(--content)"&gt;Network&lt;/text&gt;&lt;text x="160" y="320" text-anchor="middle" font-size="12" style="fill:var(--secondary)"&gt;Shared, multi-tenant&lt;/text&gt;&lt;text x="480" y="320" text-anchor="middle" font-size="12" style="fill:var(--secondary)"&gt;Dedicated, single-tenant&lt;/text&gt;&lt;line x1="310" y1="178" x2="330" y2="178" stroke-width="1" style="stroke:var(--border)"/&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;h2 id="comparison-table"&gt;Comparison Table&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Public Cloud&lt;/th&gt;
&lt;th&gt;Private Cloud&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Infrastructure ownership&lt;/td&gt;
&lt;td&gt;Owned and operated by a third-party provider (AWS, Azure, GCP)&lt;/td&gt;
&lt;td&gt;Owned by the organization, or a provider-managed dedicated instance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tenancy model&lt;/td&gt;
&lt;td&gt;Multi-tenant — hardware and hypervisor shared across many customers&lt;/td&gt;
&lt;td&gt;Single-tenant — hardware reserved exclusively for one organization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network access path&lt;/td&gt;
&lt;td&gt;Reached over the public internet, secured via account credentials and VPCs&lt;/td&gt;
&lt;td&gt;Reached over a private network, VPN, or dedicated leased line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provisioning and scaling&lt;/td&gt;
&lt;td&gt;Near-instant self-service scaling from a shared resource pool&lt;/td&gt;
&lt;td&gt;Scaling bounded by pre-purchased or pre-built capacity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost structure&lt;/td&gt;
&lt;td&gt;Pay-as-you-go operating expense with no upfront hardware cost&lt;/td&gt;
&lt;td&gt;Large upfront capital expense or fixed contract, amortized over time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security and compliance control&lt;/td&gt;
&lt;td&gt;Shared responsibility model; provider secures the underlying infrastructure&lt;/td&gt;
&lt;td&gt;Full control over physical and network security, easing strict compliance audits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Customization and control&lt;/td&gt;
&lt;td&gt;Limited to the services and configurations the provider exposes&lt;/td&gt;
&lt;td&gt;Full control over hardware, hypervisor, and network topology&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="key-differences"&gt;Key Differences&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Public cloud runs on &lt;strong class="kw"&gt;shared infrastructure&lt;/strong&gt; across many customers; private cloud reserves hardware for a &lt;strong class="kw"&gt;single tenant&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Public cloud follows a &lt;strong class="kw"&gt;shared responsibility&lt;/strong&gt; security model; private cloud gives the organization &lt;strong class="kw"&gt;full control&lt;/strong&gt; over the stack.&lt;/li&gt;
&lt;li&gt;Public cloud costs are &lt;strong class="kw"&gt;operating expense&lt;/strong&gt;, scaling with usage; private cloud typically requires &lt;strong class="kw"&gt;capital investment&lt;/strong&gt; upfront.&lt;/li&gt;
&lt;li&gt;Public cloud offers near-instant &lt;strong class="kw"&gt;elastic scaling&lt;/strong&gt;; private cloud scaling is bounded by &lt;strong class="kw"&gt;provisioned capacity&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Private cloud simplifies strict &lt;strong class="kw"&gt;regulatory compliance&lt;/strong&gt;; public cloud relies on provider-audited controls instead.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="when-to-use-each"&gt;When to Use Each&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Public Cloud&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Immutable vs Mutable Infrastructure: Replace vs Patch</title><link>https://comparison.metacog.co.kr/posts/2026-08-03-immutable-vs-mutable-infrastructure-replace-vs-patch/</link><pubDate>Mon, 03 Aug 2026 05:18:27 +0900</pubDate><guid>https://comparison.metacog.co.kr/posts/2026-08-03-immutable-vs-mutable-infrastructure-replace-vs-patch/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Immutable infrastructure treats servers as disposable artifacts — every change ships as a brand-new &lt;strong class="kw"&gt;image&lt;/strong&gt; that replaces the running instance rather than editing it. Mutable infrastructure instead &lt;strong class="kw"&gt;updates in place&lt;/strong&gt;, applying patches and config changes directly to long-lived servers. The choice determines how predictable, auditable, and drift-resistant your environments are.&lt;/p&gt;
&lt;h2 id="comparison-diagram"&gt;Comparison Diagram&lt;/h2&gt;
&lt;div class="compare-diagram"&gt;
&lt;svg viewBox="0 0 640 360" xmlns="http://www.w3.org/2000/svg"&gt;&lt;defs&gt;&lt;marker id="arrowA" markerWidth="8" markerHeight="8" refX="6" refY="4" orient="auto"&gt;&lt;path d="M0,0 L8,4 L0,8 z" style="fill:var(--compare-a)"/&gt;&lt;/marker&gt;&lt;marker id="arrowB" markerWidth="8" markerHeight="8" refX="6" refY="4" orient="auto"&gt;&lt;path d="M0,0 L8,4 L0,8 z" style="fill:var(--compare-b)"/&gt;&lt;/marker&gt;&lt;marker id="arrowN" markerWidth="8" markerHeight="8" refX="6" refY="4" orient="auto"&gt;&lt;path d="M0,0 L8,4 L0,8 z" style="fill:var(--secondary)"/&gt;&lt;/marker&gt;&lt;/defs&gt;&lt;line x1="320" y1="20" x2="320" y2="335" style="stroke:var(--border)" stroke-width="1" stroke-dasharray="4 4"/&gt;&lt;text x="160" y="30" text-anchor="middle" style="fill:var(--primary)" font-size="15" font-weight="bold"&gt;Immutable Infrastructure&lt;/text&gt;&lt;text x="480" y="30" text-anchor="middle" style="fill:var(--primary)" font-size="15" font-weight="bold"&gt;Mutable Infrastructure&lt;/text&gt;&lt;rect x="45" y="55" width="100" height="38" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="95" y="78" text-anchor="middle" style="fill:var(--content)" font-size="12"&gt;Image v1&lt;/text&gt;&lt;line x1="95" y1="93" x2="95" y2="118" style="stroke:var(--compare-a)" stroke-width="1.5" marker-end="url(#arrowA)"/&gt;&lt;rect x="45" y="120" width="100" height="50" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="95" y="149" text-anchor="middle" style="fill:var(--content)" font-size="12"&gt;Server v1&lt;/text&gt;&lt;line x1="95" y1="170" x2="95" y2="195" style="stroke:var(--secondary)" stroke-width="1.5" marker-end="url(#arrowN)"/&gt;&lt;rect x="45" y="197" width="100" height="34" rx="4" style="fill:none;stroke:var(--border)" stroke-width="1.5" stroke-dasharray="3 3"/&gt;&lt;text x="95" y="218" text-anchor="middle" style="fill:var(--secondary)" font-size="11"&gt;terminated&lt;/text&gt;&lt;rect x="175" y="55" width="100" height="38" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="225" y="78" text-anchor="middle" style="fill:var(--content)" font-size="12"&gt;Image v2&lt;/text&gt;&lt;line x1="225" y1="93" x2="225" y2="118" style="stroke:var(--compare-a)" stroke-width="1.5" marker-end="url(#arrowA)"/&gt;&lt;rect x="175" y="120" width="100" height="50" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="225" y="149" text-anchor="middle" style="fill:var(--content)" font-size="12"&gt;Server v2&lt;/text&gt;&lt;line x1="225" y1="170" x2="225" y2="195" style="stroke:var(--compare-a)" stroke-width="1.5" marker-end="url(#arrowA)"/&gt;&lt;rect x="175" y="197" width="100" height="34" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="225" y="218" text-anchor="middle" style="fill:var(--content)" font-size="11"&gt;live traffic&lt;/text&gt;&lt;text x="160" y="255" text-anchor="middle" style="fill:var(--secondary)" font-size="11"&gt;change = build new image,&lt;/text&gt;&lt;text x="160" y="270" text-anchor="middle" style="fill:var(--secondary)" font-size="11"&gt;deploy new instance, discard old&lt;/text&gt;&lt;rect x="410" y="130" width="140" height="80" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="480" y="160" text-anchor="middle" style="fill:var(--content)" font-size="12"&gt;Server&lt;/text&gt;&lt;text x="480" y="180" text-anchor="middle" style="fill:var(--content)" font-size="11"&gt;v1 &amp;#8594; v1.1 &amp;#8594; v1.2&lt;/text&gt;&lt;path d="M 460 130 A 40 30 0 1 1 500 130" style="fill:none;stroke:var(--compare-b)" stroke-width="1.5" marker-end="url(#arrowB)"/&gt;&lt;text x="480" y="95" text-anchor="middle" style="fill:var(--content)" font-size="11"&gt;patch in place&lt;/text&gt;&lt;text x="480" y="255" text-anchor="middle" style="fill:var(--secondary)" font-size="11"&gt;change = SSH in / run config&lt;/text&gt;&lt;text x="480" y="270" text-anchor="middle" style="fill:var(--secondary)" font-size="11"&gt;management, edit same instance&lt;/text&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;h2 id="comparison-table"&gt;Comparison Table&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Immutable Infrastructure&lt;/th&gt;
&lt;th&gt;Mutable Infrastructure&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Initial provisioning&lt;/td&gt;
&lt;td&gt;Instance built once from a versioned image or template&lt;/td&gt;
&lt;td&gt;Instance provisioned once, then edited repeatedly over its life&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Applying a change&lt;/td&gt;
&lt;td&gt;Rebuild the image with the change baked in&lt;/td&gt;
&lt;td&gt;SSH in, or run a config-management tool, against the live server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment mechanism&lt;/td&gt;
&lt;td&gt;Orchestrator replaces old instances with new ones (rolling/blue-green)&lt;/td&gt;
&lt;td&gt;Update scripts or agents (Ansible, Chef, Puppet) mutate the running instance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Configuration drift&lt;/td&gt;
&lt;td&gt;Cannot occur — every instance matches its source image exactly&lt;/td&gt;
&lt;td&gt;Accumulates over time as ad hoc changes diverge from documented state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rollback&lt;/td&gt;
&lt;td&gt;Redeploy the prior image version, deterministic and fast&lt;/td&gt;
&lt;td&gt;Manually reverse changes on the server, often incomplete or unreliable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Emergency hotfixes&lt;/td&gt;
&lt;td&gt;Requires rebuilding and redeploying an image, slower to react&lt;/td&gt;
&lt;td&gt;Can be patched directly on the box in seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auditability &amp;amp; reproducibility&lt;/td&gt;
&lt;td&gt;Image is a versioned artifact; environment is fully reproducible&lt;/td&gt;
&lt;td&gt;True state only knowable by inspecting the live server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pipeline &amp;amp; storage overhead&lt;/td&gt;
&lt;td&gt;Needs an image build pipeline and artifact/image registry&lt;/td&gt;
&lt;td&gt;Lower tooling overhead, no build pipeline required&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="key-differences"&gt;Key Differences&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Immutable instances are never touched after launch; mutable servers are &lt;strong class="kw"&gt;patched in place&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Immutable infrastructure eliminates &lt;strong class="kw"&gt;configuration drift&lt;/strong&gt; by construction.&lt;/li&gt;
&lt;li&gt;Rolling back immutable infra just means redeploying a prior &lt;strong class="kw"&gt;image version&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Mutable infra depends on ongoing &lt;strong class="kw"&gt;config management&lt;/strong&gt; tooling to keep state converged.&lt;/li&gt;
&lt;li&gt;Immutable workflows require an &lt;strong class="kw"&gt;image build pipeline&lt;/strong&gt; and registry that mutable setups skip.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="when-to-use-each"&gt;When to Use Each&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Immutable Infrastructure&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Horizontal Scaling vs Vertical Scaling: Growing Out vs Growing Up</title><link>https://comparison.metacog.co.kr/posts/2026-08-02-horizontal-scaling-vs-vertical-scaling-growing-out-vs-growin/</link><pubDate>Sun, 02 Aug 2026 23:47:18 +0900</pubDate><guid>https://comparison.metacog.co.kr/posts/2026-08-02-horizontal-scaling-vs-vertical-scaling-growing-out-vs-growin/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Horizontal and vertical scaling are the two fundamental strategies for adding capacity to a system: one adds &lt;strong class="kw"&gt;more nodes&lt;/strong&gt; working in parallel, the other adds &lt;strong class="kw"&gt;more resources&lt;/strong&gt; to a single existing node. The choice shapes cost, downtime, fault tolerance, and how much your application architecture has to change to support it.&lt;/p&gt;
&lt;h2 id="comparison-diagram"&gt;Comparison Diagram&lt;/h2&gt;
&lt;div class="compare-diagram"&gt;
&lt;svg viewBox="0 0 640 360" xmlns="http://www.w3.org/2000/svg"&gt;&lt;line x1="320" y1="20" x2="320" y2="340" style="stroke:var(--border)" stroke-width="1" stroke-dasharray="4,4"/&gt;&lt;text x="160" y="36" text-anchor="middle" style="fill:var(--primary)" font-size="18" font-weight="600"&gt;Horizontal Scaling&lt;/text&gt;&lt;text x="480" y="36" text-anchor="middle" style="fill:var(--primary)" font-size="18" font-weight="600"&gt;Vertical Scaling&lt;/text&gt;&lt;rect x="125" y="58" width="70" height="32" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="160" y="79" text-anchor="middle" style="fill:var(--content)" font-size="12"&gt;Load Balancer&lt;/text&gt;&lt;line x1="160" y1="90" x2="70" y2="148" style="stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;line x1="160" y1="90" x2="145" y2="148" style="stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;line x1="160" y1="90" x2="220" y2="148" style="stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;line x1="160" y1="90" x2="295" y2="148" style="stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;rect x="40" y="150" width="60" height="60" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="70" y="185" text-anchor="middle" style="fill:var(--content)" font-size="13"&gt;S1&lt;/text&gt;&lt;rect x="115" y="150" width="60" height="60" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="145" y="185" text-anchor="middle" style="fill:var(--content)" font-size="13"&gt;S2&lt;/text&gt;&lt;rect x="190" y="150" width="60" height="60" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="220" y="185" text-anchor="middle" style="fill:var(--content)" font-size="13"&gt;S3&lt;/text&gt;&lt;rect x="265" y="150" width="60" height="60" rx="4" style="fill:none;stroke:var(--compare-a)" stroke-width="1.5" stroke-dasharray="5,4"/&gt;&lt;text x="295" y="185" text-anchor="middle" style="fill:var(--compare-a)" font-size="18"&gt;+&lt;/text&gt;&lt;text x="160" y="245" text-anchor="middle" style="fill:var(--secondary)" font-size="12"&gt;scale out: add identical nodes&lt;/text&gt;&lt;text x="160" y="262" text-anchor="middle" style="fill:var(--secondary)" font-size="12"&gt;no downtime, redundant&lt;/text&gt;&lt;rect x="440" y="235" width="70" height="70" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="475" y="265" text-anchor="middle" style="fill:var(--content)" font-size="12"&gt;Server&lt;/text&gt;&lt;text x="475" y="282" text-anchor="middle" style="fill:var(--content)" font-size="11"&gt;2 CPU / 4GB&lt;/text&gt;&lt;line x1="475" y1="230" x2="475" y2="200" style="stroke:var(--compare-b)" stroke-width="2"/&gt;&lt;polygon points="475,190 469,202 481,202" style="fill:var(--compare-b)"/&gt;&lt;rect x="390" y="90" width="170" height="105" rx="4" style="fill:none;stroke:var(--compare-b)" stroke-width="1.5" stroke-dasharray="5,4"/&gt;&lt;text x="475" y="135" text-anchor="middle" style="fill:var(--content)" font-size="13"&gt;Same Server&lt;/text&gt;&lt;text x="475" y="155" text-anchor="middle" style="fill:var(--content)" font-size="11"&gt;16 CPU / 64GB&lt;/text&gt;&lt;text x="475" y="172" text-anchor="middle" style="fill:var(--secondary)" font-size="11"&gt;upgraded&lt;/text&gt;&lt;text x="475" y="325" text-anchor="middle" style="fill:var(--secondary)" font-size="12"&gt;scale up: add CPU/RAM/disk&lt;/text&gt;&lt;text x="475" y="342" text-anchor="middle" style="fill:var(--secondary)" font-size="12"&gt;often needs downtime&lt;/text&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;h2 id="comparison-table"&gt;Comparison Table&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Horizontal Scaling&lt;/th&gt;
&lt;th&gt;Vertical Scaling&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mechanism&lt;/td&gt;
&lt;td&gt;Add more machines/nodes to the pool&lt;/td&gt;
&lt;td&gt;Add more CPU, RAM, or disk to an existing machine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Implementation&lt;/td&gt;
&lt;td&gt;Requires a load balancer and clustering to distribute work&lt;/td&gt;
&lt;td&gt;Swap hardware or resize the VM/instance in place&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Downtime&lt;/td&gt;
&lt;td&gt;Typically none; new nodes join the pool live&lt;/td&gt;
&lt;td&gt;Usually requires a reboot or maintenance window&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Application requirements&lt;/td&gt;
&lt;td&gt;App must be stateless or handle distributed state&lt;/td&gt;
&lt;td&gt;App can remain unaware, since it still runs on one node&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost model&lt;/td&gt;
&lt;td&gt;Roughly linear cost per added commodity node&lt;/td&gt;
&lt;td&gt;Cost rises steeply at high-end hardware tiers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fault tolerance&lt;/td&gt;
&lt;td&gt;Redundant; a node failing doesn&amp;rsquo;t take the system down&lt;/td&gt;
&lt;td&gt;Single point of failure; that node failing is an outage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Capacity ceiling&lt;/td&gt;
&lt;td&gt;Practically unbounded, add nodes as needed&lt;/td&gt;
&lt;td&gt;Bounded by the largest machine/instance available&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical use case&lt;/td&gt;
&lt;td&gt;Web-scale services, microservices, cloud-native apps&lt;/td&gt;
&lt;td&gt;Databases, legacy monoliths, short-term quick fixes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="key-differences"&gt;Key Differences&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Horizontal scaling adds &lt;strong class="kw"&gt;more nodes&lt;/strong&gt; in parallel, while vertical scaling adds &lt;strong class="kw"&gt;more resources&lt;/strong&gt; to one existing node.&lt;/li&gt;
&lt;li&gt;Horizontal scaling needs a &lt;strong class="kw"&gt;load balancer&lt;/strong&gt; and app-level statelessness; vertical scaling needs no architectural change.&lt;/li&gt;
&lt;li&gt;Vertical scaling eventually hits a &lt;strong class="kw"&gt;hardware ceiling&lt;/strong&gt;; horizontal scaling can grow near-limitlessly.&lt;/li&gt;
&lt;li&gt;Vertical scaling usually requires &lt;strong class="kw"&gt;downtime&lt;/strong&gt; to resize, while horizontal scaling can add capacity live.&lt;/li&gt;
&lt;li&gt;Horizontal scaling improves &lt;strong class="kw"&gt;fault tolerance&lt;/strong&gt; through redundancy; vertical scaling keeps a single point of failure.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="when-to-use-each"&gt;When to Use Each&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Horizontal Scaling&lt;/strong&gt;&lt;/p&gt;</description></item></channel></rss>