Yes, I second exactly what @JasonWalker said.
You DO NOT need to upgrade your clients and relays. In nearly 100% of cases, you should be able to run your relay and client versions a bit ahead or behind the root with little issue. It is not optimal, but it should be fine. This is especially true if it is in the same major release, or at least the same major version, but an 8.0 client will work with a 9.1+ relay & root.
In fact, if you do upgrade your root, I would recommend sitting on it a tiny bit before upgrading your relays, then upgrade your relays and sit on that a bit before upgrading your clients… and I would not recommend updating your relays & clients all at the same time… do that progressively.
In the case of the relays, start at the top and work your way down, but don’t upgrade all of a redundant set of relays at the same time. If you have 4 top level relays, upgrade 2, wait a while, then the other 2. If you have 30 relays below that with 2 in each of 15 locations, then don’t upgrade both in the same location at the same time.
In fact, with the REST API, you could create a repeatable relay upgrade roll out schedule that would involve multiple actions taken at once, but with progressively later start times so that if anything goes wrong you can put the breaks on it, but if nothing goes wrong, eventually all relays will get upgraded without you having to poke at it multiple times. In fact, since I don’t think you really must start top down with relay upgrades, you could just have the upgrade distributed over a large enough time period so that only one relay gets upgraded per X hours, allowing you to stop things if problems appear.