ProxySQL in Front of AWS RDS & Aurora MySQL — Part 1: Why and Where to Place It

https://reliadb.com/images/og-default.png

At 14:32 on a Tuesday, a writer failover hit an Aurora MySQL cluster in production. Aurora did its job: within about 30 seconds, a reader had been promoted, the cluster endpoint had been updated, and replication was running in reverse. From the database’s perspective, the failover was clean.

From the application’s perspective, it was messy. The reader endpoint kept serving connections — sort of. For roughly 60 seconds, a portion of connections returned ETIMEDOUT, others silently fetched data from a replica that was still several seconds behind the new writer, and the connection pool on the now-promoted writer climbed past 900 as every idle connection in every app tier tried to reconnect simultaneously. No data was lost. The failover was technically successful. But that 60-second window caused real downstream pain: cache misses, stale reads that bypassed business-logic checks, and an alert storm that took another 20 minutes to quiet.

AWS managed MySQL is genuinely excellent at operating a database. It handles patching, replication, storage scaling, and failover without you touching the binaries. What it does not do — and was never designed to do — is solve the proxy layer. That problem is still yours.

This five-part series is about exactly that problem: deploying ProxySQL in front of RDS and Aurora MySQL, from the first architectural decision all the way to operating it in production. Part 1 is conceptual. It covers the why, the where, and the decision framework. No shell commands here — those start in Part 2.

WHAT YOU’LL BUILD: A production-representative ProxySQL topology sitting in front of Aurora MySQL — connection multiplexing, read/write splitting with query-level rules, a ProxySQL Cluster for config HA, and Aurora-native topology discovery. The same lab topology runs unchanged across all five parts so you can follow each step end-to-end.

The Problem with RDS and Aurora Endpoints Alone

Before reaching for any proxy, it’s worth naming the specific problems you’re trying to solve. RDS and Aurora expose several endpoint types — cluster endpoint, reader endpoint, instance endpoints — and they cover a lot of ground. But each has a hard limit that surfaces when your workload grows or your topology changes under pressure.

The Aurora Reader Endpoint and Its Limits

The reader endpoint distributes connections across all reader instances in the cluster via DNS-based round-robin. It works, and for many workloads it’s entirely sufficient. The limits emerge when you need more than "roughly even distribution."

The first limit is routing intelligence: it has none. The reader endpoint routes TCP connections, not SQL. It doesn’t know what query is being sent. You can’t direct long-running analytics queries to a larger reader instance while keeping the smaller one for OLTP reads. Every connection gets identical treatment regardless of what it does next.

The second limit is failover behavior. When Aurora promotes a reader to writer, the cluster endpoint updates within seconds. The reader endpoint takes longer to settle because it reflects the current set of available readers, and clients that already have a DNS answer are holding a cached TTL. Depending on your connection pool’s DNS TTL handling and JVM settings, reads can land on the old writer — now a reader — or on replicas that haven’t fully caught up to the new writer’s binlog position yet. Two consecutive reads in the same application session can hit different replicas with different replication lag, which produces read-your-own-writes violations that are difficult to reproduce and infuriating to debug in production.

RDS Multi-AZ: HA You Can’t Read From

RDS Multi-AZ keeps a synchronous standby in a separate Availability Zone. That standby absorbs the failover cleanly — RDS flips the CNAME, the old primary becomes the new standby, and writes resume. It’s a solid HA story.

The limitation is that the standby is not readable. You pay for a full second instance — same CPU, same memory, same storage class — and get exactly zero read capacity in return. All read traffic still runs through the primary. If your goal is to distribute read load, Multi-AZ does nothing for you.

The failover experience also has a rough edge. The DNS flip typically takes 60–120 seconds to propagate through resolver caches. During that window, apps that don’t aggressively detect dead connections will queue or block against the old endpoint. Connection pools configured with long keepalive intervals or no TCP keepalive will sit on dead sockets without noticing. And there’s no graceful drain — in-flight transactions die the moment the standby promotes. Any retry logic is entirely on the application side.

The Connection Multiplexing Gap

Every client connection to RDS or Aurora is a real MySQL thread on the backend server. There’s no pooling at the managed endpoint layer. A single connection pool with 500 connections means 500 threads on the writer, each holding allocated memory, regardless of whether any of them are actively executing a query at that moment.

This matters at steady state, but it bites hardest during recovery. After a failover, all connections across all your app tiers try to reconnect at roughly the same moment — the thundering herd. Aurora’s max_connections is derived from the instance class: a db.r6g.large supports around 1,000 connections. Three app tiers with 200 connections each, plus monitoring tools and any administrative overhead, and you’re approaching that ceiling before the reconnect storm hits. The instinctive response — upsize the instance — is expensive and doesn’t change the underlying reconnect pattern.

No Query-Level Intelligence at the Endpoint Layer

The RDS and Aurora endpoint layer is connection-aware, not query-aware. Once a TCP connection is established, what travels over it is invisible to AWS. This means you have no mechanism at the managed layer to block a SELECT * without a WHERE clause from a poorly-written ORM, mirror production traffic to a staging replica to validate a schema change under real load, throttle an analytics query that’s crowding out OLTP reads, or enforce per-application connection limits so one service can’t exhaust the pool for everyone else. These are DBA problems. The managed endpoint layer doesn’t solve them, and it’s not going to.

SYMPTOMS YOU’VE PROBABLY SEEN: Thundering herd on the writer immediately after failover as all connection pools reconnect simultaneously. Stale reads surfaced by a sticky-session bug when a load balancer pins a user to a lagging replica. Connection storms during blue-green deploys when both environments briefly hold a full connection pool against the same writer endpoint.

What ProxySQL Gives You (in 90 Seconds)

