Currently, if the IDX takes longer than the restart_timeout to come back on-line, the CM marks the IDX as "down". Counter-intuitively, this frees up a slot in the CM's IDX restart queue, and it moves to the next IDX. Of course, this impacts the total number of IDXes available.
In addition, the CM does not take into account SF or RF when doing a rolling restart. E.g., it doesn't check to see if the current IDX it's restarting has the last searchable copy if other IDXes are marked as down.
The only way to avoid this issue and keep the data 100% searchable throughout a maintenance like this is to make a multi-site cluster (which could be in the same DC) and use the -site-by-site flag as mentioned in the link that mbrown mentioned.
If you have large numbers of buckets per IDX, this can increase the amount of time it takes an IDX to restart. Generally, you will see fewer issues if you keep the IDXes at under 100K buckets each. One of our primary index cluster developers gave a talk at our user's conference last year, and provided some recommendations for cluster tuning based on bucket counts. Slide 15 has a table with recommendations on tuning 'service_interval' (on the CM), 'heartbeat_period' (on IDXes), 'heartbeat_timeout' (on the CM), as well as a few other settings.
You can read the slides here: https://conf.splunk.com/session/2015/conf2015_Dxu_Splunk__Deploying_IndexerClusteringTips.pdf
A recording of the talk is available here:
https://conf.splunk.com/session/2015/recordings/2015-splunk-68.mp4
As I stated in my comment above, if you have large numbers of buckets with timestamp issues, this can cause problems with cluster rolling restarts. If a timestamp is far in the past compared to the current time, and you're using time-based retention, this will cause buckets to roll prematurely, creating many small buckets.
At a minimum, consider running splunk remove excess-buckets [index-name] periodically, particularly if you have had any IDX outages, as the CM does not remove excess buckets automatically.
... View more