Что такое кластер
Что проверяют
Понимаете ли вы, что происходит с приложением, когда оно работает не на одном сервере, а на нескольких. Определение знают все, поэтому следом спрашивают конкретику: как переживается отказ узла и что ломается в Java-сервисе, если просто запустить три копии.
Как отвечать
Кластер это группа узлов, которые снаружи выглядят как одна система. Собирают его ради двух целей, часто одновременно: отказоустойчивости (узел упал, сервис живёт) и масштабирования (нагрузка делится между узлами). Уточните, о каком кластере речь: кластер Kubernetes это набор машин для запуска контейнеров, кластер Kafka или PostgreSQL это одна распределённая система хранения.
Полезно назвать механизмы, а не только цели:
- балансировка: запросы распределяет nginx, HAProxy или
Serviceв Kubernetes, узлы приложения при этом одинаковые; - репликация: копии данных на нескольких узлах, как у PostgreSQL с репликами или у Kafka с
replication.factor; - шардирование: данные делятся между узлами по ключу, так растёт объём, а не только отказоустойчивость;
- выбор лидера и кворум: узлы договариваются, кто главный, через Raft (etcd, Kafka в режиме KRaft) или похожие протоколы. Решение принимает большинство, поэтому узлов обычно нечётное число: 3 или 5.
Для Java-сервиса важнее всего состояние. Экземпляры Spring Boot за балансировщиком должны быть stateless: HTTP-сессию выносят в Redis через Spring Session, локальный кеш заменяют распределённым (Redis, Hazelcast) или мирятся с расхождением. Задачи по @Scheduled запустятся на каждом узле, поэтому их страхуют блокировкой через ShedLock или Quartz в кластерном режиме с JDBC-хранилищем.
Где спотыкаются
Путают кластер с микросервисами. Микросервисы это способ нарезать приложение, кластер это способ запустить каждую часть на нескольких узлах.
Забывают про локальное состояние: сессия в памяти, кеш в HashMap, файлы на диске узла. На одном сервере всё работало, на трёх пользователь теряет корзину.
Считают, что два узла надёжнее одного во всём. При разрыве связи между двумя узлами ни у одного нет большинства, и получается либо простой, либо split-brain с двумя «главными».