Marmot – A distributed SQLite server with MySQL wire compatible interface

135 pointsposted 12 hours ago
by zX41ZdbW

27 Comments

_a9

10 hours ago

I used this a while back while running a waybackmachine style site for a large social media platform. I wanted to keep it simple with sqlite but when it got popular it started to become a problem. Marmot was the only thing that I was able to get to work with the amount of data I was pulling in. It would sync the master db from the main archiver server to all the ha servers so the user would be able to access it immediately no matter what ha server they got. The dev team was nice to talk to when I had some issues in setting it up.

It was definitively a weird backend setup I had made but it just worked once set up so I didnt have to touch any of the frontend code.

maxpert

11 hours ago

Author here! Every time I post my own stuff here it seems to sink, so hopefully this actually reaches some of you.

Marmot started as a sidecar project using triggers and polling to replicate changes over NATS. It worked, but I hit a wall pretty fast. Most people really want full ACID compliance and DDL replication across the cluster. I realized the only clean way to do that was to expose SQLite over a standard protocol.

While projects like rqlite use REST and others go the page-capture route, I decided to implement the MySQL protocol instead. It just makes the most sense for compatibility.

I’ve reached a point where it works with WordPress, which theoretically covers a huge chunk of the web. There are scripts in the repo to deploy a WP cluster running on top of Marmot. Any DB change replicates across the whole cluster, so you can finally scale WordPress out properly.

On the performance side, I’m seeing about 6K-7K inserts per second on my local machine with a 3-node quorum. It supports unix-sockets, and you can even have your processes read the SQLite DB file directly while routing writes through the MySQL interface. This gives you a lot of flexibility for read-heavy apps.

I know the "AI slop" label gets thrown around a lot lately, but I’ve been running this in production consistently. It’s taken a massive amount of manual hours to get the behavior exactly where it needs to be.

hardwaresofton

8 hours ago

Just want to note that every time I see it I’m impressed with the project, great job so far.

The fact that you’ve been running this with WP is also a really huge use case/demonstration of trust in your different software — IMO this should be on the README prominently.

These days I personally just ignore projects that insist on MySQL — Postgres has won in my mind and is the better choice. The only way I’d run something like a WP hosting service is with a tool like Marmot.

One thing you might find interesting is trying marmot with something like Litestream v2 — marmot of course has its own replication system but I like the idea of having a backup system writing to s3. It seems trivial (as you’ve noted that you can still work directly on the s3 file) but would be a nice blog post/experiment to see “worked out” so to speak.(and probably wouldn't sink to the bottom of hn!)

maxpert

2 hours ago

Marmot already supports debezium, so you can do way more than just basic S3 backups. I've noted your suggestions, it's definitely helpful.

hardwaresofton

30 minutes ago

Thanks for the consideration! The reason something like litestream is interesting to me is that it’s (now[0]) an off the shelf way to do PITR backups for SQLite.

Sure, I could piece together or write something myself to catch the CDC stream or run another replica, but simply running one more process on one of the boxes and having peace of mind that there’s an S3 backup continuously written is quite nice.

I thought debezium was mostly for moving around CDC records, not a backup tool per say. I.e. if I were to write debezium records to object storage with their connectors it’s my job to get a recent dump and replay?

[0]: https://fly.io/blog/litestream-v050-is-here/

raphinou

3 hours ago

Also a postgres user. Wondering why MySQL wire protocol and not pgsql's: did the mysql choice have advantages compared to pgsql in this case?

maxpert

an hour ago

You point out a question that I spent months thinking about. I personally love Postgres, heck I initially even had a version that will talk postgres wire but with SQLite only syntax. But then somebody pointed me out my WordPress demo, and it was obvious to me that I have to support MySQL protocol, it's just a protocol. Underlaying technology will stay independent from what I choose.

spiffytech

4 hours ago

Since Marmot pivoted to the MySQL wire protocol, I haven't had a clear picture of its advantages over using normal MySQL with active-active replication. Can you speak to that?

maxpert

an hour ago

Here are some that I can think on top of my head:

- Marmot let's you choose consistency level (ONE/QUORUM/FULL) vs MySQL's serializable.

- MySQL requires careful setup of replication, conflict avoidance and monitoring. Fencing split brain and failover is manual in many cases. Marmot even right now is easier to spin up, plus it's leaderless. So you can actually just have your client talk to different nodes (maybe in round robin fashion) to do load distribution.

- Marmot's eventual consistency + anti-entropy will recover brain-splits with you requiring to do anything. MySQL active active requires manual ops.

- Marmot's designed for read-heavy on the edge scenarios. Once I've completed the read-only replica system you can literally bring up or down lambda nodes with Marmot running as sidecar. With replicas being able to select DBs they want (WIP) you should be able to bring up region/org/scenario specific servers with their light weight copies, and writes will be proxied to main server. Applications are virtually unlimited. Since you can directly read SQLite database, think many small vector databases distributed to edge, or regional configurations, or catalogs.

geenat

11 hours ago

Oh man, tons of updates including DDL replication! V2 looks very impressive.

Now I'm curious how sharding/routing is handled- which seems like the final piece of the puzzle for scaling writes.

maxpert

10 hours ago

Right now I've started off with full replication of every database in cluster. On my roadmap I have:

- Ability to launch a replica on selected databases from main cluster.

- Ability for replica to only download and replicate changes of select databases (right now all or nothing).

- Ability for replica to proxy DML & DDL into write cluster transparently.

- Custom set of commands for replicas to download and attach/detach databases on the fly.

This will instantly solve 80% of the problems for most of consumption today. I will probably go after on demand page stream and other stuff once core features are done.

Not to mention this solves majority use-cases of lambdas. One can have a persistent main cluster, and then lambda's coming up or going down on demand transparently.

eduction

31 minutes ago

Let’s not forget that keeping wildlife, uh, an amphibious rodent, for uh, domestic, within the city-- that ain't legal either.

joelthelion

5 hours ago

Naïve question : why would you want to use this over, say postgre?

savolai

6 hours ago

So would it make sense to use to use this on a nas to keep wordpress sites’ content backed up?

maxpert

an hour ago

Yes you can. I know wordpress has been trying to get SQLite as first class citizen too. But at this point I am tired of waiting for that pipe-dream. But this will let you do it today. Plus Marmot supports debezium so you can have continuous stream to your NAS.

ChocolateGod

6 hours ago

I wonder if you could tie this with Litestream to get streamed backups.

maxpert

an hour ago

We already support debezium so you can do more than backups :D

schulm

5 hours ago

Is this suitable for LocalFirst apps?

wg0

7 hours ago

Is there something similar that exists for Postgres?

iliesaya

9 hours ago

is this an alternative to SymmetricDS to replicate database on multiple node without master/slave ?

PunchyHamster

5 hours ago

weird choice considering SQLite is more similar to PostgreSQL

phplovesong

5 hours ago

AI probably generated the mysql thing, and OP just went with it.

oblio

10 hours ago

Funny, I was just reading about this:

https://github.com/synopse/mORMot2

FreePascal ORM, so in an adjacent space (ORM, can work with both SQLite and MySQL).

I guess DB devs really love marmots? :-))

phplovesong

5 hours ago

Looks like yet another AI generated project.