ProxySQL is a MySQL-protocol proxy. It sits between your application and your MySQL backends, speaking the MySQL client/server protocol on both sides — the application thinks it’s talking to MySQL directly, and the MySQL backends think ProxySQL is just another client. Nothing changes at either end. You don’t modify your driver, your connection string format (beyond hostname and port), or your SQL. The proxy layer is fully transparent to the application.

What changes is what happens in the middle.

The three-layer config model is the first thing to internalize, because it’s unlike every other proxy you’ve probably used. ProxySQL maintains three distinct layers: MEMORY (a staging scratchpad), RUNTIME (the live, actively-used configuration), and DISK (the persisted sqlite3 database). You stage changes in MEMORY, validate them, then explicitly promote to RUNTIME with a LOAD ... TO RUNTIME command. You persist to DISK separately with SAVE ... TO DISK. There’s no config file reload, no signal to send, no service restart. Changes are atomic and deliberate by design.

Hostgroups are ProxySQL’s abstraction over backend servers. You assign each MySQL instance to a hostgroup — writer in HG 10, readers in HG 20 — and ProxySQL handles routing between them. It monitors backend health by polling read_only on standard MySQL replication. For Aurora clusters, Part 2 will show how mysql_aws_aurora_hostgroups tells ProxySQL to query INFORMATION_SCHEMA.REPLICA_HOST_STATUS instead, giving it true Aurora-native topology awareness that survives Aurora-specific failover events.

Query rules map SQL patterns to hostgroups. A rule matching ^SELECT routes reads to HG 20; a rule matching ^SELECT.*FOR UPDATE sends locking reads to HG 10. Rules can be stacked, prioritized, weighted, and scoped by user or schema. Part 3 covers query rules in depth — the point here is that routing happens per statement, not per connection.

Connection multiplexing lets N frontend connections share M backend connections, where M is much smaller than N. ProxySQL tracks per-session state — autocommit status, active transactions, SET variable assignments, temporary tables, advisory locks — to determine when a backend connection is safe to hand to a different frontend client. For workloads with many idle or short-lived connections, this can collapse backend thread counts by an order of magnitude.

Query mirroring clones traffic from the production hostgroup to a secondary hostgroup — a staging replica, a new Aurora cluster version, a read replica under evaluation. Mirrored queries are fire-and-forget: results are discarded, application latency is unaffected, and the calling code never knows the traffic was duplicated. It’s the cleanest way to validate infrastructure changes under real production query patterns without touching the critical path.

Native MySQL protocol means no driver changes and no protocol translation overhead. Applications see ProxySQL as a standard MySQL endpoint; the authentication handshake is transparent. If you’ve used pgBouncer for PostgreSQL connection pooling, ProxySQL multiplexing solves the same connection-count problem at the MySQL protocol layer — but with per-statement query awareness layered on top.

Placement Options on AWS

Where you deploy ProxySQL on AWS is the most consequential architectural decision in this series. Get it wrong and you’ll be managing config drift, single-AZ blast radius, or hidden latency for as long as the deployment lives. There are four viable patterns, each a legitimate choice, and none universally correct.

App-Side Sidecar (Per-EC2 or Per-ECS Task)

In the sidecar pattern, a ProxySQL process runs on every application server or alongside the application container in every ECS task. The app connects to 127.0.0.1:6033 — a loopback address. There’s zero extra network hop between the application and the proxy. For latency-sensitive workloads where even sub-millisecond overhead matters, this is the right answer.

The operational challenge matches the latency advantage: you now have N ProxySQL instances to keep aligned. If your fleet has 40 EC2 instances and you push a query rule change, that change needs to land on all 40 — or you’ll have instances routing traffic differently from each other, in a way that’s hard to reproduce during an incident. Config drift across instances is the primary failure mode of this pattern. It doesn’t surface immediately; it bites you three months later when you discover eight instances are running a config from six weeks ago.

You can manage this cleanly with automation: ProxySQL config delivered via SSM Parameter Store and applied at instance launch, AWS AppConfig for runtime pushes, or Ansible/Chef. Without that automation in place before you adopt this pattern, the pattern will work against you. AZ resilience is inherited from your application tier — if your app runs across three AZs, so do your sidecar ProxySQL instances.

Best for: teams with mature, tested config automation; workloads where sub-millisecond proxy latency matters; single-application environments connecting to a single cluster.

Centralized Fleet Behind NLB

In the centralized pattern, two or more ProxySQL EC2 instances run in an Auto Scaling Group in private subnets, fronted by an AWS Network Load Balancer. Applications point at the NLB DNS name. The NLB handles health checks and distributes incoming TCP connections across the ProxySQL fleet.

The latency addition is real but small: an NLB in the same Availability Zone as the application typically adds under 0.5ms of round-trip time. Cross-AZ adds 1–2ms. For the vast majority of database workloads — even high-frequency OLTP — this is noise that won’t appear in your P99 latency graphs.

The operational win is significant: one config surface for every application connected to the database layer. Push a query rule change to two ProxySQL instances and every application sees it within seconds, with no per-host coordination. Rolling upgrades work cleanly via ASG instance refresh — drain one node, upgrade, re-add, repeat. The risk is blast radius: a misconfiguration that reaches RUNTIME on a centralized fleet affects all applications simultaneously. Mitigate this with a promotion discipline: apply to MEMORY on one node, smoke-test, then promote across the fleet. Part 5 covers a practical runbook for this.

Best for: environments with multiple applications sharing the same cluster; ops teams who want a single "database layer" to reason about; teams without mature per-host config automation.

Kubernetes Sidecar (EKS)

On EKS, the sidecar pattern maps naturally to Kubernetes: ProxySQL runs as a container in the same pod as the application container, sharing the pod’s network namespace. The app connects to localhost:6033 — same zero-hop benefit as the EC2 sidecar.

