tablet server 한 대를 재기동하면 복제본이 3에서 2로 떨어지고, 곧바로 대량의 tablet copy 가 시작되어 디스크와 네트워크가 포화된다. "일정 시간 기다렸다가 복구하라" 는 설정을 찾게 된다.
마스터는 복제본이 부족한 태블릿을 발견하면 지체 없이 복구를 시작한다. 내구성을 우선하는 설계이므로 HDFS 의 리밸런서처럼 "몇 분 뒤에 시작" 하는 옵션 자체가 없다. 복구 검사 주기를 정하는 --catalog_manager_bg_task_wait_ms(기본 1000ms)가 있지만 이것은 검사 주기일 뿐 지연 장치가 아니다.
실질적으로 복구 시작 시점을 늦추는 값은 하나뿐이다.
| 플래그 | 기본값 | 의미 |
|---|---|---|
--follower_unavailable_considered_failed_sec |
300 | 리더가 팔로워에게 heartbeat 를 이 시간 이상 보내지 못하면 그 팔로워를 실패로 보고 구성에서 제거한다 |
이 값이 지나기 전에는 복제본이 실패로 분류되지 않으므로 새 복제본도 만들어지지 않는다. 그래서 짧은 재기동에 한해서는 이 값을 키우는 것이 우회책이 된다.
kudu tserver set_flag <tserver>:7050 follower_unavailable_considered_failed_sec 900
작업이 끝나면 원래 값으로 되돌린다. 값을 크게 둔 채로 방치하면 진짜 고장난 노드에 대한 복구도 그만큼 늦어진다.
Kudu 1.12 부터 tablet server 를 유지보수 상태로 표시할 수 있다. 이 상태에서는 해당 서버의 복제본이 실패로 분류되어도 마스터가 대체 복제본을 만들지 않고, 리밸런서도 그 서버를 대상에서 뺀다.
kudu tserver state enter_maintenance <master-addresses> <tserver-uuid>
kudu tserver state exit_maintenance <master-addresses> <tserver-uuid>
kudu tserver list <master-addresses>
tserver-uuid 는 kudu tserver list 로 확인한다. 등록되지 않은 서버를 지정하면 Not found: Requested tserver has not been registered 가 나므로, 먼저 목록에 보이는지 확인한다.
절차는 다음과 같다. 유지보수 상태로 전환 → 서비스 중지 → 작업 → 서비스 기동 → ksck 가 깨끗해질 때까지 대기 → 유지보수 해제. 한 번에 한 대씩만 한다.
복구가 이미 시작된 뒤 부하를 줄이려면 동시 수행 개수를 제한한다.
| 플래그 | 의미 |
|---|---|
--max_create_tablet_replicas_per_ts |
tablet server 한 대가 동시에 만들 수 있는 복제본 수 |
--tablet_copy_download_file_inject_latency_ms |
테스트용 지연 주입 (운영에서 쓰지 않는다) |
(확인 필요 — 위 플래그의 기본값은 버전에 따라 다르므로 kudu tserver get_flags 로 현재 값을 확인한 뒤 조정한다.)
재기동 직후 로그에 다음 메시지가 나오는 것은 대부분 정상 동작이다.
T <tablet-id> P <peer-id> [CANDIDATE]: Term 12 election: Election decided. Result: candidate lost.
Election summary: received 3 responses out of 3 voters: 1 yes votes; 2 no votes.
과반을 얻지 못한 후보가 졌다는 기록이고, 이미 다른 복제본이 리더가 되어 있거나 후보의 로그가 뒤처져 있으면 나온다. 문제로 봐야 하는 것은 리더가 오래 뽑히지 않는 경우다.
kudu cluster ksck <master-addresses> --tables=<table>
리더 없는 태블릿이 지속되면 노드 간 통신(7050·7051), 시계 동기화, 해당 노드의 자원 상태를 순서대로 본다.
--follower_unavailable_considered_failed_sec 는 tablet server 플래그이므로 전 노드에 같은 값이어야 의미가 있다.