Syncer: fast stateful file/disk data syncer written on Go
github.com
github.com
With that said, as a user of a tool/library/service, why should I care what language it's written in?
I want to know if a data-syncing tool is reliable or not. I know rsync is, but OK that's not always super-duper fast.
I know volume-streaming with btrfs and ZFS works wonders, without the need to do manual book-keeping of a secondary state and hoping you ALWAYS keep that secondary state up to date. I doubt this out-performs the FS just doing the job itself, and it sounds much more prone to user error.
So what does this offer over those? It sounds like it has less features and is not as reliable. Being written in Go offers me nothing I don't already have.
If you use UEFI, bootloader is just a normal file on a normal (FAT) partition so no special magic is needed, but fair enough.
ZFS typically handles partitions its own way so no need to sync that.
But really: If you just want to keep to full drives in sync, at block-level so one can at any point be a stand-in replacement for the other, it sounds like what you want is RAID0. Isn't that what you want?
And with UEFI you can boot those RAID-volumes, even though they are soft-raid volumes.
Not saying your need doesn't exist, but that existing solutions which are more standardized and requires less administration seemingly already exists.
Maybe depends on the implementation, I I'd imagine it would degrade performance.
Unless I'm misinterpreting, I think you were going for RAID1.
On the other hand, btrfs send skips empty and unchanged blocks. If the disk is mostly empty, send could still be the faster option.
besides, this lib only cover one sync scenario and only one and does it only on demand. might be fast because it stores the hash somewhere, but that also means you'll run in issues if the mirrored slow drive content changes by any mean.
Plus syncthing is an entirely different use case from glusterfs. Think Dropbox, not one-filesystem-across-many-machines.
This hasn't got much, if anything, to do with Go specifically; in particular, I've been aware of everything I write in this post since before I was even aware of Go. The OS support is just too variable and shot through with subtle-yet-critically-important semantic differences, in addition to the fact the problem is harder than it looks at first. Trying to write a lowest-common-denominator API leaves you with a really low LCD. Trying to write a higher level API that offers the more convenient stuff leaves you with an API that makes it trivially easy to write something that works really, really well on one platform and is completely non-performant on another (in particular, trying to automatically "recurse" on the directories). It turns out there's no happy middle here for the general case.
Because it tells you a lot with what other ecosystems is compatible, how much of a fuss it would be to interface with it (in case it's a library and you use e.g. Java, you'd normally prefer a pure-Java implementation instead of a C+JNI one, etc), if it's a good fit for your existing dependency management, if you know the language to go in and fix an issue or adapt it, etc.
It makes sense to mention it for people who for example for learning purposes want to read code written in Go.
If you approach the post with a more open curiosity I think it will make more sense to you why the language is a relevant detail, even if it still doesn't interest you personally.
ZFS has incremental snapshots, it is fast, but I need to restore bootloader, partitions and everything corresponding to be able to bootup and work again.
It takes blocksize-size memory block for each CPU in your system. I have got 4 CPUs and work with 2 MiB blocks: program will take 8 MiB of RAM.