Configuration arrives via a ConfigMap or Secret, with ProxySQL reloading on change via an init container, a lifecycle hook, or a purpose-built controller. The proxy lifecycle is tied to the pod: when a pod scales up, a new ProxySQL instance comes with it; when the pod terminates, so does the proxy. No orphaned state to clean up.

One metric demands attention from the start: the connection count arriving at Aurora. At 500 application pods with a ProxySQL sidecar each holding ~10 backend connections after multiplexing, you can land 5,000 MySQL threads on the writer. Multiplexing helps inside each sidecar — it doesn’t help across them. Aurora’s max_connections sees those 5,000 threads regardless of where they originate. Size your multiplexing configuration and your Aurora instance class together, and monitor max_connections headroom continuously.

Best for: EKS-native shops already running the sidecar pattern; environments where the application deployment model should own the proxy lifecycle.

Dedicated ProxySQL Cluster Pair

Two ProxySQL instances configured as a ProxySQL Cluster, placed in separate Availability Zones, fronted by an NLB or round-robin DNS. This is what this series builds in the lab, and it’s the pattern we recommend for most production MySQL deployments.

The defining capability is automatic config synchronization. Configure the two nodes as a cluster via the proxysql_servers table, and any runtime config change applied to either node — new query rules, backend changes, user additions, global variable updates — propagates to the peer automatically, typically within a few hundred milliseconds. You apply a change once, and both nodes converge. No per-host coordination, no push scripts, no drift.

The upgrade story is clean: remove one node from NLB rotation, upgrade its ProxySQL binary, reconnect, then do the same for the second node. You never take the proxy layer entirely offline. AZ resilience comes from placing the two nodes in different Availability Zones — if one AZ becomes unavailable, the NLB routes all traffic to the surviving node.

This is the topology the lab runs throughout this series. Part 4 covers the complete HA and failover story for this pattern, including NLB health check configuration and Aurora-specific event handling.

Deployment Model Latency Add Config Sync Upgrade Path AZ Resilience Best For
App-side sidecar 0 ms Per-host automation required Rolling per instance Inherits app tier spread Low-latency, single app, mature config automation
Centralized + NLB < 0.5 ms intra-AZ Centralized (one config surface) ASG instance refresh Multi-AZ ASG + NLB Multi-app environments, ops-centric teams
K8s sidecar (EKS) 0 ms ConfigMap / Secret push Rolling pod restart Inherits pod spread EKS-native teams, pod-lifecycle ownership
Dedicated cluster pair < 0.5 ms intra-AZ Auto-sync via proxysql_servers Rolling node-by-node, zero downtime 2 nodes in different AZs Production default; this series’ model

ProxySQL Cluster: Why You Always Run Two Nodes

A single ProxySQL node is a single point of failure in two distinct ways, and both matter.

The first is the obvious one: one node means one traffic failure point. If that instance goes down — kernel panic, OOM kill, network partition, or emergency maintenance — your application loses the proxy layer entirely. You could re-point apps directly at Aurora as a fallback, but that immediately eliminates the routing rules and multiplexing configuration your application has been relying on.

The second failure mode is less obvious: a single ProxySQL node is also a single point of config change failure. If you apply a config change that breaks routing and need to roll it back immediately, you need the node to be responsive. If the problem is the node itself, you have nothing to fall back to.

Two nodes in a ProxySQL Cluster solve both problems. The proxysql_servers table on each node lists the other as a peer. When you apply a config change — any LOAD ... TO RUNTIME paired with SAVE ... TO DISK — ProxySQL propagates that change to all configured peers automatically. What syncs between peers: mysql_servers, mysql_users, mysql_query_rules, and global_variables. Each node maintains its own disk state; cluster sync operates at the runtime layer only. When a new node joins, it auto-bootstraps from existing peers — given a populated proxysql_servers table and matching cluster credentials, the new node fetches the latest runtime config from the peer with the highest epoch on startup. The disk file is local; the cluster state is recoverable.

In the lab for this series, proxysql-1 at 192.168.105.7 and proxysql-2 at 192.168.105.8 are configured as a cluster and propagate changes at approximately 200ms under normal conditions. Smoke test 04-cluster-sync.sh validates this by applying a config change to proxysql-1 and verifying it arrives on proxysql-2 before timing out. Part 4 adds the NLB health-check configuration and Aurora-specific failover hooks that complete this foundation.

Alternatives: When Not to Use ProxySQL

ProxySQL adds a component to your infrastructure that requires operational attention — upgrades, monitoring, understanding failure modes, training the team. Before committing to it, it’s worth being honest about whether you actually need what it provides. Several alternatives are simpler, and the right call for many RDS/Aurora environments is not ProxySQL.

The Aurora Reader Endpoint Alone

If your read workload is uniform — all reads have roughly the same profile, target the same tables, and don’t require per-query routing — the Aurora reader endpoint is likely sufficient. It distributes connections across readers, integrates with Aurora’s native topology discovery, and costs nothing to operate beyond the reader instances themselves. The ~30–60s failover window is acceptable for most applications if the connection pool has sensible retry logic and a short TCP keepalive.

If the reason you’re looking at ProxySQL is that the reader endpoint does round-robin and you want "smarter" distribution, stop and ask whether the routing problem is real. If your readers are the same instance class and the load is uniform, round-robin is close to optimal. Adding ProxySQL for that case alone is operational overhead solving a problem that doesn’t exist.

HAProxy or NLB Alone

HAProxy is battle-tested, handles high connection rates efficiently, and is simpler to operate than ProxySQL. For MySQL, it works at Layer 4: it routes TCP connections, not SQL queries. You can configure health checks against the MySQL port and distribute connections across backend pools, but routing decisions are based on the connection, not the query traveling over it.

