It would be nice if Zammad would support a scale-out setup. I’m not sure how it works with the package install’s, but in the docker installation the zammad application is split in several services. what you could do for example is run each service (or an sub-set of these) on a seperate instance. for example you could run the railsserver in vm1, the nginx serviers on vm2, the scheduler on vm3 and the websocket service on vm4. this way you alleviate the load on each server, possible being able to handle more requests. Also you could increase the allotted memory to memcache, so you have more space available for caching.
I have not tried this approach yet with Zammad but it should be rather easy to implement, as I have done it with other web applications.
You will need a GlusterFS mounted on both VMs and keepalived + Pacemaker to handle the HA capabilities like the floating IP you would use to access the load-balanced Zammad instance.
Then you need to properly configure your nginx servers on both VMs to listen to the virtual IP.
In theory, it should work… unless @MrGeneration or any other Zammad Core Team thinks otherwise.
But as you have been told, this has nothing to do with Zammad but with Systems Administration.
This is indeed more a System Administration question. I’m running Zammad with GlusterFS as storage backend, But i suppose any shared storage would do (e.g. NFS, etc.).
If you would opt for docker swarm/k8s, you would get the keepalived/pacemaker and vip out of the box.
From a System Administration point it would be good to know what parts are needed to keep an correct state, as it seems (but could be wrong) session data is stored in the database. So which state is keept in the applications it self? For example you could configure a reverse proxy (haproxy, traeffic, envoy, etc) to keep sticky session, so clients are always routed to the same server for example on based on a cookie (this has downsides for failover). I’m not sure if that would be enough to serve each client a correct state.
I agree it shouldn’t be answered here. But it would be nice if it was in the documentation somewhere or maybe a blogpost/wiki. Just put a big disclaimer on it, that it’s not officially supported. Maybe the community is willing to support it in the end. For me it doesn’t really matter i’ve an install with 4 agents and about 15 messages a day. Except pure curiosity.