입력 및 출력을 서로 다른 집합으로
네트워크 아키텍처에서의 이분 그래프
이분 그래프는 노드를 두 개의 집합으로 나누며, 엣지는 오직 집합 간에만 허용됩니다(같은 집합 내에서는 허용되지 않음).
네트워크 경계에는 자연스러운 이분 구조가 있습니다:
- 입구 측: 한쪽에는 외부 클라이언트, 다른 쪽에는 내부 서비스가 위치합니다. 엣지: 들어오는 외부 요청, 나가는 내부 응답.
- Egress 측: 한쪽에는 내부 서비스, 다른 쪽에는 외부 대상이 있습니다. 엣지: 내부 서비스가 시작하는 아웃바운드 호출, 그리고 돌아오는 외부 응답.
비대칭성:
- Ingress: 소스 집합은 무한정입니다(인터넷의 누구나). 대상 집합은 작습니다(몇 개의 서비스). 볼륨은 사용자 수에 따라 확장됩니다.
- Egress: 소스 집합은 작습니다(몇 개의 내부 서비스). 대상 집합은 유한합니다(몇 개의 알려진 파트너). 볼륨은 내부 활동에 따라 확장됩니다.
단일 박스 설계는 하나의 노드를 통해 이분 그래프의 양쪽을 모두 통합합니다. 해당 노드는 외부에서 들어오는 팬인(ingress)과 내부에서 들어오는 팬인(egress의 역방향)을 모두 가집니다. 노드의 부하 = 양쪽의 합계.
분리 설계는 이분 그래프의 양쪽을 별도의 노드에 유지합니다. 각 노드는 적절한 확장 축을 가진 하나의 역할을 처리합니다.
분할 이전: 어디에나 있는 절단 꼭짓점
단일 박스: 모든 것을 지탱하는 하나의 꼭짓점
분할 이전에는 모든 외부/내부 쌍 사이에 단일 프록시 박스가 위치합니다. 그래프 관점에서 이는 고차 컷 정점(cut vertex)입니다: 이 정점을 제거하면 모든 클라이언트가 모든 백엔드와, 모든 내부 서비스가 모든 외부 파트너와 연결이 끊깁니다.
이 노드의 연결성(Connectivity)은 1입니다. 이 노드를 방해하는 모든 것(프로세스 충돌, 네트워크 장애, OOM 킬)은 모든 종속 경로의 연결을 끊습니다.
분할 이후: 컷 정점이 두 개의 가벼운 노드로 대체됨
인그레스(ingress)와 에그레스(egress)로 분할하면 하나였던 그래프 노드가 두 개가 됩니다. 각 노드는 이제 이분 그래프(bipartite)의 한쪽 절반에만 위치합니다:
- 인그레스 노드: 외부 클라이언트에서 내부 서비스로 가는 이분 그래프 절반에 대한 컷 정점
- 에그레스 노드: 내부 서비스에서 파트너로 가는 이분 그래프 절반에 대한 컷 정점
헤어핀 루프(hairpin loop)가 기하학적으로 사라집니다: 단일 박스 그래프에서 내부 서비스가 공개 주소를 통해 외부로 노출되는 서비스에 도달하려면 같은 정점을 두 번 통과해야 했습니다(에그레스 역할로 나가고, 인그레스 역할로 들어옴). 분할된 그래프에서는 이 경위가 두 개의 서로 다른 정점을 통과합니다.
각 측면의 연결성은 여전히 1이지만, 두 개의 컷 정점은 독립적으로 대체될 수 있습니다. 두 번째 인그레스 프록시를 추가하면 에그레스 측면을 변경하지 않고 인그레스 측면의 연결성을 2로 높일 수 있습니다.
측면별 복제
생산 환경 플릿은 종종 2개 이상의 인그레스 프록시(HA)와 2개 이상의 에그레스 프록시(HA)를 실행합니다. 각 측면은 독립적으로 연결성 2를 달성합니다. 용량은 필요에 따라 각 측면에서 수평적으로 확장됩니다.
네트워크 분할 내성
종합
이제 네트워크 아키텍처를 이분 그래프로 읽고, 절단 꼭짓점을 식별하며, 각 절반에 대한 연결성을 추적할 수 있습니다.
이 개념을 네트워크 분할에 적용해 보겠습니다.
네트워크 분할은 그래프 절단입니다: 분할을 가로지르는 엣지가 실패하며, 양쪽은 계속 작동하지만 서로에 도달할 수 없습니다.
지리적으로 분산된 시스템에는 단일 DC 간 링크로 연결된 두 개의 데이터센터가 있습니다. 유입 트래픽은 DC1을 통해 들어오며, 유출 트래픽은 외부 파트너로 향하기 위해 DC1을 경유합니다. 일부 내부 서비스는 DC2에 위치하며, 상태 유지(stateful) 작업을 위해 DC1로 콜백을 수행합니다.
동반 노트
동반 노트
이 기하학 수업은 Ingress & Egress Separation 메인 수업을 이분 그래프 분석으로 재구성합니다.
다음 동반 수업인 geometry_of_failure_modes_and_blast_radius에서는 betweenness centrality(병목 노드 식별)와 min-cut(영향 범위 상한 설정)를 유도합니다.
잘 하셨습니다.