If your only need is to spread connections across multiple read replicas with no SQL-layer intelligence, HAProxy or an NLB with IP target groups is a reasonable choice. You give up multiplexing, query rules, and the query digest, but if you don’t need those features, you also avoid the complexity of maintaining them. This is a legitimate trade-off, not a compromise.

RDS Proxy

RDS Proxy is AWS’s managed connection pooler for RDS and Aurora. It handles pooling at the managed layer, integrates with IAM authentication and AWS Secrets Manager for credential rotation, and requires no infrastructure to provision or maintain. For teams that want connection pooling without running their own proxy fleet, it’s worth evaluating seriously.

RDS Proxy added read/write splitting via session-aware routing in 2024, so the basic split is solved. The gap relative to ProxySQL sits in everything beyond that. As of mid-2026, RDS Proxy does not support user-defined query routing rules — you can’t write a rule that sends a specific query pattern to a specific instance. It doesn’t support query mirroring. It doesn’t support query rewriting. The per-statement observability that ProxySQL exposes via stats_mysql_query_digest has no equivalent. And the pricing model — charged per vCPU of the underlying database instance — becomes meaningful at scale.

Feature RDS Proxy ProxySQL
Query routing rules No Yes — regex/digest, per-user, per-schema
Connection multiplexing Yes (managed, opaque) Yes (configurable, observable)
Query mirroring No Yes
Per-statement query digest No Yes (stats_mysql_query_digest)
IAM authentication Yes (native) No (requires workaround)
Operational overhead Low — fully managed Medium — self-managed fleet
Cost model Per vCPU of DB instance EC2 instance + NLB (~$16–20/mo)

Connector-Side Load Balancing

MySQL Connector/J’s replication protocol, the AWS JDBC Driver’s reader/writer splitting, and similar connector-side solutions route queries at the application layer. The driver inspects whether the current context is read-only and routes accordingly. This works — and it works without any proxy infrastructure.

The trade-off is that routing policy lives in application code. If you have five services connecting to the same Aurora cluster and you want to change which queries go to readers, you need to update five codebases and deploy five services. There’s no central audit trail, no place to add a rule that captures all traffic regardless of which service is sending it, and no way for the database team to adjust routing without going through a development cycle. For stable, simple routing that genuinely never changes, this is fine. For anything more dynamic, it’s the wrong layer to own the policy.

The honest summary: if your workload is simple and stable, RDS Proxy or connector-side routing covers the common case with significantly less operational overhead than ProxySQL. ProxySQL is the right tool when you need SQL-layer control that neither of those options provides — and when you’re willing to own the operational cost that comes with it.

Running RDS or Aurora MySQL and feeling the limits?

ProxySQL setup and tuning is one of the most impactful changes a DBA can make for a scaling MySQL environment. If you want expert guidance on placement, query routing, or failover design before committing to an architecture, book a free assessment call.

Book Free Assessment →

The Lab Topology You’ll See Across This Series

TESTED ON LIVE VMs: All configurations and outputs across this series come from a Lima VM lab running on macOS — MySQL 8.0.41 managed by dbdeployer (master + 2 replicas), ProxySQL 2.7.3 (two-node cluster), end-to-end smoke-tested before publication. Four smoke tests cover read/write split, replica shunning, multiplexing, and cluster config sync.

Every part of this series builds on the same four-VM lab. Understanding the topology now means you won’t need to re-orient each time a new part adds configuration on top of it.

                    ┌──────────────────┐
                    │    client-vm     │
                    │  192.168.105.9   │
                    │ sysbench / mysql │
                    └────────┬─────────┘
                             │  MySQL protocol :6033
               ┌─────────────┴─────────────┐
               │                           │
  ┌────────────▼──────────┐   ┌────────────▼──────────┐
  │      proxysql-1       │◄──►│      proxysql-2       │
  │   192.168.105.7       │   │   192.168.105.8       │
  │   ProxySQL 2.7.3      │   │   ProxySQL 2.7.3      │
  │   HG 10: writer       │   │   HG 10: writer       │
  │   HG 20: readers      │   │   HG 20: readers      │
  │   admin :6032         │   │   admin :6032         │
  └────────────┬──────────┘   └────────────┬──────────┘
               │    ProxySQL Cluster sync   │
               │         (~200 ms)          │
               └─────────────┬─────────────┘
                             │  MySQL protocol
                    ┌────────▼─────────┐
                    │  mysql-backends  │
                    │  192.168.105.6   │
                    ├──────────────────┤
                    │ master   :25001  │  ← HG 10 (writer)
                    │ replica1 :25002  │  ← HG 20 (reader)
                    │ replica2 :25003  │  ← HG 20 (reader)
                    └──────────────────┘
VM Name IP Role Services
mysql-backends 192.168.105.6 MySQL master + 2 replicas mysqld ×3 (ports 25001 / 25002 / 25003)
proxysql-1 192.168.105.7 ProxySQL 2.7.3 (primary) proxysql :6032 (admin) :6033 (app)
proxysql-2 192.168.105.8 ProxySQL 2.7.3 (cluster peer) proxysql :6032 (admin) :6033 (app)
client-vm 192.168.105.9 Client / load generator mysql-client, sysbench

PRODUCTION SUBSTITUTION: In the lab, all three MySQL backends run on a single VM managed by dbdeployer — three mysqld processes on different ports on the same host. In production, you’d replace those three endpoints with your Aurora cluster’s individual instance endpoints (not the cluster endpoint or reader endpoint), or your RDS writer endpoint plus read replica instance endpoints. ProxySQL 2.7.3 is binary-compatible with Aurora MySQL 2, which tracks the 8.0.x lineage. Part 2 makes this substitution concrete: we connect to a real Aurora cluster and configure mysql_aws_aurora_hostgroups for Aurora-native topology discovery.

Should You Put ProxySQL in Front of Your RDS/Aurora?

