Расширение мастер-сервера
- Подготовка
- Детальный план
- 1. Погасить шедулеры и контроллер-агенты
- 2. Выключить chunk refresh и chunk requisition update
- 3. Погасить все ноды
- 4. Погасить все прокси
- 5. Погасить все оставшиеся сервисы кроме мастер-серверов
- 6. Построить на мастер-серверах снапшот с read-only
- 7. Погасить мастер-сервера
- 8. Поднять мастер-сервера, clock-сервера, мастер-кеши, timestamp-провайдеры, discovery сервера
- 9. Выйти из режима read-only
- 10. Дождаться регистрации новых селлов и репликации глобальных объектов
- 11. Дождаться штатной работы мастер-серверов
- 12. Прописать новым селлам роли
- 13. Поднять ноды (на версию с новым конфигом)
- 14. Дописать новые селлы в cluster connection
- 15. Включить chunk refresh и chunk requisition update
- 16. Дождаться, пока все ноды зарегистрируются и для чанков сойдется refresh
- 17. Поднять остальные компоненты
- 18. Дождаться перехода кластера в режим штатной работы
Добавление новых мастерных селлов всегда происходит с полным даунтаймом кластера. В упрощенном виде расширение кластера представляет из себя одновременное обновление статического конфига всех компонент кластера с некоторыми дополнительными действиями. Ниже описан подробный план действий, перед тем как приступать к нему, стоит прочитать его до конца.
Подготовка
- Нужно подготовить новый статический конфиг, добавив в него информацию о новых селлах.
- Можно заранее подготовить @cluster_connection с новыми селлами (про @cluster_connection написано ниже в пункте 14).
Важно
Cell tags/cell IDs должны быть уникальны и в идеале следовать предсказуемому паттерну. Если у вас мультикластерная инсталяция, сell tags/cell IDs должны быть уникальны среди всех мастерных селлов всех кластеров инсталяции.
Детальный план
1. Погасить шедулеры и контроллер-агенты
Эти компоненты стоит гасить в первую очередь, так как при массовом уходе нод (и вытекающей из этого нехватке ресурсов) они могут абортить пользовательские операции.
2. Выключить chunk refresh и chunk requisition update
yt set //sys/@config/chunk_manager/enable_chunk_refresh %false
yt set //sys/@config/chunk_manager/enable_chunk_requisition_update %false
На мастер-серверах есть фоновая активность по репликации чанков. Следующим пунктом мы погасим все ноды, из-за чего чанки, конечно, потеряют свои реплики, что в моменте может спровоцировать всплеск бесполезной работы (на мастер-серверах, конечно, есть защита на случай, если реплик потеряно слишком много, но до того, как этот момент наступит, мастер-сервера будут активно заниматься ненужной в будущем деятельностью). Чтобы это предотвратить, можно заранее переключить описанные флажки.
3. Погасить все ноды
(Следить за состоянием нод можно по //sys/nodes/@count и //sys/nodes/@online_node_count).
Здесь очень важно убедиться, что все ноды кластера находятся в состоянии offline (проверить состояние можно с помощью //sys/cluster_nodes/{node_address}/@state). В мастер-серверах есть защита, которая остановит новый селл от регистрации в случае, если есть хотя бы одна не offline нода.
Важно
Если в кластере уже есть вторичные селлы, то ноды какое-то время могут находиться в состоянии mixed. В таком случае тоже важно дождаться, чтобы все ноды стали offline.
4. Погасить все прокси
5. Погасить все оставшиеся сервисы кроме мастер-серверов
(Скорее всего это clock-сервера, мастер-кеши, timestamp-провайдеры, discovery-сервера. При наличии других сервисов их тоже стоит погасить на этом шаге).
Замечание
Сервисы, которые не используют мастер-сервера для своей работы, не обязательно гасить при расширении. Примерами таких сервисов являются clock-сервера, discovery servers и возможно другие сервисы, в статическом конфиге которых не прописаны адреса мастер-серверов.
Если вам по каким-то причинам важна живость этих сервисов, можно не гасить их на этом шаге, но важно быть внимательным — если не погасить сервис, в статическом конфиге которого мастер-сервера все же есть (тем самым не обновив его статический конфиг), то кластер может сломаться произвольным образом.
6. Построить на мастер-серверах снапшот с read-only
yt-admin build-master-snapshots —read-only —wait-for-snapshot-completion
Read-only — это специальное состояние кластера, при котором мастер-сервера не могут принимать, планировать и применять мутации. Построение снапшота в таком режиме — это стандартный приём при мажорных обновлениях, он позволяет добиться того, что мастер-сервера новой версии будут восстанавливаться только из снапшота, не применяя ченджлог поверх снапшота (т. к. ченджлог после снапшота будет пуст).
Внимание
Этот шаг очень важен, его невыполнение может привести к потере данных.
Можно убедиться, что мастер-сервера перешли в read-only режим и построили снапшот по логам лидера:
"Read-only mode enabled" и "Distributed snapshot creation finished".
7. Погасить мастер-сервера
8. Поднять мастер-сервера, clock-сервера, мастер-кеши, timestamp-провайдеры, discovery сервера
Важно
Если на шаге 5 были погашены какие-нибудь еще сервисы, кроме перечисленных, то поднимать их пока не нужно!
9. Выйти из режима read-only
yt-admin master-exit-read-only
10. Дождаться регистрации новых селлов и репликации глобальных объектов
По логам мастер-серверов стоит убедиться, что новые селлы успешно зарегистрировались и на них отреплицировались глобальные мастерные объекты.
Сообщение об успехе регистрации нужно искать в логах первичного селла: "Master cell registered".
А сообщения о репликации объектов — в логах новых, только что добавленных, мастерных селлов: "Foreign object created" (возможно потребуется подождать пару минут, пока они появятся). Также следует учесть, что объектов на кластере может быть много, и стоит подождать именно окончания репликации глобальных объектов (дождаться, когда фон сообщений "Foreign object created" прекратится).
11. Дождаться штатной работы мастер-серверов
Стоит убедиться, что все мастер-сервера находятся в режиме штатной работы, включая другие вторичные селлы, если такие есть.
Можно поискать в логах сообщения "Leader active"/"Follower active".
12. Прописать новым селлам роли
Вторичные мастерные селлы нужны для шардирования нагрузки, а шардировать нагрузку мы умеем разными способами. Здесь нужно выбрать, какой именно работой будет заниматься новый селл.
Виды ролей на текущий момент:
*chunk_host
— шардирование по чанкам, уносит на селл работу с чанками таблиц. Самая популярная и некогда дефолтная роль. После указания роли на селл автоматически начнут селиться новые чанки.
*cypress_node_host
— шардирование дерева метаинформации, позволяет уносить на этот селл поддеревья Кипариса (это требует ручных действий, данная роль дает такую возможность, но никакой автоматики в этом месте нет). Изложение процедуры вынесения поддеревьев на отдельный селл выходит за рамки данной статьи.
*transaction_coordinator
— шардирование работы с транзакциями.
Если вы не знаете, что делать, то скорее всего лучше заставить новые селлы хостить чанки (chunk_host). Две других роли нужны только для очень крупных кластеров.
Прописать новые роли нужно в //sys/@config/multicell_manager/cell_descriptors
:
//sys/@config/multicell_manager/cell_descriptors/{cell_tag}/roles
Стоит помнить, что прокси-сервера на данный момент недоступны, и любые обращения к Кипарису возможны лишь через корректно сконфигурированный нативный клиент. Обычно такой клиент можно найти в контейнере мастера.
Прописать роли можно позже, но важно не забыть об этом — если этого не сделать, то новые селлы ничем полезным заниматься не будут.
13. Поднять ноды (на версию с новым конфигом)
Важно
Этот шаг — точка невозврата. В теории, до этого момента, если что-то пошло не так, добавление селлов еще можно откатить. После выполнения этого шага откатить добавление селлов без потери данных уже нельзя.
14. Дописать новые селлы в cluster connection
Cluster connection живет в Кипарисе, по пути //sys/@cluster_connection/secondary_masters
.
Прописывать селлы нужно вот в таком формате:
[
{
"addresses" = [
"some_master_address:9010";
];
"cell_id" = "1-2-3-4";
};
];
Внимание
Новые селлы нужно именно добавить, в случае, если на кластере уже есть вторичные мастерные селлы, новые стоит просто дописать в конец списка. Рекомендуется на всякий случай сохранить куда-нибудь старый cluster_connection перед его изменением.
15. Включить chunk refresh и chunk requisition update
Если вы не выключали их на шаге 2, то этот шаг стоит пропустить.
yt set //sys/@config/chunk_manager/enable_chunk_refresh %true
yt set //sys/@config/chunk_manager/enable_chunk_requisition_update %true
16. Дождаться, пока все ноды зарегистрируются и для чанков сойдется refresh
В зависимости от количества нод и чанков на кластере этот шаг может занимать существенное время.
17. Поднять остальные компоненты
Поднять прокси, шедулеры, контроллер-агенты и другие компоненты (если такие остались).
Компоненты нужно поднимать на версию с новым конфигом.