TECH 으로 돌아가기
TECH HACKER NEWS 오늘 7분 읽기 25 READS

고장 나도 스스로 제자리를 찾는 시스템, 자기안정화(Self-Stabilization)와 아직 없는 '조합 이론'

고장 나도 스스로 제자리를 찾는 시스템, 자기안정화(Self-Stabilization)와 아직 없는 '조합 이론'
SOURCE IMAGE · HACKER NEWS
고장 나도 스스로 제자리를 찾는 시스템, 자기안정화(Self-Stabilization)와 아직 없는 '조합 이론'

아무 상태에서 시작해도 제자리로 돌아오는 시스템

버펄로 대학의 무라트 데미르바스 교수는 분산 시스템 쪽에서 오래 활동하면서 블로그에 논문 리뷰와 생각을 꾸준히 올리는 분인데요. 이번 글은 '자기안정화(self-stabilization)의 조합 가능한 이론을 찾아서'라는 제목으로, 본인이 박사 때부터 붙들고 있던 문제를 다시 꺼낸 글이에요. 왜 지금 이 얘기를 하냐면, 쿠버네티스 컨트롤러처럼 '원하는 상태를 선언하면 시스템이 알아서 맞춰가는' 방식이 업계 표준이 됐는데, 그 이론적 뿌리가 바로 자기안정화이고, 이걸 여러 개 조합했을 때 여전히 안전한지는 아직 깔끔한 답이 없거든요.

자기안정화가 뭐냐면

1974년에 다익스트라가 제안한 개념이에요. 시스템이 '어떤 상태'에서 시작하더라도, 심지어 완전히 망가진 상태에서 시작하더라도, 유한한 시간 안에 정상 상태로 돌아오고(수렴), 한번 정상 상태에 들어가면 외부 고장이 없는 한 계속 정상 상태에 머무는(폐쇄) 성질이에요. 오뚝이를 생각하시면 돼요. 어느 방향으로 눕혀도 결국 똑바로 서잖아요. 일반적인 고장 허용 설계는 '이런 고장이 나면 이렇게 대응한다'를 하나하나 정의하는데, 자기안정화는 고장의 종류를 아예 따지지 않아요. 고장이 뭐였든 결과는 '이상한 상태'일 뿐이고, 이상한 상태에서 정상으로 가는 길만 보장하면 되니까요. 메모리 비트가 뒤집히든, 네트워크가 잠깐 분리됐다 붙든, 관리자가 실수로 설정을 건드렸든 전부 같은 방식으로 복구되는 거예요.

다익스트라의 원래 예제는 링 형태로 연결된 프로세스들이 토큰을 하나만 돌리게 만드는 문제였어요. 토큰이 두 개가 생기거나 아예 없어지는 이상한 상태에서 출발해도, 각 프로세스가 이웃만 보고 단순한 규칙을 따르면 결국 토큰이 딱 하나만 남게 되는 알고리즘이죠.

그런데 왜 '조합'이 문제냐면

자기안정화 알고리즘 하나를 만드는 건 어렵지만 할 수 있어요. 문제는 두 개를 합칠 때예요. 예를 들어 A는 리더를 뽑는 자기안정화 알고리즘이고, B는 리더가 있다는 전제 아래 스패닝 트리를 만드는 자기안정화 알고리즘이라고 해봐요. A와 B를 합치면 전체도 자기안정화될까요? 직관적으로는 그럴 것 같은데, B가 A의 출력을 쓰는 동안 A가 아직 수렴 중이면 B는 잘못된 리더를 기준으로 열심히 트리를 만들고, 그 사이 A가 리더를 바꾸면 B는 다시 시작하고, 이게 반복되면 영원히 수렴 안 할 수도 있어요. 두 컴포넌트가 서로의 출력에 의존하는 순환 구조가 되면 더 심각해지고요.

지금까지 알려진 해법들은 있어요. 가장 고전적인 건 계층 조합이에요. 아래층이 먼저 수렴하고, 그 위층은 아래층이 안정된 후에 수렴한다는 걸 층별로 증명하는 방식인데, '수렴 계단'이라고도 불러요. 또 공정 조합이라고 해서 두 컴포넌트가 번갈아 실행될 기회를 공정하게 받으면 각각의 안정화가 합쳐진다는 결과도 있고요. 로컬 검사와 로컬 교정처럼 각 노드가 이웃과의 관계만 확인해서 잘못을 고치면 전체가 안정된다는 접근도 있어요. 그런데 데미르바스 교수가 지적하는 건, 이 해법들이 각각 특정 조건에서만 동작하는 '기법 모음'이지, 타입 시스템처럼 '부분의 성질에서 전체의 성질을 기계적으로 도출하는' 일반 이론은 아직 없다는 거예요. 글 제목의 '조합 가능한 이론을 찾아서'가 바로 그 빈자리를 가리키는 거죠.

이게 쿠버네티스랑 무슨 상관이냐면

쿠버네티스의 컨트롤러는 사실상 자기안정화 알고리즘이에요. 원하는 상태를 선언해 두면, 컨트롤러는 현재 상태를 읽고 차이를 줄이는 행동을 반복해요. 파드가 죽었든, 노드가 사라졌든, 누가 kubectl로 직접 지웠든 신경 안 쓰고 '현재와 목표의 차이'만 봐요. 이게 정확히 다익스트라의 아이디어예요. 그리고 조합 문제도 그대로 재현돼요. HPA와 VPA를 같은 워크로드에 동시에 걸면 서로 스케일 값을 바꾸면서 진동하는 문제가 대표적이고, 여러 오퍼레이터가 같은 리소스를 건드리면서 끝없이 갱신하는 무한 조정 루프도 흔한 장애예요. 각 컨트롤러는 혼자서는 잘 수렴하는데 합치면 안 하는 거죠. Dynamo나 Cassandra의 안티엔트로피, 가십 프로토콜, 얼랭의 슈퍼바이저 트리, 카오스 엔지니어링까지 전부 '아무 상태에서 시작해도 돌아온다'는 같은 철학 위에 있어요.

한국 개발자에게는

오퍼레이터나 컨트롤러를 직접 짜는 분이라면 세 가지를 기억하시면 좋아요. 첫째, 이벤트가 아니라 상태를 보세요. '파드 삭제 이벤트가 왔으니 하나 만든다'가 아니라 '현재 파드 수와 목표 수의 차이를 줄인다'로 짜야 이벤트를 놓쳐도 복구돼요. 둘째, 조정 로직은 멱등해야 해요. 같은 상태에서 몇 번 실행해도 결과가 같아야 재시도가 안전하거든요. 셋째, 컨트롤러 사이 의존 관계를 그림으로 그려보세요. 순환이 있으면 진동 가능성을 의심해야 하고, 계층으로 정리할 수 있으면 아래층부터 수렴한다는 걸 확인하는 게 곧 위에서 말한 계층 조합이에요. 더 깊이 가고 싶다면 TLA+로 조정 루프를 모델링해 보는 것도 추천해요. 데미르바스 교수 본인이 TLA+ 전도사이기도 하고요.

정리하면

'선언한 대로 알아서 맞춰가는 시스템'의 이론적 이름이 자기안정화이고, 그걸 여러 개 안전하게 합치는 일반 이론은 50년이 지난 지금도 미완성이에요.

여러분은 컨트롤러나 조정 루프끼리 충돌해서 진동한 경험 있으신가요? 그때 어떻게 풀었는지 궁금해요.


🔗 출처: Hacker News

SOURCE · HACKER NEWS
원문 전체 보기 → http://muratbuffalo.blogspot.com/2026/09/in-search-of-compos...
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기
처리 중...