Before spending time on the rest of this series, work through these six questions honestly. They’re designed to help you make the right call, not to steer you toward ProxySQL.

  • Do you need per-query routing rules — sending analytics queries to a dedicated replica, blocking specific patterns from reaching the writer, routing by schema or user context? ProxySQL is the only option in the RDS/Aurora ecosystem that gives you this at the proxy layer, independent of application code.
  • Do you need to mirror production traffic to a staging or canary endpoint without modifying application code? ProxySQL query mirroring is the cleanest path. No alternative in this space provides it.
  • Do you need to throttle, queue, or reject specific query patterns at the infrastructure layer rather than the application layer? ProxySQL query rules with max_connections_per_user, error injection, or active/passive rule switching handle this without a code deploy or application-team involvement.
  • Are you hitting Aurora’s max_connections ceiling on the writer and the instinct to upsize the instance isn’t solving the pattern — either because cost is prohibitive or because connection count scales with pod/instance count? ProxySQL multiplexing is the right lever. It collapses hundreds of idle application connections into a fraction of that number on the backend, without changing any application code.
  • Is your only requirement to spread reads across the Aurora reader endpoint, with no routing rules, no per-query control, and no multiplexing tuning? The reader endpoint handles this natively. Adding ProxySQL for this case alone is overhead in search of a problem.
  • Is your only requirement basic read/write split with no custom routing? Try RDS Proxy or a connector-side driver first. They provide this capability with less operational overhead than a self-managed ProxySQL deployment, and they’re easier to hand to a team that hasn’t run ProxySQL before.

If you answered yes to any of the first four, ProxySQL is worth the investment. If your situation fits only the last two, the simpler option is probably the right one. ProxySQL adds a real operational component — a binary to upgrade, a config layer to understand, failure modes to train for. That overhead pays for itself when the workload demands what ProxySQL provides. It doesn’t pay for itself when you just need round-robin reads.

What’s Next: Wiring ProxySQL to Aurora MySQL

In Part 2, we move from architecture to configuration. We’ll connect ProxySQL to a real Aurora MySQL cluster using mysql_aws_aurora_hostgroups — the Aurora-native table that directs ProxySQL to query INFORMATION_SCHEMA.REPLICA_HOST_STATUS for topology discovery, rather than relying on the read_only polling used for standard MySQL replication. With this configuration, ProxySQL auto-discovers the writer and all reader instances, adapts when Aurora promotes a reader during a failover event, and routes traffic correctly through the cluster-level changes that would trip up a replication hostgroup configured for vanilla MySQL. The lab and production configurations live side by side throughout so you can follow both paths.

M

Mario — ReliaDB

ReliaDB is a specialist DBA team for PostgreSQL and MySQL performance, high availability, and cloud database optimization. More about ReliaDB →

Planet for the MySQL Community

How to Safely Start Rock Climbing 

https://i0.wp.com/s3.amazonaws.com/images.gearjunkie.com/uploads/2026/04/shutterstock_1118291951.jpg?w=700&ssl=1

(Photo/Shutterstock)

To thrive and survive outdoors, safety starts the minute you get behind the wheel. Don’t overlook the first, and most critical, rule of the road: Put on your seat belt. Beyond the drive there, an accident-free first climb up a destination crag comes down to etiquette and execution.

Planning and preparation matter, whether the route is in your backyard or at the end of an epic road trip. Here are a few best-practice reminders on how to be a good steward, plus safety keys for moving your rock climbing outdoors, and then coming home alive.  

Gym-to-Crag Safety Tips for an Accident-Free First Climb

Practice cleaning anchors: Most crag-ccidents happen not during the climb, but during the descent. Learn to clean sport anchors without untying yourself from the rope.

Do your checks: Outside, distractions abound — as do half-finished knots. Check each other right before leaving the ground. (And exchange an obligatory fist bump.) 

Come up with a code: On long climbs, you might not be able to hear your partner. Establish a system — i.e, three tugs on the rope means “lower” — ahead of time.

Knot your ends: Tie a barrel knot in each end of the rope before climbing. That way, if your route is longer than it looks, the rope won’t come zipping through the belay device.  

Stand close: Outdoor whippers happen fast. Stand close to the wall while lead-belaying, and spot your partner up to the first bolt. Remember the key to hand-positioning shape when spotting: spoons, not forks.

(Photo/Shutterstock)

Responsibility Reminders 

Leash your pup. Canine companions aren’t as rockfall-aware as we’d like them to be. Make sure your doggo is leashed, especially when your hands are full belaying. 

Share the route. Feel free to bring your whole crew, but be mindful of other groups. Offer to share ropes or let other climbers work in. 

Turn down the volume. We know you have great taste, but some climbers find music distracting. Ask your neighbors before you crank the T-Swift. 

Climbing Tips for Deeper Trips 

Watch your noggin. Helmets are always a good idea, but they become a must when you’re leading in remote environments. 

Respect the local ethic. Every crag has its rules when it comes to ticking holds, bolting, leaving draws, and stashing gear. Check with locals before you make yourself at home.

Pack it out. In places without a ton of moisture, buried deposits don’t decompose. If you’re climbing in an alpine or desert environment, Wag Bag your waste. 

 — See more in The Safety Detail, our film series and full activity guide to surviving and thriving outdoors. 


This article is sponsored by NHTSA: Click It or Ticket. 

GearJunkie

UW DubHacks Next startup incubator produces 20 new student ventures in latest batch

https://cdn.geekwire.com/wp-content/uploads/2026/05/dubhacks-2048×1476.jpg

DubHacks Next Batch 5 founders at Demo Day on May 7 at the University of Washington. (DubHacks Photo)

Senior engineers are retiring faster than companies can replace them, creating a widening expertise gap in industries from aerospace to nuclear energy. 

