Hoi folks,
TL/DR: Gouda will be unavailable on 2026-08-12 between 0800-0900Z
IPng has deployed a new machine for our Sunlight logs. They are
currently running on a VM with passthrough ZFS storage, but we're
intending to run them on bare metal going forward. Now that we've
submitted our 2028 log shards, this is a good time to make the move.
Yesterday I moved the staging logs (Rennet 2027h1+h2 and 2028h1+h2) to
this new machine. It took about 30min, mostly due to steps 4) and 5)
giving me a learning moment.
On Wednesday 2026-08-12 from 0800-0900Z I will move the Gouda production
log shards for 2027+2028 to this new machine also. The procedure to
safely move logs between Sunlight instances that I landed on is roughly:
0) rsync the data to new machine
1) remove the shard(s) from sunlight on original VM; keep them serving
in Skylight for step 5
2) freeze ZFS dataset(s); extract checkpoints from sqlite3 (see below)
3) rsync the delta to new machine
4) add the shard(s) to sunlight on the new machine; insert the snapshots
into sqlite3
5) start skylight + sunlight on the new machine; sunlight will read
skylight checkpoint(s) from original VM via monitoringprefix in addition
to its localdirectory
6) move nginx frontends for the shard to point to the new machine
7) remove the shard from skylight on original VM
At the end of this window, Gouda and Rennet shard 2026h2 will remain on
the original VM; and all eight 2027+2028 shards will be on the new machine.
For future readers: watch out with Sunlight's shared checkpoints.db; it
contains blob of logID -> checkpoint so copying logs between two running
Sunlight machines cannot simply rsync the checkpoints.db; instead,
extract the to-be-moved logID->checkpoints from the source and upsert
them to the destination.
I will be using this on the original VM (after stopping Sunlight and
setting ZFS datasets readonly):
sqlite3 -batch -noheader checkpoints.db "SELECT 'INSERT INTO
checkpoints(logID,body) VALUES(' || quote(logID) || ',' || quote(body)
|| ') ON CONFLICT(logID) DO UPDATE SET body=excluded.body;' FROM
checkpoints WHERE substr(body,1,9) IN (CAST('gouda2027' AS BLOB),
CAST('gouda2028' AS BLOB));" > /tmp/upsert-gouda.sql
grep -c '^INSERT INTO' /tmp/upsert-gouda.sql # expect 4
And then on the new machine (which is already running Rennet shards):
sqlite3 /ssd-vol0/shared/checkpoints.db < /tmp/upsert-gouda.sql
groet,
Pim obo
ct-...@ipng.ch
--
Pim van Pelt
PBVP1-RIPE -
https://ipng.ch/