퍼베이시브 컴퓨터 시스템 수업 시간에 발표했던 논문을 정리하였다. 물론 나중을 위해서다.
용어 설명
논문에서 사용하고 있는 용어에 대한 설명과 내가 나름대로 바꿔서 사용하고 있는 것들은 다음과 같다.
server-side infrastruct | 서버쪽에서 서비스를 해주는 방식 |
client-side infrastruct | 클라이언트쪽에서 서비스를 해주는 방식 |
failures | DNS 서비스 실패, 여기서는 그냥 '실패' 라고 표기하겠다 |
resolve | 요청된 도메인 네임을 IP 주소로 변환해주는 과정 |
Planetlab | 넓은 지역에 걸쳐 분산된 testbed 로서, 세계적으로 150 곳의 client-side DNS infrastructure 를 모니터링 할 수 있다 |
Abstract
Domain Name 시스템(DNS) 는 인간이 사용하기 편한 도메인 네임을 기계가 식별할 수 있는 숫자형태의 IP 주소로 변환하는 일을 한다.
Client 의 성능(CPU, 메모리)이 좋아짐에 따라, 기존의 DNS 에 대한 연구는 server-side infrastruct 에 초점을 맞춰왔다.
그러나, client-side 의 DNS 실패가 빈번해짐에 따라, DNS 의 성능과 신뢰성에 대한 저하가 발생했다.
Introduction
앞서 client-side 의 DNS 실패문제를 해결하기 위해서 여기서는 CoDNS 라는 새로운 개념을 소개한다. CoDNS 의 특징으로는 다음과 같다.
- Lightweight : 가볍다
- Cooperative DNS lookup service : 기존의 DNS 와 상호 연동 한다
- Use insurance-like model : Insurance 모델을 사용한다
- Use locality-enhancement techniques and proximity optizization : 낮은 오버헤드와 짧은 지연시간을 보장한다
Background & Analysis
DNS 의 실패는 해당 서비스들(WEB, Mail)에 실패나 delay 의 원인이 된다.
server-side infrastructure 의 DNS 는 계층구조로 구성되어 있다. 최상위 단에 있는 root server 는 중심적인 역할을 한다. top-level server 는 root server 밑에 있으며, 각 조직을 대표한다. (ex: .com, .net, .kr)
Planetlab 이라고 하는 testbed 를 이용한 여러가지 실험을 통해 얻은 결과값으로 CoDNS 의 성능을 증명할 것이다.
Frequency of Name Lookup Failures
Planetlab 을 이용한 여러가지 실험을 통해 기존의 DNS 가 어떤 문제점을 가지고 있는지 알아본다.
대부분의 노드들은 실제로 긴 응답시간을 가지고 있지만, DNS cache 를 사용해서 성능을 크게 향상 시키고 있다. 또한 응답시간이 1000ms 이상인 DNS 실패의 경우, 전체 응답시간의 적은 부분을 차지하지만, 전체적으로 DNS 의 성능을 저하시킨다.
Origins of the Client-Side Failures
응답시간이 1000ms 가 넘는 DNS 실패가 일어나는 요인에 대해서 크게 4가지로 분류하고 있다.
Packet Loss
대부분의 DNS 가 UDP 를 사용하기 때문에, 쿼리에 대한 요청이나 응답중에 packet loss 가 발생할 수 있다. LAN 환경에서는 packet 이 hop 을 많이 거칠 수록 packet loss rate 가 증가한다.
Nameserver overloading
네임서버의 특정상황에서 발생할 수 있는데, 예를 들면, 네임서버가 특정시간(8:00 ~ 18:00) 에 DNS 실패율이 높다면, 그것은 업무시간에 부하가 많이 걸려서 이다. 또한 buffer 가 가득차면, 차후에 들어오는 packet 은 버려진다. 그래서 충분한 buffer size 의 확보가 필요하다.
Resource competition
네임서버 내의 다른 프로세스에 의해 매시간 또는 매분 마다 발생할 수 있다. 예를 들면, cron 에 의한 heavy process 때문에 프로세스 간에 충돌이 일어날 수 있다.
Maintenance problems
예기치 않은 서비스 인터럽트에 의해 발생할 수 있다. 예를 들면, 특정한 시간에 네임서버가 다운 되어 버리는 경우가 그렇다.
Design
CoDNS 의 디자인은 최소한의 오버헤드를 가지면서, 빠르고 신뢰할 수 있는 DNS 서비스를 name lookup 시스템 에 제공하여야 한다.
또한 Insurance-like 모델을 사용한다.
- 노드는 필요한 시간에 리소스를 공유할 수 있는 pool 에 가입(join)한다.
- 만일 노드의 성능이 가능하면, 그냥 실행하고 노드에 문제가 있으면, 서비스를 제공한다.
- 로컬 성능이 떨어지면, 도와주기 위해 다른 노드에 물어볼 수 있다.
- 가입(joining)하는 것의 장점은 다른 시간에 오버헤드가 걸리더라도, 필요할 때 도와줄 수 있다는 것이다.
Cross-site Correlation of DNS Failures
관계된(correlation) 노드에서 실패가 일어났을 때, 관계를 끊어서(uncorrelation) 전체적으로 높은 성능을 유지할 수 있다.
CoDNS
CoDNS 의 local name service 의 문제가 발생했을 때, peer node 에 쿼리를 보낸다.
쿼리를 보낼때 고려해야 할 점으로는,
- 쿼리의 지역성(locality) 와 노드의접근성(proximity) 와 이용가능성(availability)
- 쿼리를 언제 보내는 것이 적당한가?
있다. 주변에 extra peer node 를 하나 이상 가지고 있으면, 응답시간이 절반 이상으로 줄어든다.
Trust, Verification, and Implications
CoDNS 에 있어서 요청자(requestor) 을 구별하고, 요청에 있어서 올바르게 resolve 하고, 유효한 ip 주소를 제공하는 것이 중요하다.
만일, peer 간에 타협(compromise) 이 이루어지거나, 그렇지 않아서 failure 될 때 turst 나 verification 에 관련한 문제가 발생할 수 있다.
하지만, 현재 이런 문제에 대한 일반적인 해결책은 없는 상태이다.
여기서는 DNSSEC 라는 것에 대해서 소개하고 있다. 이것은 DNS 스푸핑 같은 공격으로 부터 DNS 를 보호하기 위해 만들어졌다. 하지만, 개발된지 10년이 넘은 지금 아직 널리 사용되지 못하고 있다.
Implementation
Codns 는 stand-alone 으로 동작하며, remote 쿼리에 대해서는 UDP 를, local 쿼리에 대해서는 루프백 TCP를 사용한다. 데몬은 event-driven 이고, 마스터 프로세스와 여러개의 슬레이브 프로세스로 구성되어 있다.
마스터 프로세스 | name lookup 의 요청을 클라이언트로 부터 받아서, idle 상태의 슬레이브 프로세스에 넘겨준다 |
슬레이브 프로세스 | gethostbyname() 을 호출함으로서 resolve 하고, 결과를 다시 마스터 프로세스에게 넘겨준다 |
마스터 프로세스는 클라이언트로 부터 오는 요청의 도착시간과 일정한 주기안에 슬레이브로 부터 응답이 오지 않을 때, peer 노드로 UDP name lookup 쿼리를 보내는 시간을 기록한다.
Remote Query Initiation & Retries
초기 delay 는 첫번째 쿼리를 보내기 전에 네임서버와 peer 의 응답의 최근 성능에 기초로 해서 조정되어 진다.
쿼리가 보내지면, delay 는 '쿼리의 평균 응답시간 + 표준편차' 로 세팅된다.
Proximity, Locality and Availability
각 CoDNS 노드는 적당한 지연시간의 바운더리 안에서의 이웃(neighbor)노드로 묶일 수 있고, 관리되어 질 수 있다. CoDNS 가 시작할 때, 다른 CoDNS 노드에 매 초마다, heartbeat 를 보낸다.
이에 대한 응답에는 round trip time(RRT) 와 peer 노드에서의 로컬 네임서버의 평균 응답시간이 포함되어 진다.
만일 서비스가 아직 사용가능하다면, 선택된 이웃노드의 생존성(liveness)은 주기적으로 체크해볼 수 있다. 죽은(dead) 노드들은 다른 노드로 교체된다.
Policy & Tunability
CoDNS 는 네크워크 환경이나 정책에 맞게 inital delay 와 retry 를 적당하게 조정할 수 있다.
Bootstrapping
CoDNS 는 resolve 하면서 부터 bootstrapping 문제를 가지고 있다. 이 문제를 방지하기 위해서는 시작할 때, resolve 를 백그라운드(background) 에서 실행하는 것이다. 그러면, start time 을 크게 줄일 수 있다.
Evaluation / Live Traffic
여기서는 앞에서 설명한 CoDNS 에 대한 장점들을 바탕으로 여러가지 실험을 통해 증명해 보이고 있다.
Other Approaches
Private Nameservers
네임서버가 오버로드가 걸릴때, 각 네임서버에 private nameserver 를 사용할 수 있다.
이것은 몇 가지 이유로 인해 주(primary) 네임서버에 비해 private 네임서버가 백업용도로 좀더 실행될 수 있다.
private 네임서버로 인해 Shared cache 가 좀더 커졌고, cache 의 효과(effectiveness)가 증가했다. 이런 이유로 용량 때문에 강제로 삭제되어야 하는 경우가 줄어들었다.
cache miss 의 증가는 DNS 실패로 이어져 결국, 전체적인 성능과 신뢰성을 저하시킨다.
Secondary Nameservers
대부분의 사이트 들이 두대 이상의 네임서버를 운영하고 있고, 각각 다른 설정을 통해 좀더 적극적인(aggressive) 서비스를 제공할 수 있다.
가능한 옵션은 여러대의 네임서버에 쿼리를 보내고, 좀더 빠르고 적극적인(aggressive) Secondary 네임서버를 선택하는 것이다.
Secondary 네임서버는 주(primary) 네임서버의 뒤에 위치함으로서, 사용량이 적은 경향이 있다. H/W 를 업그레이드 함으로서, Secondary 네임서버로 보내지는 쿼리의 수를 증가시킬 수 있다.
TCP Queries
이것은 UDP 대신에 TCP 를 사용하여, 로컬 네임서버와 통신하는 것을 말한다.
UDP 버퍼 오버플로우 때문에, packet loss 나 packet drop 이 발생할 수 있다. TCP 는 신뢰성있는 배달(delivery)를 보장한다. 게다가 flow control 을 통해 네임서버가 오버로드 될 때, 클라이언트를 slow down 시킨다.
그러나 TCP 는 모든 쿼리마다 2 개 대신 9 개의 packet 을 필요로 한다. 3 개는 연결을 성립하는데, 2 개는 요청과 응답에, 나머지 4 개는 연결을 분할하는데 쓰인다. 이러한 TCP 의 단점을 극복하기 위한 방법으로 persistent TCP 가 있는데, 이 것은 연결할 때, 매 쿼리마다 오버헤드를 지웠다.
하지만, 1개 또는 2개의 응답(ACK) network packet 이 추가된다.
실험결과, persistent TCP 가 기존의 TCP 보다는 평균 응답 시간이 빨랐지만, CoDNS 보다는 느렸다.
Conclusion
앞에서 실험들을 통해, 여기서는 가볍고 name lookup service 인, CoDNS 의 장점을 알아보았다. CoDNS 는 낮은 오버헤드, 절반 또는 그 이상의 평균 응답 시간, 그리고 DNS 서비스의 사용률을 높이는 데 목적이 있다.
Strong Point, Weak Point
Strong Point | 여러가지 다양한 실험을 통해, CoDNS 의 장점을 증명했다 |
Weak Point | 여기서 언급하는 concept 이 새로운 것이 아니고, 단지 기존의 문제점을 보완한 측면이 있다 |