<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[DoiT - Medium]]></title>
        <description><![CDATA[Forward-Deployed Engineers frequently share solutions to the challenges they encounter. Read more about what we do at doit.com/cloudops - Medium]]></description>
        <link>https://engineering.doit.com?source=rss----b5de5190d27c---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>DoiT - Medium</title>
            <link>https://engineering.doit.com?source=rss----b5de5190d27c---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Mon, 06 Apr 2026 12:32:15 GMT</lastBuildDate>
        <atom:link href="https://engineering.doit.com/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Stop Node Hunting: How Kubernetes DRA Simplifies GPU Scheduling for AI Workloads]]></title>
            <link>https://engineering.doit.com/stop-node-hunting-how-kubernetes-dra-simplifies-gpu-scheduling-for-ai-workloads-8f9e1a128864?source=rss----b5de5190d27c---4</link>
            <guid isPermaLink="false">https://medium.com/p/8f9e1a128864</guid>
            <category><![CDATA[google]]></category>
            <category><![CDATA[containers]]></category>
            <category><![CDATA[cloud-computing]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[kubernetes]]></category>
            <dc:creator><![CDATA[Chimbu Chinnadurai]]></dc:creator>
            <pubDate>Thu, 02 Apr 2026 09:01:03 GMT</pubDate>
            <atom:updated>2026-04-02T09:01:02.873Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*l1dfyumEKBlm4jvB374HBw.png" /><figcaption>Source: NotebookLM</figcaption></figure><p>AI is no longer a side project. Teams everywhere are running large language models (LLMs), training pipelines, and inference servers on Kubernetes. And when your workload needs a GPU, things get complicated fast.</p><p>GPUs and TPUs are expensive and hard to obtain, and for a long time Kubernetes used the <a href="https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/">Device Plugin framework </a>to manage them. This framework was originally developed during a period when Kubernetes workloads were relatively simple, primarily demanding only “a GPU,” which the system would then supply. However, modern AI workloads are significantly more complex. As soon as you introduce mixed GPU types, NVLink topologies, or specific VRAM requirements, Device Plugins fall apart, requiring extensive manual configuration.</p><p><a href="https://kubernetes.io/docs/concepts/scheduling-eviction/dynamic-resource-allocation/"><strong>Dynamic Resource Allocation (DRA)</strong></a> is Kubernetes’ answer to these shortcomings. Rather than the old model where nodes advertised fixed hardware counts and the scheduler blindly claimed them, DRA introduces a request-based allocation model. Workloads describe <em>what</em> they need, and DRA’s control plane figures out how to satisfy that claim across the cluster. This shift moves hardware awareness out of individual node agents and into a centralized, expressive API.</p><p>At KubeCon Europe 2026, NVIDIA donated its <a href="https://blogs.nvidia.com/blog/nvidia-at-kubecon-2026/">DRA GPU driver</a> to CNCF, and Google announced the open-source release of the <a href="https://cloud.google.com/blog/products/containers-kubernetes/gke-and-oss-innovation-at-kubecon-eu-2026">DRA TPU driver</a>. These weren’t just community goodwill gestures; they show that the two leading AI hardware vendors have fully adopted DRA as the standard interface for managing hardware in Kubernetes. For platform teams, this means you no longer need to depend on vendor-specific workarounds or proprietary scheduling logic. The same DRA primitives now operate reliably whether you’re using NVIDIA GPUs, Google TPUs, or both in the same cluster.</p><h3>The Old Way: Device Plugins and Their Pain Points</h3><p>Before DRA, if you wanted your pod to use a GPU, you’d add something like this to your pod spec:</p><pre>resources:<br> limits:<br> nvidia.com/gpu: 1</pre><p>This simple integer request created three massive pain points:</p><p><strong>1. Lack of Attribute-Based Selection and Native Fractional Support</strong></p><p>Device Plugins natively supported basic integer counting (e.g., “1 GPU”) and no fractional GPUs! While there are workarounds like <a href="https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/gpu-sharing.html">NVIDIA’s Time-Slicing</a> or <a href="https://www.nvidia.com/en-gb/technologies/multi-instance-gpu/">Multi-Instance GPU (MIG)</a> to split hardware resources, these remain external “hacks” that the Kubernetes scheduler doesn’t truly understand. It also lacked the ability to request resources based on specific attributes, like “I need one with at least 40 GB of VRAM” or “I need one from a specific architecture.” This often resulted in workloads being assigned to underpowered or incompatible hardware.</p><p><strong>2. Manual Orchestration Overhead</strong></p><p>Device Plugins don’t provide the Kubernetes scheduler with any useful information about hardware. Because the scheduler lacked granular hardware awareness, administrators were forced to manually map workloads to specific nodes using hard-coded labels. This approach is not scalable in large clusters, as it requires constant manual updates whenever hardware is added, removed, or decommissioned.</p><p><strong>3. Static Provisioning Constraints</strong></p><p>Device Plugins required hardware to be pre-configured and available before a task was initiated. There was no mechanism for dynamic, “just-in-time” resource allocation, nor for the system to search for and initialize hardware in response to a pending request.</p><h3>Enter Dynamic Resource Allocation (DRA): The New Standard for AI Hardware</h3><p>Dynamic Resource Allocation (DRA) is the new Kubernetes standard for managing specialized hardware. The primary objective of DRA is to decouple resource management from the core Kubernetes scheduler. Instead of having the user identify specific nodes or manually tag hardware, DRA allows the workload to define its requirements. The system then dynamically identifies, claims, and prepares the optimal hardware across the entire cluster.</p><p>DRA introduces three key concepts that make this work.</p><h4>1. DeviceClass — Abstractions for Platform Teams</h4><p><a href="https://kubernetes.io/docs/concepts/scheduling-eviction/dynamic-resource-allocation/#deviceclass">DeviceClass</a> is a blueprint defined by platform or cluster admins. Instead of making developers know hardware specifics, admins can create named classes like high-memory-gpu or low-latency-fpga. Developers just request a class by name, and the scheduler handles the rest.</p><h4>2. ResourceSlice — What’s Available</h4><p>Think of a <a href="https://kubernetes.io/docs/concepts/scheduling-eviction/dynamic-resource-allocation/#resourceslice">ResourceSlice</a> as a hardware inventory report that represents one or more <a href="https://kubernetes.io/docs/reference/glossary/?all=true#term-device">devices</a> in a pool. DRA drivers (like the NVIDIA GPU driver or Google&#39;s TPU driver) publish detailed information about the devices on each node. Not just &quot;this node has 4 GPUs,&quot; but rich details like:</p><ul><li>Total GPU memory (VRAM)</li><li>Architecture and hardware model</li><li>Which PCIe root complex or NUMA node the device sits on</li><li>Number of compute cores</li></ul><p>This is the key shift: Hardware details that used to be hidden are now fully visible to the scheduler.</p><h4>3. ResourceClaim — What You Need</h4><p>A <a href="https://kubernetes.io/docs/concepts/scheduling-eviction/dynamic-resource-allocation/#resourceclaims-templates">ResourceClaim</a> is how you describe your workload&#39;s requirements. This is where DRA gets powerful. Instead of asking for &quot;1 GPU,&quot; you can now say things like:</p><ul><li>“I need a GPU with at least 40 GB of VRAM”</li><li>“I need a GPU and a high-speed NIC that are on the same NUMA node”</li><li>“I need an accelerator that matches the high-memory-gpu class&quot;</li></ul><p>The scheduler reads this claim, looks at all the ResourceSlices published across the cluster, and finds the best match automatically.</p><h3>Real-World Example: Running vLLM with DRA</h3><p>Let’s say you’re running a large language model inference server using vLLM. You need a GPU with plenty of VRAM, and you want scheduling to be automatic and no manual node pinning. With DRA, your setup might look something like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7Aui9YTJ1rTNzAhCj33ddQ.png" /><figcaption>Source: Gemini + Nano Banana</figcaption></figure><p><strong>Step 1: The cluster admin creates a DeviceClass</strong></p><p>This class filters for any GPU with more than 40GB of memory using a Common Expression Language (CEL) filter.</p><pre>---<br>apiVersion: resource.k8s.io/v1<br>kind: DeviceClass<br>metadata:<br>  name: high-memory-gpu<br>spec:<br>  selectors:<br>    - cel:<br>        expression: device.capacity[&quot;memory&quot;].isGreaterThan(quantity(&quot;40Gi&quot;))</pre><p><strong>Step 2: You create a ResourceClaim for your pod spec</strong></p><p>The user requests one device from that specific class.</p><pre>apiVersion: resource.k8s.io/v1<br>kind: ResourceClaim<br>metadata:<br>  name: vllm-gpu-claim<br>spec:<br>  devices:<br>    requests:<br>    - name: gpu<br>      deviceClassName: high-memory-gpu<br>      count: 1</pre><p><strong>Step 3: Reference the claim in your pod</strong></p><p>Finally, the Pod simply points to the claim. No nodeSelector or complex affinity rules required.</p><pre>apiVersion: v1<br>kind: Pod<br>metadata:<br>  name: vllm-inference<br>spec:<br>  resourceClaims:<br>  - name: gpu-claim<br>    resourceClaimName: vllm-gpu-claim<br>  containers:<br>  - name: vllm<br>    image: vllm/vllm-openai:latest<br>    resources:<br>      claims:<br>      - name: gpu-claim</pre><p>That’s it. You described what you need. Kubernetes — now armed with full visibility into every node’s hardware via ResourceSlices — finds a suitable node and schedules your pod there. No nodeSelector. No hunting through kubectl get nodes.</p><h3>The Strategic Value of DRA</h3><p>DRA ensures you get the full performance by eliminating manual configuration errors and hardware bottlenecks.</p><ul><li><strong>For developers:</strong> Stop the manual “node hunting.” Define the hardware requirements your code needs, and let Kubernetes handle the discovery and attachment.</li><li><strong>For platform teams:</strong> You can create hardware “tiers” using DeviceClasses and expose them, without giving everyone raw access to <a href="https://medium.com/@chimbu/the-gpu-revolution-why-kubernetes-dra-is-the-new-standard-for-ai-clusters-8f9e1a128864">node</a> labels and hardware specs.</li><li><strong>For operations,</strong> Resource utilization improves. The scheduler has better information, which means better placement decisions, less fragmentation, fewer idle GPUs and better ROI on expensive hardware.</li><li><strong>For AI at scale:</strong> DRA has already become the foundation of the <a href="https://github.com/cncf/k8s-ai-conformance">Kubernetes AI Conformance program</a>. It is no longer an optional feature; it has become the industry standard.</li></ul><h3>Wrapping Up</h3><p>Kubernetes has evolved from simply hosting web servers and microservices to becoming the preferred platform for some of the most intensive AI workloads. However, this exciting progress has also brought new infrastructure challenges, particularly in managing specialized hardware such as GPUs, TPUs, and high-speed networking devices.</p><p>The Device Plugin framework served its purpose, but it was designed for a simpler time. DRA is built for our current environment: clusters with diverse, costly hardware, workloads with specific and complex needs, and teams that need to move quickly without becoming hardware topology experts.</p><p><strong>Optimize Your AI Infrastructure with DoiT</strong></p><p>If you are currently running AI workloads or planning to implement DRA, <strong>DoiT</strong> can accelerate your journey. Our team of over 100 cloud experts specializes in tailored solutions to optimize your infrastructure, ensure compliance, and maximize your hardware ROI.</p><p><a href="https://www.doit.com/contact/"><strong>Contact us today</strong></a> to transition your cluster to the new Kubernetes AI standard.</p><p>If you want to dig in further, here are the best places to start:</p><ul><li><a href="https://discuss.google.dev/t/running-inference-on-vllm-with-dynamic-resource-allocation-and-custom-compute-classes/342730">DRA in action with Custom ComputeClass</a></li><li><a href="https://docs.cloud.google.com/kubernetes-engine/docs/concepts/about-dynamic-resource-allocation">DRA on GKE Documentation</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8f9e1a128864" width="1" height="1" alt=""><hr><p><a href="https://engineering.doit.com/stop-node-hunting-how-kubernetes-dra-simplifies-gpu-scheduling-for-ai-workloads-8f9e1a128864">Stop Node Hunting: How Kubernetes DRA Simplifies GPU Scheduling for AI Workloads</a> was originally published in <a href="https://engineering.doit.com">DoiT</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[GKE Native Support for Custom Metrics: Smarter Autoscaling Beyond CPU and Memory]]></title>
            <link>https://engineering.doit.com/gke-native-support-for-custom-metrics-smarter-autoscaling-beyond-cpu-and-memory-0f7370486c84?source=rss----b5de5190d27c---4</link>
            <guid isPermaLink="false">https://medium.com/p/0f7370486c84</guid>
            <category><![CDATA[google-cloud-platform]]></category>
            <category><![CDATA[containers]]></category>
            <category><![CDATA[gcp]]></category>
            <category><![CDATA[autoscaling]]></category>
            <category><![CDATA[kubernetes]]></category>
            <dc:creator><![CDATA[Chimbu Chinnadurai]]></dc:creator>
            <pubDate>Thu, 19 Mar 2026 10:01:01 GMT</pubDate>
            <atom:updated>2026-03-19T10:01:01.278Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*q4UE_6raxBg9d3ZREp7CrQ.jpeg" /><figcaption>Source: Gemini Nano Banana Pro</figcaption></figure><p>Modern cloud-native applications rarely scale perfectly using CPU or memory metrics alone. Many workloads are driven by signals like request rate, queue depth, GPU usage, or application latency. Traditional autoscaling approaches struggle to capture these signals, which often leads to inefficient scaling decisions.</p><p>Google Kubernetes Engine (GKE) recently introduced <a href="https://docs.cloud.google.com/kubernetes-engine/docs/how-to/expose-custom-metrics-autoscaling"><strong>native support for custom metrics</strong></a>, simplifying how applications expose metrics and enabling more intelligent autoscaling decisions without complex adapters or additional infrastructure.</p><p>In this article, we will explore:</p><ul><li>The challenges with traditional autoscaling approaches</li><li>How GKE’s native custom metrics support addresses those challenges</li><li>How the new feature works internally</li><li>A practical example demonstrating custom-metric–based autoscaling</li></ul><blockquote>⚠️ <strong>Note:</strong> This feature is currently in <strong>Preview</strong>, available on GKE <strong>1.35.1-gke.1396000 or later</strong> in the <strong>Rapid channel</strong> only. Check the <a href="https://docs.cloud.google.com/kubernetes-engine/docs/how-to/expose-custom-metrics-autoscaling">official docs</a> for the latest GA status before adopting in production.</blockquote><h3>The Problem with Traditional Autoscaling</h3><p>Autoscaling in Kubernetes typically relies on the <a href="https://kubernetes.io/docs/concepts/workloads/autoscaling/horizontal-pod-autoscale/"><strong>Horizontal Pod Autoscaler (HPA)</strong></a>. By default, HPA scales workloads based on resource utilization, such as CPU or memory. While this works well for many workloads, it doesn’t always reflect the real demand placed on an application.</p><p>For example:</p><ul><li>A web API may experience heavy request traffic without high CPU utilization.</li><li>A queue-processing service may need more workers when the backlog grows.</li><li>AI inference workloads may depend more on GPU usage than on CPU.</li><li>Streaming services may need scaling based on requests per second.</li></ul><p>These scenarios require scaling based on <strong>application-level metrics</strong>, not infrastructure metrics.</p><p>Kubernetes supports autoscaling based on custom metrics, but historically implementing this required additional components such as:</p><ul><li><strong>Prometheus adapters</strong> — a separate deployment that bridges Prometheus metrics to the Kubernetes metrics API</li><li><strong>Custom metric pipelines</strong> — ingestion, storage, and query layers that sit between your app and the HPA</li><li><strong>Complex IAM and service account configuration</strong> — especially in managed environments like GKE</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*iGMt6GAqCmddwomu4_VvZQ.jpeg" /><figcaption>Source: Gemini Nano Banana Pro</figcaption></figure><p>The operational burden of these components was high, as teams managed adapter compatibility across Kubernetes versions, debugged multi-hop metric pipelines, and handled latency from infrastructure layers. This friction slowed adoption, leading many teams to revert to CPU-based scaling.</p><h3>Native Custom Metrics Support in GKE</h3><p>GKE now provides native integration for exposing custom metrics, simplifying how applications share metrics with the autoscaling system. Instead of routing metrics through external adapters and monitoring systems, custom metrics are now collected directly from pods and fed into the HPA.</p><p>This enables the autoscaling system to react to actual application behavior, such as request throughput or resource utilization. This significantly simplifies the process of integrating application metrics into scaling strategies.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qFsl5IIKxgQlt2d1epF2YQ.jpeg" /><figcaption>Source: Gemini Nano Banana Pro</figcaption></figure><h3>How the Solution Works</h3><p>The new capability works through a resource called <a href="https://docs.cloud.google.com/kubernetes-engine/docs/how-to/expose-custom-metrics-autoscaling#expose-metrics"><strong>AutoscalingMetric</strong></a>.</p><p>This resource defines:</p><ul><li>Which pods expose the metrics (via label selectors)</li><li>Where the metrics endpoint exists (port and path)</li><li>Which specific metric should be collected</li><li>How the metric should be exported to the autoscaling system</li></ul><p>Once defined, GKE collects these metrics and makes them available to components such as the load balancer or autoscaler.</p><p>Key requirements include:</p><ul><li>Metrics must be available via an <strong>HTTP endpoint</strong></li><li>The format should follow <strong>Prometheus standards</strong></li><li>Only gauge metrics are supported.</li><li>Maximum of 20 unique metrics can be exposed per cluster.</li></ul><blockquote><strong>Gauge vs. other metric types:</strong> A gauge represents a value that can go up or down at any point in time (e.g., current queue length = 45). Counters only go up (e.g., total requests processed = 10,432) and are not suitable for direct autoscaling targets. If your application currently exposes counters, you will need to derive a gauge (e.g., derived request rate) before using it with this feature.</blockquote><p>Once the metric is registered, GKE continuously reads it and feeds the value into scaling logic.</p><h3>Example: Autoscaling Based on Queue Length</h3><p>Let’s walk through a complete, self-contained example.</p><p><strong>Scenario:</strong> A background worker service processes jobs from a queue. We want to scale the number of worker pods based on the current queue length — not CPU usage.</p><h4>Step 1: Expose the Metric from the Application</h4><p>Deploy your application that exposes a Prometheus-format gauge metric at its /metrics endpoint:</p><pre># HELP job_queue_length Current number of jobs waiting in the queue<br># TYPE job_queue_length gauge<br>job_queue_length 45</pre><p>Let’s assume the metrics are available at http://worker-service:9090/metrics</p><h4>Step 2: Create an AutoscalingMetric Resource</h4><p>Define an AutoscalingMetric resource that tells GKE where to find and how to export the metric:</p><pre>apiVersion: autoscaling.gke.io/v1beta1<br>kind: AutoscalingMetric<br>metadata:<br>  name: worker-queue-metric<br>  namespace: default<br>spec:<br>  selector:<br>    matchLabels:<br>      app: job-worker #The label name and value matching the Pods<br>  endpoints:<br>  - port: 9090 #The metrics port number<br>    path: /metrics #The path to the metric<br>    metrics:<br>    - gauge:<br>      name: job_queue_length #The name of the metric that you are exposing.<br>      prometheusMetricName: job_queue_length #optional: The Prometheus metric name as exposed by the Pod.</pre><p>Once applied, the metric becomes available to the autoscaling system.</p><h3>Step 3: Configure the Horizontal Pod Autoscaler</h3><p>Now we create an HPA that uses the custom metric.</p><pre>apiVersion: autoscaling/v2<br>kind: HorizontalPodAutoscaler<br>metadata:<br>  name: worker-hpa<br>spec:<br>  scaleTargetRef:<br>    apiVersion: apps/v1<br>    kind: Deployment<br>    name: job-worker<br>  minReplicas: 2<br>  maxReplicas: 10<br>  metrics:<br>  - type: Pods<br>    pods:<br>      metric:<br>        name: autoscaling.gke.io|worker-queue-metric|queue_utilization<br>      target:<br>        type: AverageValue<br>        averageValue: 20</pre><p>This configuration means:</p><ul><li>If the average queue size exceeds 20 jobs per pod, the system scales up.</li><li>If the queue shrinks, the system scales down.</li></ul><h3>Benefits of Native Custom Metrics</h3><p>This feature provides several key advantages.</p><ul><li><strong>Application-Aware Scaling: </strong>Scaling decisions reflect real demand, not infrastructure proxies.</li><li><strong>Reduced Operational Complexity: </strong>No need for external adapters or complicated metric pipelines.</li><li><strong>Improved Performance: </strong>Applications scale more accurately and respond faster to workload spikes.</li><li><strong>Better Resource Utilization: </strong>Infrastructure costs decrease because scaling aligns with actual demand.</li><li><strong>Flexible Autoscaling Strategies:</strong> Teams can design policies around any gauge metric their application exposes, such as queue depth, active sessions, pending renders, and more.</li></ul><h3>Conclusion</h3><p>GKE’s native custom metrics support removes a major obstacle that has traditionally made application-aware autoscaling difficult to implement. By removing the need for external adapters and Prometheus pipelines, teams can now connect scaling directly to the metrics that matter—queue depth, request rate, GPU saturation, or any gauge metric their application exposes.</p><p>If your workloads frequently encounter CPU or memory scaling blind spots, this feature is worth considering. If you’re already exploring a proof of concept or want to learn more about this feature, <a href="https://www.doit.com/">DoiT</a> can help. Our team of 100+ experts specializes in tailored cloud solutions and is ready to guide you through the process and optimize your infrastructure to ensure compliance and meet future demands. <a href="https://www.doit.com/expertise/">Contact us today.</a></p><p><strong>Useful Links:</strong></p><ul><li><a href="https://cloud.google.com/blog/products/containers-kubernetes/gke-now-supports-custom-metrics-natively">https://cloud.google.com/blog/products/containers-kubernetes/gke-now-supports-custom-metrics-natively</a></li><li><a href="https://docs.cloud.google.com/kubernetes-engine/docs/how-to/expose-custom-metrics-autoscaling">https://docs.cloud.google.com/kubernetes-engine/docs/how-to/expose-custom-metrics-autoscaling</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0f7370486c84" width="1" height="1" alt=""><hr><p><a href="https://engineering.doit.com/gke-native-support-for-custom-metrics-smarter-autoscaling-beyond-cpu-and-memory-0f7370486c84">GKE Native Support for Custom Metrics: Smarter Autoscaling Beyond CPU and Memory</a> was originally published in <a href="https://engineering.doit.com">DoiT</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Upgrading Your Database to an Iceberg Data Lake (Part 1)]]></title>
            <link>https://engineering.doit.com/upgrading-your-database-to-an-iceberg-data-lake-part-1-b65ed783a65b?source=rss----b5de5190d27c---4</link>
            <guid isPermaLink="false">https://medium.com/p/b65ed783a65b</guid>
            <category><![CDATA[apache-iceberg]]></category>
            <category><![CDATA[big-data]]></category>
            <category><![CDATA[postgresql]]></category>
            <dc:creator><![CDATA[Sayle Matthews]]></dc:creator>
            <pubDate>Mon, 02 Feb 2026 10:01:02 GMT</pubDate>
            <atom:updated>2026-02-02T10:01:02.715Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8J9ASRTLsuTLryJN-vUP3A.png" /></figure><h3>The Series</h3><p>This is a series of articles about replicating data from your traditional database (SQL or NoSQL) into a platform-agnostic data lake (or data lakehouse, depending on who you ask) for your more analytics-based workloads. Throughout it, I will be showing the theoretical architecture, building up the framework for it, and lastly giving a real-world example of implementing this from a Postgres database.</p><p>The idea for this series of articles came about while helping a couple of customers in succession get data from their Postgres databases into Iceberg tables to be queried by their BI tooling. After doing multiple sessions covering the same topic, I decided this needs to be written down as I couldn’t find a good step-by-step on it.</p><p>As a bonus, I am going to be using strictly open-source software here and off-the-shelf services from the cloud vendors, so it will be as cloud platform agnostic as possible.</p><p>Now let’s get this show on the road and dive in!</p><h3>The Scenario</h3><p>You are starting to reach critical mass where your transactional data is living in one or more traditional databases, and your data team is starting to have issues doing their jobs with the data being in multiple places and not transformed for their needs. In addition, they are looking at using a data warehouse for their analytical workloads that won’t work with the existing databases.</p><p>Your data team is also showing you that growth is going to be picking up, further exacerbating this issue, so the time is now to start transforming your data and storing it in a data warehouse.</p><p>So you are seeing the big names out there like Google BigQuery, Snowflake, Databricks, DuckDB, ClickHouse, and Redshift, but you are completely overloaded by choices and want to make the decision that will allow you to be platform agnostic for this.</p><p>If this sounds familiar, then have I got some news for you: carry on reading!</p><p>If you aren’t in this boat, but want to learn more about creating a platform-agnostic data warehouse (or data lake, technically), then carry on reading as well.</p><h3>The (Abstract) Architecture</h3><p>In this series, I will be showing a reference architecture and a sample implementation of getting data from a traditional RDBMS database into a data lake on a cloud provider’s BLOB storage in Apache Iceberg format, which a data warehouse system can then utilize for day-to-day operations.</p><p>The reference architecture is very simple and looks something like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/597/1*DMcG5iVVS7lKpvW5diiOnw.png" /></figure><p>As can be (and typically is) predicted, there is going to be a lot more to it than this, but this very simple diagram shows the power of this process and also shows the platform agnosticism that can be achieved by this.</p><p>This is also going to be the super simple version of this, replicating raw data to an Iceberg table without transforms. This is by design for the simplicity of this article. I will put notes on how and where to implement further enhancements to add the T in ETL in later parts of this series, but for this article’s sake, let’s <a href="https://en.wikipedia.org/wiki/KISS_principle">Keep It Simple, Stupid</a>.</p><h3>The Pieces of This Puzzle</h3><p>I am going to go over each piece of what the example system I am showing here is to define the pieces, and also show the definition I will be using of some of the modern buzzwords that float around.</p><p><strong><em>Traditional</em></strong></p><p>This will be your database system that your applications use. It will generally be for things such as transactions (think purchases, clicks on a page, audit entries, etc.) or for storing application data.</p><p>If you are coming from the traditional relational database world, this will probably fall under a class of database called Online Transaction Processing (OLTP), which, at its core, is a fancy way of saying it handles transactions very well. Some examples of these are MySQL, Microsoft SQL Server, PostgreSQL, MariaDB, Oracle Database, and IBM DB2. There are countless others out there, but these are the main ones that are still around today.</p><p>If you are coming from the non-relational, or NoSQL, world, then there can be a few different options. As long as it is supported by Debezium, then it will work. As of the time of this writing, that list is MongoDB, Cassandra, Google Spanner, and anything that has a compatibility layer for utilizing them as a data source.</p><p><strong><em>Data Warehouse</em></strong></p><p>This will be the product that performs the querying and analytics processing for you. This will probably fall under a class of database called OLAP or Online Analytics Processing (OLAP), which, at its core, is a fancy way of saying it handles analytics workloads and processes very well. Examples of these are Google BigQuery, Snowflake, Databricks, DuckDb, ClickHouse, Amazon Redshift, and Microsoft Azure Synapse.</p><p>Note: In the context of this article, I am only using the data warehouse for the compute side of things, not for storage. Hence why I didn’t go into detail on that.</p><p><strong><em>Data Lake</em></strong></p><p>This is the location where you store all of your raw data for consumption and where you write your results for transformations that will be read for your analytics processes.</p><p>Many times this is a hodge-podge of file formats, but I <strong>HIGHLY</strong> recommend standardizing on a single format such as Apache Iceberg. This is one of the main reasons that Iceberg and its brethren were created to help standardize data lake storage formats.</p><p>A data lake often lives on a class of storage devices called BLOB (stands for <em>B</em>inary <em>L</em>arge <em>OB</em>ject) storage. In simpler terms, this is an almost infinite-sized hard drive that lives in a cloud environment (or on some on-premise data center systems).</p><p>Some of the most common examples of this are AWS Simple Storage Service (S3), Google Cloud Storage, Azure Blob Storage, Oracle Object Storage, or Digital Ocean Spaces Object Store.</p><p><strong><em>Apache Iceberg</em></strong></p><p>Apache Iceberg is a data storage format that works very well for storing slow-changing data (read as data warehouse-style data) on BLOB storage devices, allowing analytical databases to query and interact with it seamlessly as if it were natively stored in that database’s storage format. It acts as a common format for data lakes to achieve data platform agnosticism, or at least as close to it as you can get right now.</p><p>Note that it should be mentioned that Iceberg is great for analytical queries, but I would HIGHLY advise against using it for transactional workloads. Fivetran has this <a href="https://www.fivetran.com/learn/columnar-database-vs-row-database">article</a>, which covers the basics of row versus columnar databases, which directly correlates to the why of this.</p><p>It’s a lot more complicated than that, but this is the simplest explanation for it. If you wish to know the full feature list and more, I recommend reading the official docs <a href="https://iceberg.apache.org/">here</a>.</p><h3>The Why?</h3><p>In this day and age, there are MANY choices on the data warehousing front, just to list a few: BigQuery, ClickHouse, Snowflake, Databricks, DuckDB, Redshift, Firebolt, and Synapse Analytics.</p><p>Each of these data warehouses, by default, use their own proprietary format for storing the data, so that means you are locked into them, and some are locked into the cloud they are exclusive to. This also means that this data is siloed and unable to be read by other competing data warehouses or other tools that aren’t tied to that platform.</p><p>This means it is to your benefit to store data in a common format that can be read by multiple platforms or tools.</p><p>This scenario is also a true story based upon reality, a few years ago. If tomorrow vendor X raises their price by 2x+ and gives you 90 days till these costs are fully realized, then one of the largest migration steps has been done for you: storage. You would only need to worry about the compute aspect of your data warehouse instead of the entire ecosystem.</p><p>The other unspoken benefit to using a common format is reduced data team costs. It’s something that isn’t brought up enough, but if your data teams have a single data format to work with in a single environment, then that greatly reduces complexity and their time to implementation. It all comes back to cost, so in short, the faster the team can implement, the lower the overall team cost.</p><h3>The How?</h3><p>I will be showing an example of how to implement this in Part 2, but here is a rough overview of how this looks.</p><p>Instead of storing data in the native format of your data warehouse, you will instead store data in a common format (in this case, Apache Iceberg) in a common storage bucket that is broken up into a logical partitioning scheme. So you will have a single source of truth in a single location.</p><p>As the single source of truth, it is directly queried by data warehouse tools, and changes are reflected in new tables in this same format. It’s a cycle that keeps things simple and prevents a lot of complexities that stem from proprietary solutions.</p><p>Since there is a single location and single format for this source of truth, a lot of the complexities are simply abstracted away to the infrastructure, allowing you to focus on the data instead of the platform.</p><h3>Coming Up in Part 2</h3><p>In Part 2 of this series, I will be diving into how to implement the replication of data from a traditional database into an Iceberg table as the basis of a data warehouse.</p><h3>How We DoiT</h3><p>Here at <a href="http://www.doit.com">DoiT International</a>, we tackle problems like this all of the time, and I am always asked about ways to help save money while implementing data projects.</p><p>Helping out on implementing projects in the most effective and in the most cost effective way is part of our mission for our customers. Handling everything from cases like these to providing the best FinOps solutions for our customers is what we do, and I may be a little biased in saying this, but we do it VERY well.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b65ed783a65b" width="1" height="1" alt=""><hr><p><a href="https://engineering.doit.com/upgrading-your-database-to-an-iceberg-data-lake-part-1-b65ed783a65b">Upgrading Your Database to an Iceberg Data Lake (Part 1)</a> was originally published in <a href="https://engineering.doit.com">DoiT</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[When to Use AlloyDB Instead of Cloud SQL for PostgreSQL]]></title>
            <link>https://engineering.doit.com/when-to-use-alloydb-instead-of-cloud-sql-for-postgresql-601caa1110b8?source=rss----b5de5190d27c---4</link>
            <guid isPermaLink="false">https://medium.com/p/601caa1110b8</guid>
            <category><![CDATA[cloud-sql-enterprise-plus]]></category>
            <category><![CDATA[cloud-sql]]></category>
            <category><![CDATA[postgresql]]></category>
            <category><![CDATA[alloydb]]></category>
            <category><![CDATA[alloydb-ai]]></category>
            <dc:creator><![CDATA[Aamir Haroon]]></dc:creator>
            <pubDate>Fri, 30 Jan 2026 10:01:04 GMT</pubDate>
            <atom:updated>2026-01-30T10:01:03.671Z</atom:updated>
            <content:encoded><![CDATA[<p>A data-backed comparison featuring performance benchmarks, pricing breakpoints, and architectural trade-offs.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5JtdQBTp0JWTtcXvWdFTNw.png" /><figcaption>Generated by Gemini</figcaption></figure><p>Google Cloud now offers multiple managed PostgreSQL options, each tailored for specific performance, availability, cost, and <strong>AI-readiness</strong> requirements. What used to be a simple binary choice between standard Cloud SQL and AlloyDB has evolved with the introduction of <strong>Cloud SQL Enterprise</strong> and <strong>Cloud SQL Enterprise Plus</strong> editions.</p><p>While this expanded portfolio offers better solutions for specific needs, it also adds complexity to the decision-making process. By the end of this article, you’ll understand exactly which PostgreSQL service fits your performance, cost, and AI strategy.</p><h3>🤔 What is AlloyDB?</h3><p>AlloyDB for PostgreSQL is Google Cloud’s next-generation, PostgreSQL-compatible database service, purpose-built for <strong>high-performance, mission-critical workloads</strong>. Featuring a cloud-native architecture, it separates compute and storage, enabling each to scale independently. AlloyDB further stands out with <strong>AlloyDB AI</strong> for advanced vector search and a native <strong>columnar engine </strong>that accelerates analytical queries directly on transactional data.</p><h4><strong>Essential Extensions &amp; Compatibility</strong></h4><p>A frequent question from architects is whether AlloyDB is compatible with the standard PostgreSQL ecosystem. AlloyDB offers full PostgreSQL compatibility, supporting major open-source extensions and introducing powerful native features:</p><ul><li><strong>Standard Extensions:</strong> Fully supports PostGIS (geospatial), pg_cron (job scheduling), pgaudit (compliance logging), and pg_stat_statements (monitoring).</li><li><strong>AlloyDB-Specific Extensions:<br>* </strong>google_columnar_engine: Automatically accelerates analytical queries (HTAP — Hybrid Transactional and Analytical Processing). <br>* vector: An optimized version of pgvector for faster AI similarity search. <br>* alloydb_ai: Native integration with Vertex AI for calling ML models directly from SQL.</li></ul><p>Compared to traditional PostgreSQL deployments, AlloyDB delivers significantly higher throughput, lower latency, and faster analytical performance, while remaining fully managed and PostgreSQL compatible.</p><h3>🧐 Cloud SQL Editions Explained</h3><p>Before comparing all options, it’s important to understand the Cloud SQL editions:</p><ul><li><strong>Cloud SQL Enterprise</strong>: The foundational managed PostgreSQL tier designed for general-purpose and business-critical workloads. Supports up to 96 vCPUs and 624 GB RAM with 99.95% availability SLA.</li><li><strong>Cloud SQL Enterprise Plus</strong>: Built for higher-scale and higher-availability needs, with performance-optimized machine types supporting up to 128 vCPUs and 864 GB RAM. Key enhancements include:<br>- <strong>Near-zero downtime maintenance:</strong> &lt;1 second connectivity loss during maintenance.<br>- <strong>Data Cache:</strong> Delivers up to 4x improved read performance<br>- <strong>Enhanced Performance:</strong> Up to 2x write latency improvement.<br>- <strong>Superior Availability:</strong> 99.99% SLA (inclusive of maintenance) with eligibility for up to 100% financial credit.</li></ul><p>Both editions feature a traditional PostgreSQL architecture, making them the ideal choice for <strong>“lift-and-shift” migrations</strong> where you need managed PostgreSQL without refactoring your application.</p><h3>📊 Cloud SQL Enterprise vs Enterprise Plus vs AlloyDB</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FaDCyyWwQEhKiX9lqOeVbw.png" /><figcaption>Table: Cloud SQL Enterprise vs Enterprise Plus vs AlloyDB (<a href="https://gist.github.com/aamir814/e971ff899add7a88aa996cacf4a2e33e">View raw data</a>)</figcaption></figure><h3>🏋️‍♂️ Performance Benchmarks</h3><p>To provide concrete performance insights, I conducted comprehensive benchmarks<a href="#b930">²</a> across all three PostgreSQL offerings using identical <strong>4-vCPU, 32GB RAM</strong> configurations.</p><p>The testing methodology utilized a dual approach:</p><ul><li><strong>Standardized Baselines:</strong> Using pgbench to measure raw transactional throughput (TPS) and latency.</li><li><strong>Real-World Simulation:</strong> A custom e-commerce workload involving 100,000 transactions, 10,000 users, and 1,000 products to model complex application patterns.</li></ul><h4>OLTP (Transactional) Performance</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rns_hBUTedesYTlw__6oEg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*u3WOfjGtTu5PfJr0Hk3M4w.png" /><figcaption>Table: OLTP (Transactional) Performance (<a href="https://gist.github.com/aamir814/9fe872ca706dd0704d40c6f7c2297d08">View raw data</a>)</figcaption></figure><h4><strong>Key findings:</strong></h4><ul><li><strong>Cloud SQL Enterprise Plus</strong> delivers the highest overall transactional throughput (48% faster than Enterprise)</li><li><strong>AlloyDB</strong> excels at SELECT operations with 2.7x better performance than Enterprise Plus</li><li>Performance gaps are significant enough to impact application scalability</li></ul><p><strong>Note:</strong> AlloyDB’s disaggregated architecture incurs a slight network overhead for transaction management. In smaller instances (4 vCPU), the raw CPU power of the monolithic Cloud SQL Enterprise Plus edges it out. However, AlloyDB’s superior scalability typically reverses this trend on larger instances (16+ vCPUs).</p><h4>OLAP (Analytical) Performance</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5vUDgiJDb64KBKHXMElToA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_M31xPT1UsX9REpGpBRUjQ.png" /><figcaption>Table: OLAP (Analytical) Performance (<a href="https://gist.github.com/aamir814/f9831d9c1bed2550e94988eba83a3e20">View raw data</a>)</figcaption></figure><h4><strong>Key findings:</strong></h4><ul><li><strong>Cloud SQL Enterprise Plus</strong> shows 42% faster complex aggregations than Enterprise</li><li>AlloyDB’s columnar engine provides the fastest simple analytical queries</li><li>Enterprise Plus delivers the most consistent analytical performance across query types</li></ul><h4>Mixed Workload (HTAP) Performance</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Otexg-7jr9WsMAVwh92bPQ.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fWG4wVRNjPUfcP2b9qU7sQ.png" /><figcaption>Table: Mixed Workload (HTAP) Performance (<a href="https://gist.github.com/aamir814/99fb88494b1a7d860e57def7332d806c">View raw data</a>)</figcaption></figure><h4><strong>Key findings:</strong></h4><ul><li><strong>AlloyDB</strong> handles mixed workloads best with 48% higher OLTP performance than Enterprise</li><li><strong>Enterprise Plus</strong> excels at concurrent analytical queries</li><li>Both advanced options significantly outperform Enterprise in mixed scenarios</li></ul><h3>📋 Quick Decision Guide</h3><p>Based on the performance benchmarks above, here’s a quick reference for choosing the right PostgreSQL service:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-bvKJegbPb96fuO8n2TAvQ.png" /><figcaption>Table: Quick Decision Guide (<a href="https://gist.github.com/aamir814/343b83103a9e506686abd4fde8b18255">View raw data</a>)</figcaption></figure><h3>❓ When to Use AlloyDB</h3><p>AlloyDB is not a replacement for all PostgreSQL workloads. It is best suited for scenarios where performance, availability, and scale are primary concerns. For deeper insights into each scenario, here are the detailed use cases:</p><h4><strong>1. High-Performance Transactional Workloads</strong></h4><p>AlloyDB excels at workloads that demand consistently high throughput and low latency. My benchmarks show AlloyDB delivering 867 TPS with exceptional SELECT performance (2,148 ops/sec), making it ideal for:</p><ul><li>Large-scale <strong>e-commerce platforms</strong> with heavy read traffic</li><li><strong>Financial services</strong> and payment processing systems requiring fast data retrieval</li><li><strong>Gaming platforms</strong> with real-time state and leaderboard updates</li></ul><p><strong>Performance insight:</strong> While Cloud SQL Enterprise Plus achieved higher overall TPS (943), AlloyDB’s 3.6x faster SELECT operations make it superior for read-heavy transactional workloads.</p><h4><strong>2. Hybrid Transactional and Analytical Processing (HTAP)</strong></h4><p>AlloyDB enables transactional and analytical queries to run on the same data without offloading to a separate analytics system. My benchmarks show AlloyDB handling mixed workloads with 839 concurrent OLTP ops/sec, making it ideal for:</p><ul><li><strong>Real-time fraud detection </strong>requiring immediate analysis of transaction patterns</li><li>Operational dashboards on live production data</li><li>Embedded analytics in SaaS platforms</li></ul><p><strong>Performance insight:</strong> AlloyDB demonstrated the best mixed workload performance, handling 48% more concurrent OLTP operations than Cloud SQL Enterprise while maintaining strong analytical query performance.</p><p><strong>Important design consideration:</strong> When using AlloyDB for analytical workloads, teams need to think differently than with traditional row-based RDBMS systems. The columnar engine is optimized for scanning specific columns rather than full rows. As a result:</p><ul><li>Analytical queries typically <strong>do not rely on indexes</strong> in the traditional sense</li><li>Queries perform best when they <strong>select specific columns</strong> rather than SELECT *.</li><li>Schemas and queries should be designed with <strong>column-level access patterns</strong> in mind</li></ul><p>Embracing this mindset is crucial for unlocking the full potential of AlloyDB’s analytical capabilities.</p><h4><strong>3. Mission-Critical Applications with High Availability</strong></h4><p>AlloyDB provides a <strong>99.99% SLA, including maintenance</strong>, fast failover, and minimal operational overhead. Cloud SQL Enterprise Plus also offers 99.99% SLA with sub-second maintenance downtime. Both are well-suited for:</p><ul><li>Healthcare systems requiring continuous availability</li><li>Trading and financial platforms</li><li>Global ERP and core business systems</li></ul><p><strong>Performance insight:</strong> Enterprise Plus delivers &lt;1 second maintenance downtime compared to ~30 seconds for Enterprise, while AlloyDB offers near-zero downtime for all operations.</p><h4>4. AI/ML and Data-Intensive Workloads</h4><p>AlloyDB integrates well with Google Cloud’s AI and data ecosystem and supports high-performance access patterns for:</p><ul><li>Personalization and recommendation engines</li><li>IoT and telemetry ingestion</li><li>AI-driven applications that require fast access to fresh operational data</li></ul><h4>5. Vector Search and AI Applications</h4><p>AlloyDB provides optimized vector search capabilities that significantly outperform standard PostgreSQL implementations. With pgvector optimizations including IVFFlat and HNSW algorithms, AlloyDB delivers up to 10x faster vector queries compared to standard pgvector implementations. This makes it ideal for:</p><ul><li><strong>Semantic search applications</strong> requiring fast similarity matching</li><li><strong>Recommendation systems</strong> using embedding-based filtering</li><li><strong>RAG (Retrieval-Augmented Generation)</strong> applications needing rapid vector lookups</li><li><strong>AI-powered chatbots</strong> with large knowledge bases</li></ul><p><strong>Performance advantage:</strong> AlloyDB’s model endpoint integration allows direct embedding generation within the database, eliminating the need for external API calls and reducing latency for AI workloads.</p><h4>6. Cost Efficiency at Scale</h4><p>At scale, AlloyDB can be cost-effective, especially for high-availability and read-heavy workloads. In Cloud SQL Enterprise and Enterprise Plus, HA configurations and read replicas each require separate storage, increasing total storage costs (Primary + Standby + Replica). AlloyDB, by contrast, charges for storage only once, as HA nodes and read pools share the same underlying storage layer.</p><p><strong>Cost comparison for identical 4-vCPU configurations with HA + 1 read replica (3 total instances) at 1.75 TiB storage:</strong></p><ul><li>Cloud SQL Enterprise: $2,066/month</li><li>Cloud SQL Enterprise Plus: $2,141/month</li><li>AlloyDB: $2,064/month</li></ul><p><strong>The storage advantage:</strong> When you need high availability plus read replicas (3 total instances), AlloyDB becomes increasingly cost-effective as your storage grows beyond 1.75 TiB<a href="#cd06">¹</a>. This is because <strong>Cloud SQL stores three full copies of the data</strong> (primary + HA + replica), while <strong>AlloyDB stores one</strong> shared copy across all nodes.</p><p><strong>Bottom line:</strong> AlloyDB’s superior performance comes at a cost premium for smaller deployments, but achieves cost parity with Enterprise as storage scales beyond 1.75 TiB, making it increasingly attractive for data-intensive applications.</p><h3>🧾 Conclusion</h3><p>Google Cloud now offers <strong>three strong managed PostgreSQL paths</strong>, each serving a distinct purpose:</p><ul><li>Cloud SQL Enterprise for reliable, general-purpose workloads (635 TPS baseline performance)</li><li>Cloud SQL Enterprise Plus for higher-scale applications requiring enhanced availability and performance (943 TPS with 42% faster analytics)</li><li>AlloyDB for mission-critical systems demanding maximum performance, scalability, and built-in analytics (867 TPS with 3.6x faster SELECT operations)</li></ul><p><strong>Key insight:</strong> AlloyDB becomes more cost-effective as storage increases. With 1.75 TiB of storage and an HA plus read replica setup, AlloyDB and Cloud SQL Enterprise have nearly identical monthly costs ($2,064 vs $2,066). For smaller storage volumes, however, Cloud SQL Enterprise remains the better value because AlloyDB’s compute costs are higher.</p><h4><strong>Performance-based recommendations:</strong></h4><ul><li>Choose Enterprise Plus for pure OLTP workloads requiring maximum transactional throughput</li><li>Choose AlloyDB for read-heavy applications, mixed HTAP workloads, or when SELECT performance is critical</li><li>Choose Enterprise for cost-sensitive applications with moderate performance requirements</li></ul><p>There is no single right answer, only the right choice for your workload. If you’re evaluating these options and need guidance on performance, cost, or architectural considerations, the experts at <strong>DoiT</strong> can help you make a confident, data-driven decision. Connect with us to craft the ideal PostgreSQL strategy for your cloud journey.</p><h3>References</h3><p>¹ <strong>Storage Cost Calculation:</strong> Based on Google Cloud Pricing Calculator (December 2025), Cloud SQL storage costs $0.17/GiB/month per instance. For the HA + 1 read replica configuration, you need 3× storage allocation (primary + HA + replica) plus backup storage (approx. $0.08/GiB/month) for the primary instance only. AlloyDB storage costs $0.30/GiB/month + $0.10/GiB backup = $0.40/GiB total, but uses shared storage across all nodes.</p><h4><strong>Breakpoint analysis:</strong></h4><ul><li>Cloud SQL (3 instances): (3 × $0.17) + $0.08 = $0.59/GiB effective rate</li><li>AlloyDB (shared): $0.40/GiB total rate</li><li>AlloyDB’s storage is always more cost-effective, but total cost parity occurs around 1.75 TiB, where storage savings offset AlloyDB’s higher compute costs.</li></ul><h4><strong>Pricing Calculator Links:</strong></h4><ul><li><a href="https://cloud.google.com/products/calculator?hl=en&amp;dl=CjhDaVJsWTJFeE1tWTNaaTB4WVRCa0xUUTVNekV0T0dJMVpTMHlPRFV5TUdJMFpEaGtaakFRQVE9PRAHGiQ3NEFDRkJFOC04MDI2LTQ4RjUtQkZCMC1ERUM3MDUxNzA2Njk">Cloud SQL Enterprise</a></li><li><a href="https://cloud.google.com/products/calculator?hl=en&amp;dl=CjhDaVJpTVdZek5tRTROeTB3WkRJMExUUmhNelF0T0dOa09DMDVaREl5WkRKaE1URTBNVGdRQVE9PRAHGiRGQzkwMzcwQy1CMTBGLTQyQzMtQTRFQi0wNzYyMDVBNDY1MEQ">Cloud SQL Enterprise Plus</a></li><li><a href="https://cloud.google.com/products/calculator?hl=en&amp;dl=CjhDaVF5T1RGalpUbGpOUzFoWVRSbUxUUXlaV0l0WW1RMU9TMHpNVFpoWVRRM05ERTNNamdRQVE9PRACGiREQzFCNzY0NS0zNzZGLTREM0UtOEIxRC0zNDk2MDc1MzM4QkU">AlloyDB for PostgreSQL</a></li></ul><p>² <strong>Performance Test Methodology:</strong> Complete test suite and methodology available at: <a href="https://github.com/aamir814/gcp-postgres-benchmarks">https://github.com/aamir814/gcp-postgres-benchmarks</a>. Tests include OLTP (pgbench + custom transactions), OLAP (complex analytical queries), and mixed HTAP workloads across identical infrastructure configurations.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=601caa1110b8" width="1" height="1" alt=""><hr><p><a href="https://engineering.doit.com/when-to-use-alloydb-instead-of-cloud-sql-for-postgresql-601caa1110b8">When to Use AlloyDB Instead of Cloud SQL for PostgreSQL</a> was originally published in <a href="https://engineering.doit.com">DoiT</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[First look at Google Cloud N4A VMs: benchmarked against N4, C4A and AWS M8g.]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://engineering.doit.com/first-look-at-google-cloud-n4a-vms-benchmarked-against-n4-c4a-and-aws-m8g-aba8017ea927?source=rss----b5de5190d27c---4"><img src="https://cdn-images-1.medium.com/max/1792/1*I561Lz9sosdGpsgP4c5KRg.png" width="1792"></a></p><p class="medium-feed-snippet">I&#x2019;ve tested the newest N4A instance family offering from Google Cloud so you don&#x2019;t have to.</p><p class="medium-feed-link"><a href="https://engineering.doit.com/first-look-at-google-cloud-n4a-vms-benchmarked-against-n4-c4a-and-aws-m8g-aba8017ea927?source=rss----b5de5190d27c---4">Continue reading on DoiT »</a></p></div>]]></description>
            <link>https://engineering.doit.com/first-look-at-google-cloud-n4a-vms-benchmarked-against-n4-c4a-and-aws-m8g-aba8017ea927?source=rss----b5de5190d27c---4</link>
            <guid isPermaLink="false">https://medium.com/p/aba8017ea927</guid>
            <category><![CDATA[google-cloud-platform]]></category>
            <category><![CDATA[arm]]></category>
            <category><![CDATA[axion]]></category>
            <category><![CDATA[cost-optimization]]></category>
            <category><![CDATA[benchmark]]></category>
            <dc:creator><![CDATA[Alex Gkiouros]]></dc:creator>
            <pubDate>Wed, 28 Jan 2026 20:50:27 GMT</pubDate>
            <atom:updated>2026-01-29T15:06:07.070Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Common Cloud Mistakes Early-Stage Startups Make and How to Avoid Them]]></title>
            <link>https://engineering.doit.com/common-cloud-mistakes-early-stage-startups-make-and-how-to-avoid-them-384d01463a7f?source=rss----b5de5190d27c---4</link>
            <guid isPermaLink="false">https://medium.com/p/384d01463a7f</guid>
            <category><![CDATA[cloud-computing]]></category>
            <category><![CDATA[cloud-mistakes]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[early-stage-startup]]></category>
            <category><![CDATA[risk-management]]></category>
            <dc:creator><![CDATA[Avi Keinan]]></dc:creator>
            <pubDate>Mon, 26 Jan 2026 10:22:54 GMT</pubDate>
            <atom:updated>2026-03-14T07:38:39.738Z</atom:updated>
            <content:encoded><![CDATA[<p>In my role at <a href="https://www.doit.com">DoiT</a>, I work daily with startups that are just beginning their cloud journey.</p><p>And I keep seeing the same mistakes, over and over again.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GaSJ3-GZweQtLj2gWblexg.png" /></figure><p>I’m sharing a few of them here, hoping you can avoid them before they become expensive/painful/hard to fix:</p><h3>1. The AWS Account Is Opened Under a Founder’s Personal Email</h3><p>Very often, the first AWS account is created using a founder’s private Gmail address.</p><p>In this situation, the account legally and operationally belongs to a person, not to the company.</p><p>If the founder leaves, there is a conflict, or (worst case) something happens to them, ownership becomes a serious business risk.</p><p>Beyond that, personal email is usually less secure than a corporate mailbox: no enforced MFA, no centralized auditing, weaker identity governance and a major obstacle when performing an audit for certification.</p><p>A compromise of the founder’s email often means full control over the company’s AWS environment.</p><p>This also creates a <strong>single point of failure</strong>.</p><p><strong>Best practice:</strong></p><p>Create a shared group mailbox, for example: aws@example.com</p><p>Add at least two team members (someone is always sick, on vacation, or at a conference), and use plus-addressing to separate environments in different AWS accounts:</p><ul><li>aws+production@example.com</li><li>aws+organization@example.com</li><li>aws+development@example.com</li></ul><h3>2. Creating resources in the Management Account</h3><p>A startup begins with a single AWS account that hosts everything: production, development, demos, and a developer&#39;s playground.</p><p>As the company grows, it becomes necessary to separate environments. The easiest way seems to be to turn this single account into the <strong>Management Account</strong> in AWS Organizations and create new member accounts via the organization.</p><p>The problem: the management account is the only account that <strong>cannot be governed</strong> by organization-wide controls.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/623/1*aXqheuA8HlWDYIwIs3TOyw.png" /><figcaption>AWS Organization <a href="https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html">Service Control Policies documentation</a></figcaption></figure><p>Typical policies you want to enforce:</p><ul><li>All EC2 EBS volumes must be encrypted.</li><li>Resources cannot be created in unauthorized regions.</li><li>Expensive instance types (GPU) are restricted.</li><li>IAM users are forbidden (only roles are allowed).</li></ul><p>None of these applies to the Management Account, which, in this case, is also the production account.</p><p>Worse, AWS does not allow converting a Management Account into a Member Account.</p><p>Once the production account is also the management account, the only solution is a full organizational migration: rebuilding the organization, recreating policies, reconfiguring permissions, and reonboarding every employee to a new Single Sign On (SSO) endpoint.</p><p>If you are currently in a stage where everything runs in a single AWS account and want to start separating environments, <strong>create a new standalone AWS account</strong>, set it as the Management Account via AWS Organizations, and invite the existing Production account to become a member account in the new organization.</p><h3>3. Postponing Compliance</h3><p>If you plan to sell to enterprise customers, you will eventually be asked for compliance:</p><ul><li><strong>SOC 2 / ISO 27001</strong> for B2B SaaS</li><li><strong>HIPAA</strong> for healthcare</li><li><strong>PCI DSS</strong> for fintech and payments</li></ul><p>Retrofitting an existing product and organization to new compliance requirements is extremely hard.</p><p>It affects not only cloud architecture, but also development workflows, access control, and even employment contracts (IP ownership, confidentiality, device management, etc.).</p><p>Fixing cloud infrastructure is challenging but achievable. Changing contracts and organizational processes later is far more difficult. Therefore, engaging a compliance advisory partner from the very first lines of your product’s code will significantly simplify the journey.</p><h3>4. All Eggs in One Basket</h3><p>AWS allows you to manage domain registration, renewal and DNS inside Route 53; this is convenient and dangerous.</p><p>If the AWS account is suspended (due to a billing issue, security incident, or leaked IAM key), your domain may be affected as well.</p><p>When email stops working, it becomes very difficult to communicate with AWS Support to resolve the issue.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/705/1*128KGEqTQ6s8Q9LMq3-HgA.png" /><figcaption>posts from r/aws in Reddit.com</figcaption></figure><p><strong>Best practice:</strong></p><p>Keep the company’s primary domain outside the main production AWS account, even in a separate provider like GoDaddy or NameCheap or in a dedicated AWS account. If you are locked out of your production account, you can still maintain the DNS records with the other provider/account.</p><h3>5. Maintain an expiration calendar so you don’t miss critical renewal dates</h3><p>Even in the first year, a startup quickly accumulates:</p><ul><li>Contracts</li><li>API keys</li><li>Credit cards</li></ul><p>What they all have in common is an expiration date.</p><p>The unwanted outcomes are usually:</p><ul><li>Blocked AWS accounts due to non-payment.</li><li>Unexpected service outages due to an expired API key.</li><li>Rushed contract renewal negotiations due to missed or imminent renewal dates.</li></ul><p>A shared calendar with automated reminders (“Credit card 3344 expires in 30 days”, “MAP Provider contract renewal in 45 days”) helps prevent these issues.</p><h3>Final Thought</h3><p>There are many challenges to deal with. I would strongly recommend finding a mentor who has been a founder before and has already led several startups. Experienced advice is truly worth gold.</p><p>If you want to build your cloud the right way from day one, <a href="http://doit.com">DoiT</a> brings the technology, the expertise, and years of experience helping both startups and global enterprises avoid these exact mistakes — and many others.</p><p>Let’s make your cloud a growth engine, not a risk factor.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=384d01463a7f" width="1" height="1" alt=""><hr><p><a href="https://engineering.doit.com/common-cloud-mistakes-early-stage-startups-make-and-how-to-avoid-them-384d01463a7f">Common Cloud Mistakes Early-Stage Startups Make and How to Avoid Them</a> was originally published in <a href="https://engineering.doit.com">DoiT</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[MCP Toolbox for Databases with AlloyDB: A Hands-on Exploration]]></title>
            <link>https://engineering.doit.com/mcp-toolbox-for-databases-with-alloydb-a-hands-on-exploration-0c5a874427fe?source=rss----b5de5190d27c---4</link>
            <guid isPermaLink="false">https://medium.com/p/0c5a874427fe</guid>
            <category><![CDATA[ai-tools]]></category>
            <category><![CDATA[database]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[alloydb]]></category>
            <category><![CDATA[ai-agent]]></category>
            <dc:creator><![CDATA[Joseph Bharath Reddy Allam]]></dc:creator>
            <pubDate>Fri, 23 Jan 2026 10:02:05 GMT</pubDate>
            <atom:updated>2026-01-23T10:02:04.490Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*9Dya4jjyTVKt23IqiZP4Lg.png" /></figure><p>Generative AI is increasingly becoming an integral part of how teams operate, reason about systems, and query data. What started with code completion and chat-based assistants is now expanding into infrastructure, operations, and data systems. Databases are no exception. Teams are increasingly experimenting with natural language interfaces for querying data, exploring schemas, and assisting with analysis.</p><p>At the same time, databases remain some of the most sensitive and operationally critical components in any system. Exposing them directly to free-form AI prompts raises real concerns around correctness, security, and control. As AI capabilities move closer to production systems, the way models interact with databases needs more structure than simple prompt-based SQL generation.</p><p>MCP Toolbox for Databases is an open source project from Google that addresses this problem. It provides a structured, protocol-based way for AI tools to interact with databases through well defined operations, rather than raw text prompts. MCP Toolbox provides a database-agnostic framework for AI tool interaction, while individual databases are supported through database-specific MCP tools. These tools can be prebuilt integrations or custom implementations and can be used directly with Gemini CLI extensions. In this post, the focus is on AlloyDB as a PostgreSQL-compatible example. The source code and project documentation are available on GitHub: <a href="https://github.com/googleapis/genai-toolbox">https://github.com/googleapis/genai-toolbox</a></p><h3>Introduction: Why MCP Toolbox for Databases Matters</h3><p>Large language models are increasingly used around databases. Developers ask them to write SQL, explain schemas, or answer analytical questions. In practice, many of these workflows still rely on simple text-to-SQL generation, where the model produces a query based on a prompt and hopes it matches the actual schema and data.</p><p>This approach works for small demos, but it quickly shows limitations. The model often has incomplete knowledge of the schema, no visibility into permissions, and no awareness of how a query is executed. From a database perspective, this makes it hard to trust the results or safely integrate these tools into real environments.</p><p>The Model Context Protocol, or MCP, takes a different approach. Instead of asking a model to guess, MCP allows AI tools to interact with systems through explicit, well defined operations. A database can expose capabilities such as listing tables, describing schemas, executing queries, or retrieving query plans as tools. The AI client calls those tools and works with real outputs, not assumptions.</p><p>MCP Toolbox for Databases is an open source implementation of this idea from Google. It exposes database functionality through MCP and provides a database-agnostic framework for AI tool interaction, while individual databases are supported through database-specific MCP tools. In this walkthrough, AlloyDB is used as a PostgreSQL-compatible example. Each operation is handled as a concrete tool invocation, which makes interactions more predictable, observable, and easier to control.</p><p>In this post, I walk through a hands-on setup using AlloyDB for PostgreSQL and the Gemini CLI. The focus is on what this looks like in practice. We explore a database schema without writing SQL, answer business questions using natural language backed by real queries, and inspect how those queries are executed. The goal is not to promote automation, but to show how MCP changes the way AI tools interact with databases in a way that database engineers can reason about and trust.</p><h3>Architecture Overview: Gemini CLI, MCP Toolbox, and AlloyDB</h3><figure><img alt="High-level architecture illustrating how Gemini CLI uses MCP Toolbox to execute structured database operations against AlloyDB." src="https://cdn-images-1.medium.com/max/1024/1*RTf482gf8Lymj0gJxThGcg.png" /></figure><p>Before looking at individual queries and examples, it helps to understand how the components in this setup fit together. Although there are several moving parts, the overall architecture is simple and intentionally layered.</p><p>At a high level, the Gemini CLI acts as the user-facing interface. It is where prompts are entered and responses are displayed. When database-related prompts are issued, Gemini does not interact with AlloyDB directly. Instead, it relies on MCP to discover and invoke database capabilities in a structured way.</p><p>The AlloyDB integration for Gemini CLI bundles MCP Toolbox for Databases. In this setup, MCP Toolbox runs implicitly as part of the Gemini CLI extension. There is no separate MCP server process to install or manage when using Gemini CLI with the AlloyDB extension. When connecting from other IDEs or MCP clients, MCP Toolbox is typically run as a standalone server. When Gemini CLI starts, it loads the AlloyDB extension, which registers MCP servers and exposes a set of database tools.</p><p>These tools fall into two broad categories. One set covers administrative and infrastructure operations, such as listing clusters or instances. The other focuses on database-level operations, including schema introspection, query execution, and performance-related metadata. Each operation is exposed as a discrete tool with a well defined input and output.</p><p>When a prompt requires database interaction, Gemini selects the appropriate MCP tool and invokes it. The MCP server executes the request against AlloyDB and returns structured results. Gemini then uses those results to produce a natural language response. The model is not guessing schema details or fabricating results. It is working with live data returned by explicit tool calls.</p><p>Authentication and authorization are handled outside the prompt flow. Access to Google Cloud APIs uses Application Default Credentials, which map the local user identity to IAM permissions. Database access uses standard PostgreSQL credentials. AlloyDB itself remains a standard PostgreSQL-compatible system. MCP does not change how the database works. It changes how AI tools interact with it.</p><p>The setup shown in this post follows the AlloyDB integration approach documented by Google, which describes how Gemini CLI uses MCP Toolbox to connect to AlloyDB instances: <a href="https://docs.cloud.google.com/alloydb/docs/connect-ide-using-mcp-toolbox">https://docs.cloud.google.com/alloydb/docs/connect-ide-using-mcp-toolbox</a>.</p><h3>Secure Authentication and Access Control with ADC</h3><p>Authentication is a critical part of this setup, even though it is mostly invisible once configured. Gemini CLI and MCP Toolbox authenticate to Google Cloud using Application Default Credentials, commonly referred to as ADC. Application Default Credentials provide a standard way for local tools and applications to obtain Google Cloud credentials based on the user’s identity and configured environment.</p><p>ADC allows local tools to authenticate to Google Cloud APIs using the developer’s own identity. There are no API keys or embedded service account files. Permissions are controlled through standard IAM roles, which determine what infrastructure-level operations MCP tools are allowed to perform.</p><p>Database access is handled separately. SQL execution uses standard PostgreSQL authentication with a database user. This separation allows cloud permissions and database permissions to be managed independently, which aligns with how most teams already operate.</p><p>This model avoids embedding secrets in prompts or configuration files. It also makes actions auditable using existing cloud and database logging. For AI-assisted database workflows, this separation of identity, authorization, and execution is essential.</p><h3>Database Introspection Without Writing SQL</h3><p>With the environment in place, the first useful capability to test is database introspection. Instead of relying on inferred knowledge, MCP allows the database to expose metadata directly through tools.</p><p>A simple prompt requesting an overview of the database triggers the MCP database_overview operation. This returns live information such as engine version, uptime, and connection statistics.</p><figure><img alt="Database overview returned by AlloyDB via MCP, showing PostgreSQL version, uptime, and active connections." src="https://cdn-images-1.medium.com/max/1024/1*5eAWPNvCco5rI6Yn0ktYKw.png" /></figure><p>The next step is schema discovery. Asking to list all tables causes Gemini to invoke the appropriate MCP tool, which queries the system catalogues directly.</p><figure><img alt="List of database tables retrieved using MCP tools in Gemini CLI without writing SQL." src="https://cdn-images-1.medium.com/max/1024/1*okckMSRyueKcJJpfJUz-iQ.png" /></figure><p>No SQL is written by the user, and no assumptions are made by the model. The interaction is grounded entirely in explicit database operations.</p><h3>Schema Understanding and Relationships</h3><p>Once basic schema discovery is available, understanding relationships between tables becomes critical. This is where many natural language approaches struggle if they lack direct access to metadata.</p><p>Using MCP, Gemini can describe a table by querying the database schema directly. In this example, the orders table is described, including its columns, primary key, and foreign key relationships.</p><figure><img alt="Schema details for the orders table, including columns, primary key, and foreign key relationships." src="https://cdn-images-1.medium.com/max/1024/1*UL4Cy4kdfAcrppYKN3B6JQ.png" /></figure><p>Because this information comes directly from the database, it remains accurate as the schema evolves. This level of schema awareness is a prerequisite for generating correct analytical queries.</p><h3>Natural Language to SQL Analytics</h3><p>With schema awareness in place, higher-level analytical questions can be answered using natural language. In this setup, natural language queries are translated into explicit SQL operations executed through MCP tools.</p><p>The first example identifies the top five customers by total order value. Gemini generates a SQL query that joins customers, orders, and order details, aggregates revenue, and sorts the results. The SQL is executed directly against AlloyDB.</p><figure><img alt="Query results showing top customers by total order value, generated and executed via MCP." src="https://cdn-images-1.medium.com/max/1024/1*WhErG7kzL_-wLrhHv32zEA.png" /></figure><p>A second example introduces a more complex, join-heavy query that calculates revenue by product and supplier.</p><figure><img alt="Revenue by product and supplier calculated using a SQL query executed through MCP." src="https://cdn-images-1.medium.com/max/1024/1*LOvN9-Q8ie1PxlUdcVfC4Q.png" /></figure><p>The key point is transparency. The generated SQL is visible, the execution is real, and the results come directly from the database.</p><h3>Query Execution Plans and Performance Insight</h3><p>Beyond query results, understanding how a query is executed is essential for real systems. MCP can surface query execution plans and related metadata.</p><p>When asked to explain how a query is executed, Gemini invokes an MCP tool that retrieves the query plan from AlloyDB. The database generates the plan using its normal PostgreSQL logic, and Gemini explains it in natural language.</p><figure><img alt="Query execution plan from AlloyDB with an explanation generated using MCP tools." src="https://cdn-images-1.medium.com/max/1024/1*KrVslMA9fu7MapAa4nrIWQ.png" /></figure><p>On small demo datasets, sequential scans and hash joins are expected. On larger datasets, the same workflow can highlight index usage, parallel execution, and tuning opportunities. MCP does not optimize queries automatically. It helps interpret what the database is already doing.</p><h3>Why MCP Toolbox Is Different from Prompt-Based SQL</h3><p>Traditional prompt-based SQL relies on the model guessing schema details and query structure. MCP replaces this with explicit, tool-backed operations.</p><p>Because schema information, query execution, and performance metadata come directly from the database, results are easier to validate and reason about. This makes MCP-based workflows more suitable for real environments where correctness and control matter.</p><h3>When to Use MCP Toolbox</h3><p>MCP Toolbox is well suited for schema exploration, analytics, developer productivity, and assisted query analysis. It is not a replacement for transactional application paths or unrestricted automation. Its strength lies in making AI-assisted database interactions observable and grounded in real operations.</p><p>These examples focus on exploration and analysis workflows. In production environments, access controls, permissions, and operational safeguards should be applied in the same way as any other database interaction.</p><h3>Conclusion</h3><p>MCP Toolbox for Databases represents a practical step forward in how generative AI can interact with production databases. Rather than relying on prompt-based guesswork, it introduces a structured, tool-driven model where AI works with real schema metadata, executes real queries, and surfaces real execution plans. Combined with AlloyDB and Gemini CLI, this approach makes AI-assisted database exploration and analysis more transparent, auditable, and aligned with how database teams already operate.</p><p>As organizations begin to experiment with natural language interfaces for data access, the underlying interaction model matters. MCP provides a foundation that prioritizes correctness, control, and observability, which are essential when AI moves closer to critical data systems.</p><p>If you are exploring how to safely introduce AI-assisted workflows into your database environment, or evaluating MCP-based integrations on Google Cloud, <a href="https://www.doit.com/">DoiT</a> can help. Our team of cloud architects and data specialists works with organizations worldwide to design, validate, and optimize modern data platforms, from proof of concept through production.</p><p>Let’s discuss how MCP, AlloyDB, and generative AI can fit into your data strategy, and how to do it in a way that remains secure, reliable, and aligned with your operational goals.</p><p>MCP Toolbox provides a structured way for AI tools to interact with databases without relying on guesswork. Combined with Gemini CLI and AlloyDB, it enables natural language workflows that remain transparent, auditable, and aligned with database fundamentals.</p><p>Rather than abstracting databases away, MCP exposes them in a way that AI tools can work with safely. For teams exploring how generative AI fits into data workflows, this approach offers a practical path forward.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0c5a874427fe" width="1" height="1" alt=""><hr><p><a href="https://engineering.doit.com/mcp-toolbox-for-databases-with-alloydb-a-hands-on-exploration-0c5a874427fe">MCP Toolbox for Databases with AlloyDB: A Hands-on Exploration</a> was originally published in <a href="https://engineering.doit.com">DoiT</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Understanding Google Cloud's New Spend-Based CUD Model]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://engineering.doit.com/understanding-google-clouds-new-spend-based-cud-model-311dea4a4a79?source=rss----b5de5190d27c---4"><img src="https://cdn-images-1.medium.com/max/1000/1*C9D5afR9cGFpQT210jUiIw.png" width="1000"></a></p><p class="medium-feed-snippet">January 2026 brings simplified billing, expanded discounts, same savings</p><p class="medium-feed-link"><a href="https://engineering.doit.com/understanding-google-clouds-new-spend-based-cud-model-311dea4a4a79?source=rss----b5de5190d27c---4">Continue reading on DoiT »</a></p></div>]]></description>
            <link>https://engineering.doit.com/understanding-google-clouds-new-spend-based-cud-model-311dea4a4a79?source=rss----b5de5190d27c---4</link>
            <guid isPermaLink="false">https://medium.com/p/311dea4a4a79</guid>
            <category><![CDATA[committed-use-discounts]]></category>
            <category><![CDATA[google-cloud-platform]]></category>
            <category><![CDATA[finops]]></category>
            <category><![CDATA[google-cloud-billing]]></category>
            <dc:creator><![CDATA[Alex Gkiouros]]></dc:creator>
            <pubDate>Thu, 22 Jan 2026 17:36:26 GMT</pubDate>
            <atom:updated>2026-01-23T11:22:07.656Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[AWS European Sovereign Cloud: What It Is and Why It Matters]]></title>
            <link>https://engineering.doit.com/aws-european-sovereign-cloud-what-it-is-and-why-it-matters-e1a2fb2e6753?source=rss----b5de5190d27c---4</link>
            <guid isPermaLink="false">https://medium.com/p/e1a2fb2e6753</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[gdpr]]></category>
            <category><![CDATA[compliance]]></category>
            <category><![CDATA[digital-sovereignty]]></category>
            <category><![CDATA[sovereign-cloud]]></category>
            <dc:creator><![CDATA[Kate Gawron]]></dc:creator>
            <pubDate>Fri, 16 Jan 2026 13:13:30 GMT</pubDate>
            <atom:updated>2026-01-16T13:13:29.066Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*NkMsKrgIRlaWMndut-bv8Q.png" /></figure><p>Amazon Web Services (AWS) has officially launched the <a href="https://aws.amazon.com/blogs/aws/opening-the-aws-european-sovereign-cloud/"><strong>AWS European Sovereign Cloud (ESC)</strong></a>, a dedicated cloud infrastructure built <em>entirely within the European Union (EU)</em> and designed to meet the most stringent data residency, operational autonomy, and sovereignty requirements for European organisations. This marks a major step in addressing regulatory concerns around cloud sovereignty, particularly for highly regulated sectors such as government, healthcare, finance, defence, and telecommunications.</p><h3>What Is the AWS European Sovereign Cloud?</h3><p>The ESC is an independent AWS cloud environment physically and logically isolated from AWS’s global Regions. It was created to give European organisations the <strong>highest levels of data sovereignty, operational control, compliance, and governance</strong>, while still offering AWS’s broad cloud and AI capabilities.</p><p>Key features of this sovereign cloud include:</p><ul><li><strong>Fully EU‑based infrastructure</strong>: All core infrastructure, data centres, networking, and operational tooling are physically located within the EU.</li><li><strong>Physical and logical separation</strong>: It is distinct from AWS’s existing global Regions, with controls to prevent access or dependencies from outside the EU.</li><li><strong>European governance and personnel</strong>: Operations, technical support, customer service, and governance structures are headed by EU residents under European legal entities.</li><li><strong>Compliance and sovereignty framework</strong>: AWS provides a <em>Sovereignty Reference Framework</em> and third-party audit reports to demonstrate compliance with stringent sovereignty and regulatory standards.</li></ul><h3>Technical and Personnel Setup: How It’s Built Differently</h3><p>The main aim of the ESC is to sever any legal connection to any non-EU entity or personnel so that it becomes impossible to fulfil any data access requests from outside of the EU in line with GDPR. The ESC has been built to ensure that only someone located within the EU can access it, including AWS staff. This extends to the usage of Nitro instances only, as they cannot be accessed at any time by anyone, again making it physically impossible for the data to be taken from the instance without the customer&#39;s direct involvement.</p><figure><img alt="An architectural diagram illustrates the separation between “Existing AWS Regions” and the “European Sovereign Cloud.” On the left, a box labeled “Existing AWS Regions” lists “Europe (Stockholm) AWS Region,” “Europe (Ireland) AWS Region,” and “Europe (Paris) AWS Region,” with icons below for Billing, Usage, and IAM. On the right, a box labeled “European Sovereign Cloud” contains “Brandenburg, Germany ESC AWS Region,” also with icons for Billing, Usage, and IAM." src="https://cdn-images-1.medium.com/max/1024/1*2Cbv4hbgHzGbz2qVbSX53w.png" /></figure><h4>Sovereign Infrastructure and Controls</h4><p>Unlike traditional cloud deployments, the ESC includes several technical constructs to enforce sovereignty:</p><ul><li><strong>Dedicated partition and Region naming</strong>: The sovereign cloud uses its own AWS partition and Region identifiers, isolating it from global AWS Regions.</li><li><strong>Dedicated European trust services</strong>: A sovereign European Certificate Authority and local Route 53 DNS infrastructure operate entirely within the EU.</li><li><strong>Network isolation</strong>: Dedicated connectivity and networking prevent cross-Region traffic from leaving the EU boundary unless explicitly configured otherwise.</li></ul><h4>Personnel and Governance</h4><p>Operational control is crucial to sovereignty otherwise, the risk of bad actors from outside of the EU increases:</p><ul><li><strong>EU-resident operators</strong>: Day-to-day operations, security, and support for the sovereign cloud are carried out exclusively by AWS employees residing in the EU.</li><li><strong>Legal entities under EU law</strong>: The cloud is governed by European legal entities (e.g., AWS subsidiaries in Germany), overseen by a board with independent European members.</li><li><strong>European Security Operations Center (SOC)</strong>: Security monitoring and incident response are performed by a dedicated European SOC that mirrors AWS’s global security practices.</li></ul><p>This combination of EU-based personnel and governance ensures that sensitive operational decisions and access control adhere strictly to European legal frameworks.</p><h3>Day One Services: What’s Available at Launch</h3><p>At launch, the AWS ESC is available in Germany, Brandenburg with access granted to AWS Outposts or Local Zones within the EU only. The next expected region is Portugal, with further expansion across Europe subject to demand. The ESC supports a broad set of core AWS services across key categories, making it suitable for many enterprise workloads, however, some areas are not yet represented (any code pipeline or data manipulation tooling for example) which could make it impossible for larger projects to move across:</p><p><strong>Compute</strong>:</p><ul><li>Amazon EC2</li><li>AWS Lambda</li></ul><p><strong>Containers &amp; Orchestration</strong>:</p><ul><li>Amazon EKS (Kubernetes)</li><li>Amazon ECS</li></ul><p><strong>Databases</strong>:</p><ul><li>Amazon RDS</li><li>Amazon DynamoDB</li><li>Amazon Aurora</li></ul><p><strong>Storage &amp; Networking</strong>:</p><ul><li>Amazon S3</li><li>Amazon EBS</li><li>Amazon VPC</li><li>Amazon Route53</li></ul><p><strong>Security &amp; Identity</strong>:</p><ul><li>AWS KMS (Key Management Service)</li><li>AWS Private Certificate Authority</li></ul><p><strong>AI &amp; ML</strong>:</p><ul><li>Amazon SageMaker</li><li>Amazon Bedrock</li></ul><p>This lineup is designed to support full application stacks, from modern AI/ML workloads to traditional enterprise systems, but you can easily see that many features commonly used are missing, which makes it harder for complex or niche architectures to migrate. One of the most interesting services here is Route53. AWS has encountered several global outages due to reliance on Route53 services based in us-east-1, so theoretically, this improves reliability for the ESC by decoupling.</p><h3>How It Protects Data (and What Makes It Unique)</h3><p>The ESC combines several technical and organisational controls to protect customer data:</p><h4>Sovereign Data Residency</h4><p>Unlike merely hosting data in a geographic region, sovereign clouds enforce policy mechanisms ensuring:</p><ul><li>All <em>content and metadata</em> (roles, configurations, identifiers) remain within EU boundaries.</li><li>Data does not leave the sovereign cloud unless the customer explicitly chooses to transfer it.</li></ul><h4>Isolation and Security</h4><p>Let’s talk about <a href="https://docs.aws.amazon.com/whitepapers/latest/overview-aws-european-sovereign-cloud/introduction.html">AWS Nitro</a> and what makes it special:</p><ul><li><strong>Minimal trusted computing base</strong>: The Nitro System removes the traditional hypervisor OS, reducing the attack surface by eliminating components such as SSH and shell access. That’s right, no SSH, sysadmins!</li><li><strong>Hardware-based isolation</strong>: Functions such as networking and storage are offloaded to dedicated Nitro cards, separating them from compute resources and enhancing security boundaries.</li><li><strong>Strong tenant isolation</strong>: Each EC2 instance runs in its own isolated environment, using either the lightweight Nitro Hypervisor or bare metal with no shared resources.</li><li><strong>Secure boot and root of trust</strong>: Nitro uses cryptographic validation at every boot stage to ensure the system has not been tampered with.</li><li><strong>No operator access to instance memory or storage</strong>: Even AWS personnel cannot access customer workloads, ensuring tenant isolation by design. Even if someone gained physical access to an AWS data center and attempted to access the server, they would still be unable to get anything useful from it, as even the memory is encrypted.</li></ul><p>The Nitro System is what has made the ESC technically possible.</p><h4>Operational Separation</h4><p>No operational dependencies exist outside the EU. Tools, access logs, and control planes are all EU-centric, insulating operations from foreign jurisdictional access.</p><p>In contrast to other clouds that might simply offer European data centres, AWS’s sovereign cloud is built to provide certifiable operational autonomy aligning with EU digital sovereignty goals.</p><h3>Migrating to the ESC</h3><p>Migrating to the ESC is much more complex than to a different region. The ESC has no connectivity to other regions and is entirely isolated. Organizations must treat it as a distinct cloud environment with a separate partition, which may require reconfiguring or duplicating tools, services, and automation scripts. Networking presents one of the most significant migration challenges, as traditional cross-region VPC peering, Transit Gateways, or shared services patterns are not supported across the sovereign and standard AWS environments. This demands rearchitecting for intra-region networking only, deploying duplicate networking stacks like firewalls, NATs, and DNS resolvers within the new environment.</p><p>Additionally, data transfer mechanisms such as AWS Snowball or secure API-based replication may be needed, since direct pipelines or peering to existing AWS environments are restricted. Organizations should also prepare for strict identity and access management (IAM) remapping, endpoint reconfiguration, and potential latency shifts due to isolated infrastructure.</p><h3>Trade-offs and Considerations</h3><p>While the ESC brings significant benefits, there are trade-offs:</p><h4>Complexity of Setup</h4><ul><li>Organisations may need to adjust IAM roles, accounts, and tooling to align with a separate sovereign partition.</li><li>Existing global accounts don’t automatically extend into the sovereign cloud.</li></ul><h4>Potential Feature Lag</h4><ul><li>Not every new AWS service will be available immediately in the sovereign cloud. AWS will prioritise critical services first.</li><li>Potential for the latest patches and versions being delayed, which could increase security risk.</li></ul><h4>Cost and Operational Overhead</h4><ul><li>Sovereign deployments often have different pricing structures and currency considerations (e.g., billing in EUR).</li></ul><h4>Regulatory Uncertainty</h4><ul><li>As EU digital sovereignty frameworks evolve (e.g., data governance laws), compliance standards may change, requiring ongoing adjustments.</li></ul><h3>Use Cases and Target Markets</h3><p>The European Sovereign Cloud is especially relevant for organisations with strict sovereignty needs:</p><h4>Highly Regulated Industries</h4><ul><li><strong>Government</strong>: Public sector agencies with national security data requirements.</li><li><strong>Healthcare</strong>: Systems handling patient data subject to GDPR and local data protection laws.</li><li><strong>Financial Services</strong>: Banking and insurance platforms needing strict operational controls.</li><li><strong>Telecommunications &amp; Energy</strong>: Critical infrastructure operators managing sensitive operational data.</li></ul><h4>Emerging Tech and AI Workloads</h4><p>AI workloads that process sensitive datasets (e.g., healthcare analytics, industrial AI) benefit from sovereign controls while leveraging AWS’s advanced AI services.</p><h4>Cross-border EU Organisations</h4><p>Multinational EU enterprises that must comply with diverse national laws can centralise sovereignty compliance within a unified EU cloud footprint.</p><h3>Unknowns and Future Questions</h3><p>Despite the significant advancement, some aspects remain unclear:</p><ul><li><strong>Service Roadmap Timing</strong>: How quickly newer AWS services will be certified for the sovereign cloud environment.</li><li><strong>Third-party Ecosystem Support</strong>: How soon partner tools and ISV solutions will become fully supported.</li><li><strong>Long-term Regulatory Alignment</strong>: How evolving EU digital policies might impact cloud sovereignty requirements and compliance obligations.</li></ul><h3>Conclusion</h3><p>The AWS European Sovereign Cloud introduces a new era of data autonomy for EU-based organisations, offering strict residency, operational independence, and compliance frameworks. Built with physically isolated infrastructure and managed exclusively by EU personnel, it’s tailored for highly regulated industries and public sector needs. Migrating requires a fresh approach, especially in networking, IAM, and tooling. And if you’re building apps or automation, <strong>get used to using aws-eusc and eusc-de-east-1 =API calls from now on.</strong> This isn’t just another AWS Region, it’s a sovereign ecosystem.</p><p>If you are considering a migration to <strong>the ESC</strong>, you are not alone. DoiT International is here to help you assess, plan and migrate with a strong focus on your business outcomes. With over 130 senior cloud experts specializing in crafting customized cloud solutions, our team is ready to help you navigate this process smoothly and optimize your infrastructure to ensure compliance and meet future demands efficiently.</p><p>Our experts are ready to provide you with strategic guidance and technical expertise every step of the way. The ESC will likely complicate your FinOps too. DoiT specializes in helping customers improve their cost visibility, management and savings in even the most complex cloud setups.</p><p>Let’s discuss what makes the most sense for your company during this policy enforcement phase, ensuring your cloud infrastructure is robust, compliant, and optimized for success. <a href="https://www.doit.com/expertise/">Contact us today.</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e1a2fb2e6753" width="1" height="1" alt=""><hr><p><a href="https://engineering.doit.com/aws-european-sovereign-cloud-what-it-is-and-why-it-matters-e1a2fb2e6753">AWS European Sovereign Cloud: What It Is and Why It Matters</a> was originally published in <a href="https://engineering.doit.com">DoiT</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Streamline Cloud Management via DoiT CLI]]></title>
            <link>https://engineering.doit.com/streamline-cloud-management-via-doit-cli-d698fa7737e3?source=rss----b5de5190d27c---4</link>
            <guid isPermaLink="false">https://medium.com/p/d698fa7737e3</guid>
            <category><![CDATA[cloud-computing]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[automation]]></category>
            <category><![CDATA[finops]]></category>
            <dc:creator><![CDATA[Luca Serpietri]]></dc:creator>
            <pubDate>Fri, 16 Jan 2026 10:03:08 GMT</pubDate>
            <atom:updated>2026-01-16T10:03:07.050Z</atom:updated>
            <content:encoded><![CDATA[<p>How the DoiT Cloud Intelligence CLI unlocks superior cloud management</p><p>We have just released the <a href="https://changelog.doit.com/introducing-the-doit-cloud-intelligence-tm-cli-1VRGaA">DoiT Cloud Intelligence CLI</a> and you wouldn’t imagine the smile this announcement put on my face. Maybe I’m dating myself here but, I grew up in a world where bash scripting felt like a superpower and those who were eloquent in grep at the time were revered as we now revere the most acute data analyst. But I’m digressing.</p><p>Immediately, I jumped at the opportunity to take our newly released CLI for a spin and from the get-go, I learned something. We used <a href="https://github.com/rest-sh/restish">restish</a> as the bedrock for its implementation: as long as your API is based on OpenAPI (and DoiT’s is), it will handle schema discovery and authentication.</p><h3>The Setup</h3><p>To get started, <a href="https://help.doit.com/docs/cli">I followed our documentation</a>, installed restish via brew on my terminal and configured to work with the DoiT APIs. The default profile allows for call customizations which I didn’t use at the beginning but I’m showing here as some of you might find interesting.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*NGoPm6BWYBJH_frc5HTOpg.png" /></figure><p>It’s now time to verify everything is working correctly so I’ve validated my login using the specific command restish dci validate which triggered the OAuth workflow (shout-out to <a href="https://github.com/will-stone/browserosaurus">Browserosaurus</a>, an amazing browser selector I cannot live without)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*M7MHxAgrM3l61mVe6QScjQ.png" /></figure><p>After logging in my DoiT Cloud Intelligence tenant, all looked good: I’m ready to script my way through superior cloud management.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-e9vSmJ8snURk7FfetMFuA.png" /></figure><h3>The Goal</h3><p>For my first use case I’ve blatantly copied what our customers have struggled with for years before partnering with DoiT: <em>cost accountability.</em></p><p>I wanted to ensure a smooth, simple way for customers to:</p><ul><li>Invite a new user on DoiT Cloud Intelligence;</li><li>Create an Allocation based on their username that would track the costs they generated;</li><li>Create a budget tracking the newly created Allocation that will send notifications if a specific threshold is met.</li></ul><p>This will allow any new user to have their own personal feedback loop on cloud costs, with minimal friction. So let’s get started.</p><h3>The Implementation</h3><h4>Inviting the user</h4><p>This is as simple as it gets, the command is:</p><p>restish dci invite-user email:&lt;user_email&gt;</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*lvL2oT9aJY0hbajDSWiU_w.png" /><figcaption>you have e-mail</figcaption></figure><h4>Creating a user-dedicated Allocation</h4><p>If you’re new around here and you don’t know about Allocations, <a href="https://help.doit.com/docs/operate/allocations">I highly recommend you get familiar with them</a>.</p><p>The TL;DR is: Allocations allow users to logically group cloud costs based on any available data dimension. In our case, I’d like to logically group all the cloud costs generated by our newly created user, so they can easily monitor their spend.</p><p>The command is</p><p>restish dci create-allocation &lt; allocation_conf.json</p><p>but we need to pass a few parameters as configuration. I’m going to slightly cheat and assume that there’s a Tag key available in our billing data called member and each value corresponds to a cloud engineer (in our case, luca+test )</p><p>The conf.json file is going to be as follows:</p><pre>{<br>    &quot;name&quot;: &quot;luca+test generated costs&quot;,<br>    &quot;description&quot;: &quot;All costs generated by luca+test&quot;,<br>    &quot;rule&quot;: {<br>        &quot;formula&quot;: &quot;A OR B&quot;,<br>        &quot;components&quot;: [<br>            {<br>                &quot;key&quot;: &quot;member&quot;,<br>                &quot;type&quot;: &quot;label&quot;,<br>                &quot;mode&quot;: &quot;is&quot;,<br>                &quot;values&quot;: [<br>                    &quot;luca+test&quot;<br>                ]<br>            }<br>        ]<br>    }<br>}</pre><p>Running the command provides the Allocation id which will come in handy shortly.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*EnQWOr2n1q3XQhIL4fDq-Q.png" /></figure><h4>Creating a user-dedicated Budget</h4><p>The sound of the word “budget” instills fear into most of the engineers I talk to: it’s a synonym for slowing down innovation through restrictions and barriers.</p><p>While I acknowledge this might have happened in the past, the way Budgets are implemented in DoiT Cloud Intelligence creates a productive feedback loop between cloud engineers and their costs, where bad surprises are practically extinct and awareness is the key mantra.</p><p>If you want to learn more, please <a href="https://help.doit.com/docs/governance/budgets">head over our Documentation </a>where we dive deeper into all their functionality.</p><p>In my use case, I want to keep it simple. I just need a simple monthly budget of $1000 to make sure newly-created users know their spend and are proactively alerted if the spend we identified through the Allocation is hitting 80% of the budget.</p><p>Once more, it’s pretty straight-forward:</p><p>restish dci create-budget &lt; budget_conf.json</p><p>and the budget_conf.json looks as follows:</p><pre>{<br>    &quot;name&quot;: &quot;luca+test - Monthly Budget&quot;,<br>    &quot;scope&quot;: [&quot;&lt;ALLOCATION_ID&gt;&quot;],<br>    &quot;amount&quot;: 1000,<br>    &quot;type&quot;: &quot;recurring&quot;,<br>    &quot;timeInterval&quot;: &quot;month&quot;,<br>    &quot;startPeriod&quot;: $(( $(date -u -v1d -v0H -v0M -v0S +%s) * 1000 )),<br>    &quot;currency&quot;: &quot;USD&quot;,<br>    &quot;alerts&quot;: [{&quot;percentage&quot;: 80}],<br>    &quot;collaborators&quot;: [<br>        {<br>            &quot;email&quot;: &quot;&lt;user_email&gt;&quot;,<br>            &quot;role&quot;: &quot;owner&quot;<br>        }<br>    ]<br>}</pre><p>A couple of things worth noting here:</p><ul><li>The startPeriod value should be expressed in seconds since epoch. I’ve included in the configuration file the command on how to extract that.</li><li>You can have multiple alerts set at different percentage thresholds: in this case, we have limited ourselves at one.</li></ul><p>Running the command results in a successful response</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*h-ketwUPT2MbGtzgTDgbRw.png" /><figcaption>no more surprises!</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*B9g_u7z-8FYmwaatYYgIhg.png" /><figcaption>The WebUI shows the tracked data and relative thresholds</figcaption></figure><p>This concludes my initial exploration of the DoiT Cloud Intelligence CLI, but sky is the limit. Imagine combining these steps into an onboarding script!</p><p>Maybe that’s a great idea for another blog. In the meantime get the <a href="https://help.doit.com/docs/cli">DoiT Cloud Intelligence CLI installed</a> and do not hesitate to reach out to us for any support.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d698fa7737e3" width="1" height="1" alt=""><hr><p><a href="https://engineering.doit.com/streamline-cloud-management-via-doit-cli-d698fa7737e3">Streamline Cloud Management via DoiT CLI</a> was originally published in <a href="https://engineering.doit.com">DoiT</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>