Hera, a project developed by University of Washington students, is aiming to address the issue with technology that automates the design of parts that meet safety and industry rules, a process that normally requires many years of knowledge and experience. 

The product is timely, as 1.9 million manufacturing jobs are expected to go unfilled in the $2.3 trillion sector by 2033, according to Deloitte.

“Hera answers design questions 10-times faster than a senior engineer,” said Meera Patel, co-creator of Hera. “Once it knows the drawing can be manufactured, it pulls data from all your machines and gives you an exact production plan.”

That’s one of several problems University of Washington students tackled through DubHacks Next, a 16-week startup incubator. On Thursday, May 7, student founders pitched 20 startups hoping to turn their ideas into viable companies.

Since 2022, DubHacks Next has spurred 68 startups and at least 25 active companies. Participants get access to free workshops, mentorship sessions, customer discovery meetings and networking with potential investors. 

This year’s batch of 20 startups includes AI salon receptionists, a student subleasing platform and an emotional recovery app. 

“I’ve never had the experience of building such a large-scale idea and bringing it to life,” said William Pantel, co-developer of Catalvst, an AI audio plugin builder. 

The incubator’s past projects have raised more than $5 million collectively, with alumni going on to join accelerators such as Y Combinator and Techstars or land jobs at major tech companies. 

Starting this year, students could apply to join the Pack Ventures portfolio, including $50,000 up front and $150,000 when another firm buys in. 

Hera co-creators Meera Patel and Noelle So pitch their manufacturing automation tool at DubHacks Next Demo Day. (DubHacks Photo)

Patel and Hera co-creator Noelle So are among the students working with Pack. The demo is now live in three production plants, Patel said.

Here are more standouts from this year’s batch:

Chameleon: For the 1.3 billion people living with disabilities worldwide, nearly 96% of the internet’s top homepages are considered inaccessible. Enter Chameleon, an AI-powered web accessibility tool suite.

The suite includes a Chrome extension with tools like focus rulers, voice commands and head-tracking controls for accessible web navigation on any site, say co-founders Aditya Shirodkar and Ajit Mallavarapu.

“Especially with vibe coding, people are quick to develop software and don’t think about accessibility needs,” Shirodkar told GeekWire. “It’s a silent barrier that isn’t really addressed.” 

Chameleon is entering a market with growing need – and financial opportunity. The global digital accessibility market is estimated at $1.8 billion, and is projected to reach $3.2 billion by 2034, according to Straits Research. 

“It’s not just about making something cool,” Mallavarapu said. “It’s about making something people will actually use every day.”

Iris: Sthiti Patnaik and Saachi Dhamija focused on another technological headache: spreadsheets. 

Universities often rely on sprawling spreadsheets to track alumni for fundraising, networking and event planning, but records quickly become outdated and difficult to search. With Iris, alumni associations and other groups can more easily maintain member databases. 

“We ingest their spreadsheet, then present it in a more visual format with bubbles and graphs,” Dhamija told GeekWire. 

Along with data enrichment and interactive visual mapping for organizers, Iris helps members discover one another through shared experiences and interests. Patnaik, a recent graduate and managing director for DubHacks Next, hopes the solution will help her stay connected to other founders.

“All of our alumni go on to do really fantastic things, such as raise money, start their own startups, or work at really great companies,” she said.

After presenting Iris, Patnaik and Dhamija landed a design partnership with Pack Ventures.

Catalvst: For Aaron Li and William Pantel, the incubator became a launching pad for Catalvst, what may be the first-ever AI audio plugin builder.

High-end audio plugins – software tools that shape and manipulate sound – can cost music producers hundreds or even thousands of dollars. Li, who began producing EDM three years ago, said software costs have delayed his progress.

“I remember working all summer just to save up,” he said. “It’s a domino effect. You get one piece of software, and realize there’s another one you need that’s super expensive.”

With Catalvst, users can describe the sound they want in plain language and generate downloadable, working audio software in under a minute.

“If you’re like, ‘I want my songs to sound like I sing them in a cathedral,’ it’ll create software that makes your song sound like that,” Pantel said.

The founders distinguish their product from AI-generated music platforms, emphasizing that their goal is to empower human creators rather than replace them. They’re currently beta testing with music producers to refine the product and grow its user base.

“We’re using AI to build tools human producers can use,” Pantel said. 

Applications for the incubator’s sixth batch open this fall.

Other Batch 5 startups:

  • BeamBell: AI salon receptionist | Arvin Hakakian, Anant Dhokia, Aur Shalev Merin
  • Clearlobby: Legislative lobbying workspace | Shruthika Balasubramanian
  • Healr: Emotional recovery app | Advait Raman
  • HeartBeats: Music mixing for exercise | Hriesha Popat
  • Intently: Agentic product management | Ronald Luong
  • Leasee: Student-to-student subleasing | Sanjana Satagopan, Annika Chan
  • madr: Campus life app | Abraham Gibson, Azim Memon, Keshav Kalia
  • MindMark: Resource tracking tool | Chandana Robba
  • nomad: Travel social media app | Rahul Bonthu
  • nomi: Roommate management app | Anika Rao, Taj Khandekar, Nandini Sinha, Tharika Jayaraj, Aditi Agarwal, Sophia Zhang
  • Qualty: E2E agentic testing | Jove Pendapotan, Reuben Santoso, Samuel Purnama
  • Query: Q&A tool for live events | Saachi Surana, Shreya Pandey
  • Scout: Camping app | Aditi Agarwal, Anika Rao
  • sparks: Modest fashion shopping | Aleeza Bhatti, Zahra Taher
  • Wallzy: Credit card rewards app | George Evans Daenuwy, Kezia Joesoef, Patrick Wijaya, Calista Vidianto
  • Zither: Spatial web and file browser | Alexander Zhu

GeekWire

Dolt 2.0

