In another post, I’m in the process of compiling best practice based on users’ feedback, and there are a few issues which I’m trying to ascertain whether they are simply based on personal preference, or if they are actually grounded in fact.
One of which is the base setup: I don’t even know the correct way to phrase this, but I’m trying to understand which is best, I think these are the options, but please correct me if I’m wrong:
Bare metal Linux installation, no Docker
Bare metal Linux WITH Docker
Ubuntu (or similar) with Docker
So, I’d love to open up the debate here:
Firstly, it would be really helpful to me (and hopefully others, I’ll include it in the best practice summary) to understand the first principals: how each of these interacts with Storj.
Then, subsequent to that: what are the pros and cons of each, and how should a new user determine which setup is best?!
I’ll start the debate with the baremetal pros and cons:
Pros
Easy to setup and forget. There isn’t any fiddling you need to do with it to get it to run properly.
Easy to scale up. You copy the systemd service file, change the user/group/path and you have another node (after you generate a different identity of course)
Easy to properly keep up-to-date. You don’t have to worry about a version downgrade nuking your node while you are at work and can’t deal with it. You update when you want, it stays on that version for as long as you want (=as long as it’s not below the minimum version).
No overhead whatsoever. You run the node as fast as your host system can.
Configuration changes are just a config file edit and a service restart.
Cons
Requires a bit of knowledge. As long as you can use adduser, edit a file, cp, mv, you can get it running.
You can install and run docker for other services like grafana but because you want to be the fastest node for winning the long tail race you better don’t run the storagenode in docker. Even with networking host setting it still is a latency penalty. A small one that shouldn’t matter to much but why not avoid it?
Is that latency penalty relevant, though?
My nodes are running on docker and I’m still seeing success rates consistently in excess of 98%. I would suspect there are other considerations that are far more relevant for race wins than the docker latency, surely?
I don’t care about tiny differences in success rate. The reason for migrating my nodes to bare metal is storj’s update policy for docker. Waiting weeks for a much-needed bug fix to be deployed is unacceptable.
The gist is that you simply replace the storagenode binary in the docker container with the updated version.
There is also a flag to disable the version updater, but according to an entry in Gerrit it’s bugged at the moment. But so far I have not had my nodes downgraded to an older version.
I’m assuming you meant “VM” in opposition to “Bare Metal”. Ubuntu is just another Linux distribution.
Docker is just significantly easier to manage, especially for multiple nodes. A docker-compose file is far cleaner than any other setup. For example, if I want to change my payout address for all of my nodes, I change one line in the file, run a single command, and that’s it.
If you use VMs for multiple nodes on a single box, then the additional overhead of that is probably going to kill any miniscule performance gain you could hope to squeeze out by not containerizing the node.
You can also use Docker inside of a VM so that you only get the overhead of a single VM rather than multiple. You can optimize the performance of this by passing through an HBA and NIC (or a VF) directly to the VM, giving it close to baremetal network/storage performance.
I have them on Docker and they are easy to setup and manage. But Docker sometimes has some nasty issues where it cannot stop a container and needs a Docker restart itself or even a reboot.
I think at some point I will move my nodes to bare metal but not yet. There are other issues that needs to be solved first.
The suggested procedure to force a docker upgrade did not work for TrueNAS Scale. I ended up replacing the storj version info server with my own one (VERSION_SERVER_URL).
I’d argue this requires less knowledge than using the docker. Storagenode has extensive help, it’s already self-contained executable with no dependencies, and you don’t need to fight against container orchestrator.
The best way is always the one that involves fewer layers.
If you are running docker specifically on windows or macOS then you have a VM in between. Of course everything will be horseshit.
Containers on the OS have no computational overhead, they share kernel with the host. There is no difference literally.
No, you run storagenode updater to take care of that.
I can’t comprehend why is everyone so hell bent on docker. Advertising? It’s a commercial, shitty solution. There are other containerization solutions that are lower overhead and much better. Read about podman. It literally generates systemd wrappers for you, it does not have a daemon, etc.
Edit. I just realized it’s an ancient thread… sorry for muddying the water. I got misled by helpful discourse again.