Minimizing correlated failures in distributed systems