https://static.dolthub.com/blogimages/dolt-2.0-featured.webp/8b951383196a6d74cf2de65ab91afcff56d059907ed7b8516d36ebaa8af5a4b1.webp

Three years ago, we announced Dolt 1.0, signalling that Dolt was ready for production workloads. We haven’t stopped improving the world’s first and only version-controlled SQL database. Today, we are excited to announce Dolt 2.0.

Dolt 2.0

What Did Dolt 1.0 Mean?#

Dolt 1.0 meant four things:

  1. Forward Storage Compatibility
  2. Production Performance
  3. MySQL Compatibility
  4. Stable Version Control Interface

Dolt 2.0 maintains the promises of Dolt 1.0. Dolt 2.0 improves on the performance and correctness metrics established in Dolt 1.0.

What Does Dolt 2.0 Mean?#

Dolt 2.0 also means four things:

  1. Automated Garbage Collection on by Default
  2. Archive Compression on by Default
  3. Faster than MySQL on sysbench
  4. Beta Vector Support
  5. Adaptive Storage

Unlike Dolt 1.0, Dolt 2.0 is fully backwards compatible with all Dolt 1.0 versions. No storage migration using dolt migrate is required. Let’s dive into the details of each of these points.

Garbage Collection#

Dolt makes a lot of disk garbage, especially during import. Dolt is copy-on-write so all intermediate committed transaction state is preserved to disk. Any intermediate state that is not in a Dolt commit is garbage and can be collected.

Garbage

Dolt already must preserve all history in the commit graph on disk. Adding extra garbage can eat through your disk very quickly.

Dolt 2.0 has automatic garbage collection on by default, meaning most users don’t have to care about disk garbage. Many users have been running in this mode for over a year. We’re confident it is stable.

Dolt 2.0 databases do not require extra garbage maintenance, just like other modern SQL engines.

Archives#

Following on the disk space theme, we also have a new on disk format we call archives that can reduce Dolt’s storage footprint by an additional 30-50%. Archives use dictionary compression to de-duplicate storage in the deepest layers of Dolt, saving even more disk space.

As with automatic garbage collection, archives have been the default format for new Dolt databases for months. We’re confident the format is stable and delivers real disk space wins.

Dolt 2.0 databases are kind to your disk with automatic garbage collection and archives. Version control already requires more disk space than traditional databases. Dolt 2.0 preserves that disk for your data’s history.

Faster than MySQL on sysbench#

We’ve long used the industry standard sysbench to measure and benchmark the latency of simple SQL queries in Dolt. We started at about 10X slower on reads and 20X slower on writes than MySQL. We’ve worked tirelessly to improve Dolt’s performance and we are now 13% faster than MySQL on writes and 5% faster on reads, averaging out to 8% faster than MySQL on sysbench style workloads.

Dolt 2.0 databases deliver real production database performance coupled with version control functionality.

Beta Vector Support#

We announced vector index support early last year. We have a much bigger challenge than traditional databases with vector indexes because our vector indexes must be version-controlled. We’ve done the hard computer science to achieve this. We adopted the Vector type from MariaDB in September 2025.

Dolt 2.0 databases have Beta vector support. Dolt is the only database where your vectors are version-controlled. We still have some edge cases on the read query path where a vector index should be used but it is not. Closing these gaps will reove the Beta tag from Dolt’s vector support.

Adaptive storage for large column types#

Borrowing from our Doltgres adaptive storage work to support TOAST types, we’re excited to announce Dolt 2.0 has adaptive storage.

For large column types like TEXT, BLOB, and JSON, databases generally store the value “out of band”, as a file on disk with a pointer to the file in the actual table structure. A different strategy, popularized by Postgres, is to examine the size of the value and store small values in the table structure while preserving the files and pointers strategy for large values. This strategy allows the user to be less disciplined about sizing VARCHAR columns and just use TEXT instead. It’s also a big performance win for these types when the values are small.

Dolt 2.0 has adaptive storage making MySQL databases that use TEXT, BLOB, GEOMETRY, or JSON columns a good fit regardless of whether they need version control or not.

Conclusion#

Dolt 2.0 is here. It’s kinder to your disk and it’s fast. Questions? Stop by our Discord and just ask.

Planet for the MySQL Community

‘I Am Your Father,’ Reveals Trump To Horrified Mark Hamill

https://media.babylonbee.com/articles/69fe0b407534869fe0b4075349.jpg

WASHINGTON, D.C. — Donald Trump called an impromptu press conference in front of the White House this week to deliver a life-changing message to actor Mark Hamill, revealing that he was, in reality, the actor’s father.

The actor was reportedly reluctant to accept the invitation to appear at the press conference but sensed something deep within himself that made him feel compelled to be present.

"Search your feelings, Mark, you know it to be true," Trump said while extending his hand toward Hamill. "George Lucas never told you what happened to your father."

Hamill recoiled in fear, somehow knowing what was next. "He told me enough," he said. "He told me you’re basically Hitler and that you’re destroying democracy. We have to stop you."

"No. I am your father, Trump explained.

"No… no… that’s not true," Hamill sobbed. "That’s impossible!"

"It’s true. It’s a beautiful thing, maybe the best fatherhood in the history of families. Many people are saying it," Trump answered.

"NOOOOOOOOOOOOOO! NO!" the actor then shouted as members of the media looked on.

"This is a great opportunity, Mark," Trump continued as he adjusted his red power tie. "You can destroy the Left. The Democrats have foreseen this. Join me, and together we can make America great again as father and son."

Hamill was later seen fleeing the press conference and was unavailable for comment.

At publishing time, Trump also announced that he had ordered the United States military to destroy all copies of any Star Wars movies made after Return of the Jedi, a move that skyrocketed his popularity with Republicans and Democrats alike.


