폴링 말고 푸시
유일하게 당신에게 찾아오는 출처, 그리고 그것이 당신이 믿어도 되는 것에 대해 바꿔 놓는 두 가지
Michel Wijnberg
이 시리즈에 지금까지 나온 모든 출처는 Osprey가 찾아가서 묻는 것들이었습니다. GRE 레코더가 영역에 합류해 데이터베이스를 청합니다. SNMP 워크가 장비에 테이블을 청합니다. 묻고, 기다리고, 받고, 반복합니다.
BMP만이 제 발로 찾아옵니다. 라우터가 모니터링 스테이션으로 TCP 세션을 열고 말하기 시작하며, 할 말이 있는 한 계속 말합니다(RFC 7854). 아무도 무엇도 폴링하지 않습니다.
그건 그냥 더 낫게 들리고, 한 축에서는 실제로 그렇습니다. 다른 두 축에서는 당신이 무엇을 결론지어도 되는지를 바꾸는데, 그 둘이 속도보다 더 흥미롭습니다.
제 발로 찾아온다는 것이 사 주는 것
폴링에는 표본 추출 간격이 있고, 표본 추출 간격에는 표본 추출 간격의 모든 성질이 있습니다. 한 주기 안에서 일어났다가 되돌아간 일은, 당신의 데이터에 관한 한 일어나지 않은 일입니다. 두 번의 워크 사이에 두 번 플랩한 경로는, 한 번도 움직이지 않은 경로처럼 보입니다.
푸시되는 스트림에는 주기가 없습니다. 철회가 도착하는 것은 철회가 일어났기 때문이고, 거기 찍힌 시각은 라우터의 것이지 폴러의 것이 아닙니다.
BGP에서는 이것이 다른 대부분의 것보다 더 중요합니다. BGP는 토폴로지보다 훨씬 자주 바뀌기 때문입니다. 풀 테이블을 5분마다 워크하는 것은 엄청나게 비싸면서, 동시에 짧게 스쳐 가는 모든 것에 대해서는 눈이 멉니다. “이 프리픽스가 언제 바뀌었나”라는 질문에 믿을 만한 답이 있는 모델은 푸시뿐입니다.
대가 하나: 침묵이 아무 뜻도 없게 된다
이제 폴링이 공짜로 얻고 있는 부분입니다.
묻고 아무것도 받지 못한 폴러는 무슨 일이 있었는지 정확히 압니다. 물었고, 아무것도 받지 못했다는 것입니다. 그 부재 자체가 시각이 찍힌 관측이고, 재시도할 수도 있습니다.
아무것도 듣지 못한 청취자에게는 그런 호사가 없습니다. 네트워크가 조용하든 세션이 사라졌든, 선로 위의 침묵은 똑같습니다. 그리고 두 번째 경우는 다른 무언가가 알려 주기 전까지 첫 번째와 구별되지 않습니다.
이 구체적인 위험은 이름을 붙여 둘 만합니다. 당신이 손을 뻗을 바로 그 지표를 뒤집어 놓기 때문입니다. 끊긴 세션을 “변화 없음”으로 취급하면, 더 이상 아무것도 들리지 않는 그 피어가 보고서에서 가장 안정적인 피어가 됩니다. 화면에서 가장 조용한 줄이 바로 당신이 잃어버린 상대입니다. 처른으로 정렬하는 모든 순위표는 당신의 사각지대를 맨 위에 올려놓고, 가장 건강한 관계라는 이름표를 붙입니다.
12편이 Osprey가 이에 대해 무엇을 하는지, 즉 세션 끊김을 대량 철회가 아니라 모니터링 공백으로 기록한다는 것을 다루고 있으니 여기서 되풀이하지 않겠습니다. 이 시리즈에서의 요점은 더 좁습니다. 푸시는 침묵을 해석하는 부담을 프로토콜에서 당신에게로 옮깁니다. 폴링 모델은 그 답을 건네주었고, 당신은 그것을 생각할 필요가 없었습니다.
대가 둘: 당신은 남의 대화를 읽고 있다
두 번째 대가는 더 미묘하고, 실제 파서 버그를 만들어 냅니다.
BMP는 당신에게 BGP 세션을 주지 않습니다. 남의 세션 위에 오간 메시지의 사본을 감싸서 전달해 줄 뿐입니다. 당신은 그 협상 자리에 없었고, BGP 메시지는 자기 기술적이지 않습니다. UPDATE를 어떻게 디코딩할지는 두 피어가 OPEN에서 무엇에 합의했느냐에 달려 있습니다.
당연한 접근은 그 맥락을 재구성하는 것입니다. Peer Up이 양쪽 OPEN 메시지를 실어 오므로, 무엇이 협상되었는지 읽어 세션 동안 기억해 둘 수 있습니다. Osprey는 그렇게 합니다.
그리고 그다음부터 각 메시지의 피어별 헤더에는 A 플래그가 실려, 감싸인 PDU가 예전의 2바이트 AS_PATH 형식을 쓰는지를 나타냅니다(RFC 7854 §4.2). 이것은 메시지 단위이므로, 파서는 Peer Up 맥락에서 형식을 가정하는 대신 그 메시지를 이 플래그에 따라 디코딩합니다.
이 둘은 서로 어긋날 수 있습니다. 어긋날 때 Osprey는 플래그를 따라 디코딩하고, 그 불일치를 조용히 해소하는 대신 기록합니다. 그 논리는 일반화되므로 밝혀 둘 만합니다. 능력 정보는 두 라우터가 무엇을 하기로 합의했는지를 기록하고, 플래그는 이 익스포터가 이 메시지에 무엇을 했는지를 기술합니다. 합의에 대한 증거와 지금 손에 든 바이트에 대한 증거가 충돌할 때, 파싱되고 있는 것은 손에 든 바이트 쪽입니다.
Add-Path에도 대응되는 미묘함이 있고, 모양은 같습니다. 감싸인 NLRI가 경로 식별자를 싣는지는 방향성이 있는 협상에 달렸고, 어느 방향이 적용되는지는 어느 RIB를 모니터링하고 있는지에 달렸습니다. 기본인 Adj-RIB-In이냐, RFC 8671이 추가했고 같은 피어별 헤더의 또 다른 플래그로 표시되는 Adj-RIB-Out이냐 입니다. 그래서 파서는 그 플래그를 먼저 읽고, 그로부터 어느 협상을 믿을지 고릅니다. 같은 필드, 두 가지 읽기, 그리고 그것을 고르는 것은 당신이 그 세션의 당사자였다면 들여다보지 않았을 비트입니다.
장비를 폴링할 때는 이 중 무엇도 생기지 않습니다. 당신은 스스로가 일급 당사자인 프로토콜에서, 어떤 장비에게 그 장비 자신에 대해 묻고 있습니다. BMP는 라우터 자신의 시야를 건네주면서 그것이 협상된 맥락은 가져가 버리고, 그 맥락을 재구성하는 모든 필드는 하중을 집니다.
두 수집 방식이 하나의 표에 들어오고, 차이는 두 열에서 드러납니다. BMP 행의 마지막 확인은 하루 전이지만 이는 결함이 아닙니다. 그 세션들에는 바뀐 것이 없고, 밀어 주는 방식의 출처는 바뀐 것이 없으면 침묵합니다. SNMP 행이 방금이라고 말하는 것은 누군가 가서 물었기 때문입니다. 같은 주장이지만 믿을 근거는 전혀 다르고, 침묵이 정보가 되는 쪽은 한쪽뿐입니다.
청하지 않으면 결코 오지 않는 보고서
마지막으로 하나, 가장 작고 가장 성가신 것입니다.
BMP는 Statistics Report를 정의합니다. 피어별 주기 카운터이고, 그 피어의 정책이 무엇을 버리고 있는지 알려 주는 거부 수와 treat-as-withdraw 수도 들어 있습니다. 훌륭한 데이터입니다. 스코어카드에 딱 원하는 것이죠.
그것들은 오지 않습니다.
파서 버그 때문도 아니고, 익스포터가 고장 나서도 아닙니다. IOS는 보고 주기를 일러 주지 않는 한
Statistics Report를 그냥 보내지 않으며, 기본값도 없습니다. BMP 서버 설정 아래에
stats-reporting-period가 없으면 그 메시지 유형은 선로 위에 한 번도 나타나지 않고, 피어별 통계
필드는 어디에도 오류 하나 없이 영원히 비어 있게 됩니다.
랩은 한동안 그렇게 돌았고, 빈 칸들의 정직한 독법은 “이 피어는 아무것도 거부하지 않는다”가 아니었 습니다. “이 라우터에게 말하라고 아무도 시킨 적이 없다”였습니다. 수정은 라우터 여섯 대에 설정 한 줄, 그것도 재부팅이 측정을 조용히 되돌리지 않도록 startup-config에 써 넣는 것이었습니다.
작은 운영상의 세부이지만 일반적인 모양을 하고 있습니다. 푸시 출처는 자기가 보내도록 설정된 것만 당신에게 말해 줄 수 있습니다. 폴링에서는 질문을 언제 던질지 당신이 통제합니다. 푸시에서는 익스포터가 내보내도록 설정된 것만 관측하게 되고, 보내지지 않은 메시지는 애초에 생성되지 않은 메시지와 구별되지 않습니다.
요점
푸시는 더 낫고, 공짜가 아닙니다.
BGP처럼 빠르게 바뀌는 것에 대해 믿을 만한 유일한 타임라인을 얻는 대신, 폴링이라면 한 번도 생각하게 만들지 않았을 두 가지를 내놓습니다. 침묵이 예전에는 관측이었다는 것, 그리고 당신이 읽고 있는 그 대화의 당사자가 예전에는 당신이었다는 것.
둘 다 이 코드베이스에서는 작고 구체적인 배려로 나타납니다. 공백으로 기록되는 세션 끊김. 능력 정보가 아니라 플래그에서 취해지는 AS_PATH 폭. 비어 있으면서 그 이유를 아는 통계 칸. 어느 것도 영리하지 않습니다. 전부 같은 인정입니다. 제 발로 찾아온 메시지는, 자기 자신의 부재에 대해, 당신이 직접 던진 질문보다 적게 말해 준다는 것.
이것으로 이 시리즈를 마칩니다. 관통하는 무언가가 있다면, 이 제품의 모든 답은 그것이 어떻게 얻어 졌는지에 대해 내놓을 수 있는 해명만큼의 값어치를 갖는다는 것입니다.