[클러스터] Clustered DNS Server(ns7) Usage.
Clustered DNS Server Usage
작성 : 넷센터 홍석범
## 개요
NS7 DNS 서버는 리눅스의 여러 Virtual Server 구성 방법중 Director 를 이용한
방식으로 이 구성 방식에 대한 기술적인 정보는 system.tt 의 자료실을 참고하기 바란다.
두 서버를 클러스터링으로 구성함으로써 평상시에는 DNS 질의가 두 서버로 각기
나누어져 질의되고 한 서버의 DNS 서버가 다운될 경우에는 3-4초 내에 다른 한
서버가 모든 질의를 받아서 처리하게 된다.
또한 Director 서버인 ns7c0 와 1번 DNS 서버인 ns7c1 서버와는 미러링으로
구성되어 있어 만약 Director 서버가 다운되었을 경우에는 ns7c1 이 Director 의
IP 를 미러링하여 서비스를 하게 된다.
이렇듯 로드 발랜싱과 미러링이 복합적으로 구성되어 있으므로 설사 어떠한 서버가
다운된다
하더라도 거의 중단없이 DNS 서비스를 할 수 있게 되는 것이다.
## 작동방식 ##
ns7 DNS 서버는 ns7c0, ns7c1, ns7c2 이렇게 총 3대로 이루어져 작동한다.
1대(ns7c0) 는 실제 DNS 서버 역할을 하는 리얼 서버의 앞단에서 로드를 분산해
주고 Fail Over 기능을 하는 일종의 L4 스위치 역할을 하는 Director 이다.
그리고 2대(ns7c1, ns7c2) 는 DNS 질의에 응답하는 실제 DNS 서버이다.
일단 모든 DNS 질의는 Director 인 ns7c0 서버에 가게 되고 ns7c0 서버는 로드
발랜싱의 스케줄 알고리즘(Weighted Least-Connection Scheduling-가중치
기반 최소 접속 스케쥴링) 에 의해 각각의 질의를 적당히(1대 1) 각 서버로 분배해
준다.
각 서버별 IP 할당 상황은 아래와 같다.
ns7c0 : 211.47.66.87 (Director)
ns7c1 : 211.47.66.88 (Real Server 1)
ns7c2 : 211.47.66.89 (Real Server 2)
ns7 : 211.47.66.90 (ns7.tt.co.kr)
## 작업방법
모든 DNS 설정은 ns7c1 에서만 하면 된다.
웹에서 작업시에는 이전에 하는것과 같은 방식으로 http://ns7c1.tt.co.kr/ 에서 하면
되고 직접 ssh 로 접속하여 작업시에는 ns7c1.tt.co.kr 로 접속하면 된다.
여기에서 주의할 점은 웹에서 작업시에는 특별히 문제가 없으나 직접 ssh 로 접속하여
작업한 후에는 재설정시 killall -HUP named 대신 반드시 refresh 를 실행하여야 한다.
그래야만 ns7c1 에서 작업한 내용이 ns7c2 에도 바로 반영이 되기 때문이다.
따라서 가급적이면 웹에서 모든 작업을 할 것을 권장한다.
# DNS 서버의 로드발랜싱 상황은 http://ns7.tt.co.kr/ 에 접속하면 실시간으로
확인 가능하다.
(웹데몬의 로드 발랜싱이 아니라 DNS 데몬의 로드 발랜싱 상황이다.)
======== Belows are more technical usage about Linux Virtual Server
Operation,
So windows staffs need not read anymore.
But I wish that Linuxstaff@ would read and Fully
understand.==========
# Director 에서의 설정
기본적인 설정은 /root/cluster 에 있으며 check.cgi 가 무한루프로 돌며
각 서버의 DNS 데몬의 이상 유무를 체크한다.
* arp.cgi : 커널 패치로 해결하였으나 혹시나 있을지 모를 arp problem 에 대비하기
위해 일정 시간(10분)마다 ARP Refresh 를 한다.
* dns.monitor : dns 를 모니터링하는 모듈로 상황에 맞게 소스를 다소 수정하였다.
각 DNS 서버에 질의를 하여 ok 메시지가 떨어지면 응답한 것으로 그렇지 않으면 다
운된 것으로 처리한다. 작동예는 아래와 같다.
ex) ./dns.monitor -zone tt.co.kr -master 211.47.65.75 211.47.65.75
–> 211.47.67.75 에게 tt.co.kr 의 resolving 여부를 질의.
* check.cgi : 각 DNS 서버의 이상 유무를 체크하여 이상 발생시 해당 서
버를 클러스터링 목록에서 제외하여 이상이 발생한 서버로는 dns 질의가 전달되지
않도록 한다.
아울러 이상 발생시 linuxstaff@ 로 다운되었음을 e-mail 로 통보한다.
* lvs : 실질적으로 로드 발랜싱을 시작하고 멈추는 역할을 하는 스크립트이다.
./lvs stop 하면 로드 발랜싱을 멈추고 ./lvs start 하면 로드 발랜싱을 시작한다.
./lvs stop 을 하면 실제 DNS 서버가 작동하지 않게 되므로 주의하기 바란다.
부팅시 자동으로 lvs 가 시작되도록 설정되어 있으며 만약 ns7c1 서버가 다운된 후
복구되어 클러스터링 목록에 추가할 경우에는 ./lvs restart 를 하면 된다.
현재의 클러스터링 목록은 ipvsadm 로 확인할 수 있다.
* http_lvs : 웹에서 로드 발랜싱 상황을 볼 수 있도록 하는 설정이다.
로드 발랜싱 상황은 http://ns7.tt.co.kr/ 에 접속하면 실시간으로 확인 가능하다.
(웹데몬의 로드 발랜싱이 아니라 DNS 데몬의 로드 발랜싱 상황이다.)
* require.cgi : check.cgi 에서 require 하는 변수이다.
# ns7c1 에서의 설정
* /etc/inetd.conf
rsync stream tcp nowait root /usr/bin/rsync rsyncd –daemon 가 설정되어
ns7c1 에서 rsync 로 /var/named 를 동기화하도록 한다.
* /etc/rsyncd.conf
[named]
path = /var/named
comment = named
uid = root
gid = root
use chroot = yes
read only = yes
hosts allow = 211.47.66.89
* /usr/bin/refresh
#!/bin/sh
killall -HUP named
echo > /var/named/null
이는 ns7c1 에서 업데이트를 했을때 ns7c2 에서도 자동으로 업데이트를 하기 위한
설정이다.
즉, 설정 변경후 killall -HUP named 를 하였을때 /var/named 에 null 이라는 파
일을 갱신하고 ns7c2 에서는 null 이 갱신된 것을 확인하여 ns7c2 에서도 named
를 업데이트하게 되는 것이다.
>> ns7c1 에서의 미러링 설정
ns7c1 서버는 /root/check 디렉토리에서 Director 에 대해 지속적으로 체크를 하여
만약 다운이 되었을 경우에는 Director 의 IP 를 takeover 하고 다운사실을
linuxstaff@ 에게 e-mail 로 통보한다.
Director IP 의 다운이 복구된 후에는 Director 서버에서 /root/cluster/arp/arp.sh
를 실행해 주면 된다.
# ns7c2 에서의 설정
* /etc/crontab
0-59/1 * * * * root run-parts /etc/cron.min 설정 추가.
/etc/cron.min/rsync.cgi 에서는
/root/check/rsync.sh 을 실행하여 rsync 시 null 이 포함되어 있으면
(ns7c0 에서는 killall 을 할 때마다 null 의 정보를 갱신하도록 되어있다.)
기존의 named.conf 를 backup 하고 새롭게 업데이트하며 /var/named 에 있는
zone 파일 역시 가지고 온 후 named 를 재설정하여 ns7c1 과 동일한 정보를 가지고
있다.
ns7c0 과 ns7c1 의 정보 차이는 이론상 최대 1분간의 갭이 있을 뿐이며 실제로는
실시간으로 동기화된다고 생각해도 무방하다.
## If you have any questions or comments, please notify me,
antihong.