Every hour a racist loses hope, will you help the Southern Poverty Law Center to help a racist in need?

Click to watch the latest sketch!

Babylon Bee

Board for balance exercises, with acupressure #3DPrinting #3DThursday

https://cdn-blog.adafruit.com/uploads/2026/05/Board-for-balance-exercises-with-acupressure.webp


Hutnik shares:

These are balance boards, which are a great way to practice your balance. To make it not so easy, I created, in addition to a smooth board, boards with different types of protrusions that work like acupressure, which will take your balance to higher level

download the files on: https://makerworld.com/en/models/2743722-board-for-balance-exercises-with-acupressure


649-1
Every Thursday is #3dthursday here at Adafruit! The DIY 3D printing community has passion and dedication for making solid objects from digital models. Recently, we have noticed electronics projects integrated with 3D printed enclosures, brackets, and sculptures, so each Thursday we celebrate and highlight these bold pioneers!

Have you considered building a 3D project around an Arduino or other microcontroller? How about printing a bracket to mount your Raspberry Pi to the back of your HD monitor? And don’t forget the countless LED projects that are possible when you are modeling your projects in 3D!

LIVE CHAT IS HERE! http://adafru.it/discord

Adafruit on Instagram: https://www.instagram.com/adafruit

Shop for parts to build your own DIY projects http://adafru.it/3dprinting

3D Printing Projects Playlist:

3D Hangout Show Playlist:

Layer by Layer CAD Tutorials Playlist:

Timelapse Tuesday Playlist:

Connect with Noe and Pedro on Social Media:

Noe’s Twitter / Instagram: http://instagram.com/ecken

Pedro’s Twitter / Instagram: http://instagram.com/videopixil

3D printing – Adafruit Industries – Makers, hackers, artists, designers and engineers!

Laravel ClickHouse: A Full-Featured ClickHouse Driver for Laravel

https://picperf.io/https://laravelnews.s3.amazonaws.com/featured-images/clickhouse-laravel-featured.png

Laravel ClickHouse is a database driver that integrates ClickHouse with Laravel, including Eloquent, the Query Builder, Schema Builder, and more:

  • Eloquent models with non-incrementing ID support
  • Query Builder with ClickHouse-specific clauses (i.e.,FINAL, ARRAY JOIN, SAMPLE)
  • Schema Builder with ENGINE, PARTITION BY, ORDER BY, and LowCardinality column types
  • Laravel migration support via artisan migrate
  • Concurrent query execution using Guzzle’s async HTTP pool
  • Dual HTTP transport options: Guzzle and Curl/phpclickhouse

ClickHouse is an open-source column-oriented database built for analytical workloads. It stores data by column rather than by row, making aggregations over large datasets fast—capable of querying billions of rows in seconds. It’s a common choice for event tracking, time-series data, and analytics dashboards where read performance at scale is the priority.

Eloquent Models

You can define Eloquent models pointing at ClickHouse the same way you would for any other database connection:

class Event extends Model

{

protected $connection = 'clickhouse';

}

 

$events = Event::where('user_id', 1)->get();

ClickHouse doesn’t use auto-incrementing primary keys, so the driver configures models with non-incrementing IDs by default. Scopes and collections work as expected.

Query Builder with ClickHouse Extensions

The Query Builder covers standard Laravel methods and adds ClickHouse-specific clauses. The final parameter applies the FINAL modifier to a query, which forces ClickHouse to merge duplicate rows at read time—useful with the ReplacingMergeTree engine:

$events = DB::connection('clickhouse')

->table('events', final: true)

->where('user_id', 1)

->get();

Other extensions include PREWHERE (ClickHouse’s pre-filter for primary key columns), ARRAY JOIN, SAMPLE, LIMIT BY, and SEMI/ANTI/ASOF join types.

Schema Builder and Migrations

The Schema Builder supports ClickHouse DDL via a ClickHouseBlueprint, letting you define table engines, partition keys, order keys, and column types like LowCardinality:

Schema::connection('clickhouse')->create('events', function (ClickHouseBlueprint $table) {

$table->engine('MergeTree()');

$table->orderBy(['id', 'created_at']);

$table->partitionBy('toYYYYMM(created_at)');

});

Standard artisan migrate commands work with a ClickHouse-compatible migration repository, so you can manage schema changes alongside your other databases.

Concurrent Query Execution

The package includes a Parallel helper that runs multiple queries at the same time using Guzzle’s async HTTP pool:

$results = Parallel::get([

'users' => User::where('active', 1),

'events' => Event::where('type', 'click'),

]);

Both users and events execute concurrently, and the results are returned as a keyed array once all queries resolve.

You can find the full documentation and source on GitHub.

Laravel News

How the Ford Model T Changed Factories Forever

https://theawesomer.com/photos/2026/05/ford_model_t_factory_t.jpg

How the Ford Model T Changed Factories Forever

The Ford Model T helped democratize car ownership while revolutionizing factory production. Primal Space explores how Henry Ford and his engineers developed a moving assembly line that brought parts directly to workers, dramatically speeding up manufacturing. Ford’s Highland Park factory also helped popularize the five-day work week.

The Awesomer

Open-source 3D-printed stethoscope validated against the clinical gold standard

https://cdn-blog.adafruit.com/uploads/2026/05/a-4.jpg

GliaX has published open design files for a 3D-printed stethoscope that has been peer-reviewed and validated against the Littmann Cardiology III.

Total material cost runs $2–5, with the main body printed in PETG or ABS at 100% infill, a diaphragm cut from a standard report cover, and silicone tubing from common stock.

You can see the peer-reviewed publication relating to this stethoscope’s validation here.

Design files, bill of materials, print-ready 3MF files, and an assembly video are all freely available on GitHub.

3D printing – Adafruit Industries – Makers, hackers, artists, designers and engineers!