Будет ли использование отработки отказа DNS работать в качестве стратегии отработки отказа с несколькими DC?
Если у меня есть кластер с несколькими DC, DC1 и DC2, где DC2 используется только для восстановления после отказа. А в драйвере на стороне клиента я определяю контактные точки, используя доменные имена (foo1.net, foo2.net, and foo3.net)
, У меня есть foo*, указывающая на DC1, и если я когда-нибудь обнаружу какую-либо ошибку с DC1, я сделаю DNS-маршрут foo*, указывающий на DC2.
Этот подход, кажется, работает на бумаге, но будет ли он на самом деле работать? Есть проблемы с этим подходом?
1 ответ
В случае DataStax Java Driver 3.x это не будет работать, так как DNS оценивается только в начале Cluster
конкретизации.
Указанные контактные точки разрешаются с помощью DNS через InetAddress.getAllByName в Cluster.Builder.addContactPoint
:
public Builder addContactPoint(String address) {
// We explicitly check for nulls because InetAdress.getByName() will happily
// accept it and use localhost (while a null here almost likely mean a user error,
// not "connect to localhost")
if (address == null)
throw new NullPointerException();
try {
addContactPoints(InetAddress.getAllByName(address));
return this;
} catch (UnknownHostException e) {
throw new IllegalArgumentException("Failed to add contact point: " + address, e);
}
}
Если DNS изменяется в течение жизненного цикла Cluster
водитель не будет знать об этом, пока вы не создадите новый Cluster.Builder
экземпляр и создать новый Cluster
от него.
Я предпочитаю дизайн, который выталкивает отказоустойчивость Центра обработки данных за пределы вашего приложения и на более высокий уровень вашей архитектуры. Вместо того чтобы возложить ответственность за отказоустойчивость вашего клиентского приложения, вы должны запускать экземпляры ваших клиентов, размещенные в каждом центре обработки данных C*. Балансировщик нагрузки вашего приложения / маршрутизатор /DNS может направлять трафик на экземпляры вашего приложения в других центрах обработки данных, когда центры обработки данных становятся недоступными.