https://github.com/benbjohnson/litestream/releases/tag/v0.5....
[0] https://fly.io/blog/litestream-v050-is-here/#the-ltx-file-fo...
Thanks to mtlynch and everyone else who has submitted bug reports. We're squashing issues and working to get everything stable as quickly as possible.
All things considered, this is probably just a tiny footnote in this software's life.
That alone should hint everyone it was a big leap.
https://fly.io/blog/litestream-revamped/#lightweight-read-re...
But the concept is really cool, and it's workable. I already have a version that mostly works.
https://github.com/ncruces/go-sqlite3/tree/litestream/litest...
With Litestream v0.5.0 doing the replication, you'll get some transient read failures that really shouldn't happen.
If you build Litestream from head (or wait for v0.5.1), that'll be fixed. You'll still have similar issues around the time of a snapshot, if you keep only one snapshot.
Other than that, I'm pretty confident it just works. But the performance probably sucks. I need to add a layer of caching. But that's it.
What's in object storage is not an SQLite file, but enough information to restore your SQLite file at various points in time. The way it's stored is optimized for frequent incremental updates and less frequent point restores.
The lightweight read replicas VFS allows you open an SQLite database read-only directly from the data in object storage, without having to first do a point restore, downloading all the data, and creating a local copy of the database.
You “stream” the data directly from object storage as needed, get a consistent view of it, and can query it while the “primary” is concurrently updating it.
It works, but SQLite kinda expects data to be local and low latency, which this might not be.
SQLite has a page cache, which you can use, but everytime there is a write, the entire cache is dropped.
Which means if you poll for updates regularly (which for various reasons you have to) you'll get frequent latency spikes.
One way to improve this is to add a page cache that has an understanding of which pages have changed and which have stayed the same. Prefetching would help to, but SQLite is really unhelpful there.
This is the piece I'm still missing. The rest mostly works already with Litestream v0.5.1.
Rollback mode needs to drop its page cache whenever there is any change to the database, because what changed – and what didn't – is not stored anywhere.
Confusingly, the read-replica VFS needs to pretend the database is in rollback mode even if it isn't. Otherwise, we'd have to fake a database file, a WAL and a WAL index, instead of just a database.
Livestream, sqlite and caddy are incredibly at making single box/vps ops a breeze.
There’s been an official Litestream container image for over 3 years at this point (since version 0.3.4, it’s at the same Docker Hub as 0.5.0).
After your comment, I thought, "Oh, I should contribute a PR to the repo to add the Docker badge so the Docker image is obvious to everyone," but it turns out the badge has been right there for four years.[0]
What I suspect happened is that I tried to use the Litestream Docker image once, discovered that image was amd64-only (until 0.3.9), so I didn't use it because I needed ARM, and then I just kept copy/pasting my workaround from project to project.
[0] https://github.com/benbjohnson/litestream/commit/6acfbcbc64d...
If you're running into it, I'd test again with the latest release (0.5.1) and see if it's still present. If so, I suspect it would get more traction from the dev team if the report was complete, as it's currently missing repro steps and the litestream.yml is not compatible with 0.5.0 (it still has "replicas" plural).
emschwartz•3mo ago