PDNS ?

PowerDNS사에서 만든 오픈소스 DNS 데몬 입니다. 데이터베이스에 데이터를 저장하여 신뢰성 있는 DNS 기능을 제공합니다. Poweradmin 이라는 Web interface와 연동하여 사용 가능합니다.

 

서버 구성도

 PDNS 서버를 이중화 구성하여 보다 더 안전한 서비스가 가능하도록 구성.

1. Master, Slave 두 서버에 PDNS 데몬 구동 후 DB에 VIP로 연결할 수 있도록 설정합니다.
2. Pacemaker를 이용하여 Master 서버에 장애가 발생 시 DB, Apache, DRBD 서비스를 Slave 서버에서 서비스 하도록 합니다.
3. DRBD 파티션에는 DB, Web Data를 저장합니다.

 

 

■ 구축환경

■ OS
- Centos Linux release 7.9.2009 (Core)
- APM 버전은 최신 버전으로 설치했으며, PDNS 데몬은 4.6.x로 설치했습니다.

■ 테스트에 사용한 IP
 - 실제 테스트 당시에는 Public IP를 사용하였으니 참고 바랍니다.

 

■ DRBD 구성

0. 호스트 등록

# /etc/hosts
192.168.0.100 pdnsm.hktest.shop pdnsm

192.168.0.101 pdnss.hktest.shop pdnss

 

1. DRBD 설치 ( Master & Slave )

# yum -y install https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# yum -y install kmod-drbd84 drbd84-utils

# drbd 모듈 확인 (확인이 되지 않을 경우 모듈로드)
# lsmod |grep drbd
# modprobe drbd

 

2. DRBD 설정 ( Master & Slave )

global {
usage-count yes;
}


common {
syncer {
}
}


resource "r0" {
protocol C;
startup {
wfc-timeout 0;
degr-wfc-timeout 120;
}
disk {
on-io-error detach;
}
net {
timeout 60;
connect-int 10;
ping-int 10;
max-buffers 2048;
max-epoch-size 2048;
}


on pdnsm.hktest.shop {
device /dev/drbd0;
disk /dev/xvdb1;
address 192.168.0.100:7787;
meta-disk internal;
}


on pdnss.hktest.shop {
device /dev/drbd0;
disk /dev/xvdb1;
address 192.168.0.101:7787;
meta-disk internal;
}


}

 

3. DRBD Meta data 생성 ( Master & Slave )

# drbdadm create-md r0
# systemctl start drbd

 

4. Primary 지정 및 파일시스템 생성 ( Master )

# drbdadm primary --force r0

# primary 지정 후, drbd sync가 진행되고 있는지 확인.

# cat /proc/drbd


# sync 완료 후, 파일 시스템 생성
# mkfs.ext4 /dev/drbd0
# mount /dev/drbd0 /home

 

■ Pacemaker 구성

1. pacemaker 설치 ( Master & Slave )

# yum install -y pacemaker corosync pcs psmisc policycoreutils-python
# systemctl enable pcsd
# systemctl enable corosync
# systemctl enable pacemaker
# systemctl start pcsd
# echo 'testpdnS' | passwd --stdin hacluster

 

2. cluster node 인증 ( Master )

# pcs cluster auth pdnsm pdnss
Username: hacluster
Password:
pdnss: Authorized
pdnsm: Authorized

 

3. cluster 구성 ( Master )

# pcs cluster setup --name pdns_cluster pdnsm pdnss
# pcs cluster start --all
# pcs cluster enable --all
# pcs property set stonith-enabled=false

 

4. Resource 등록 ( Master )

# pcs cluster cib pdns_cfg

# pcs -f pdns_cfg resource create Data ocf:linbit:drbd drbd_resource=r0 op monitor timeout="30" interval="20" role="Master" op monitor timeout="30" interval="10" role="Slave"
→ “drbd r0” 리소스의 대한 설정으로 Primary/Secondary가 변경이 된다.

# pcs -f pdns_cfg resource master DataSync Data master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
Data 리소스의 Master / Slave 구성 제약조건.

# pcs -f pdns_cfg resource create storage ocf:heartbeat:Filesystem device="/dev/drbd0" directory="/home" fstype="ext4"
drbd 파티션과 파일시스템을 지정하여 mount 시키는 리소스.

# pcs -f pdns_cfg resource create VirtualIP ocf:heartbeat:IPaddr2 ip=192.168.0.200 cidr_netmask=32 nic=eth0:0 op monitor timeout="30" interval="20" role="Master" op monitor timeout="30" interval="10" role="Slave"
VIP에 대한 Resource 설정.

# pcs -f pdns_cfg resource create Apache lsb:apache op monitor timeout="30s" interval="20s" role="Master" op monitor timeout="30s" interval="10s" role="Slave"

# pcs -f pdns_cfg resource create Mysql lsb:mysql.server op start timeout=60s op stop timeout=60s op monitor interval=20s timeout=30s

# pcs -f pdns_cfg resource group add HA-GROUP VirtualIP storage Mysql Apache
HA-GROUPVIP, DRBD mount, Apache, Mysql 순서대로 구동되도록 그룹화.

# pcs -f pdns_cfg constraint colocation add HA-GROUP DataSync INFINITY with-rsc-role=Master
HA-GROUP & DataSync 리소스의 Master 가 공통된 Master 에서 실행되도록 설정.

# pcs -f pdns_cfg constraint order promote DataSync then start storage
DataSync 리소스가 실행된 후 storge 리소스 (/dev/drbd0 mount) 실행

# pcs cluster cib-push pdns_cfg

 

■ PDNS 구성

1. PDNS 설치

# yum install epel-release yum-plugin-priorities
# curl -o /etc/yum.repos.d/powerdns-auth-46.repo https://repo.powerdns.com/repo-files/el-auth-46.repo
# yum install -y pdns pdns-backend-mysql.x86_64

 

2. pdns DB Table 생성 ( Master )

# DB 데이터 디렉토리를 DRBD 파티션으로 이동 및 심볼릭 링크
# mv /usr/local/mysql/var /home/MYSQL_DATA
# ln -s /home/MYSQL_DATA /usr/local/mysql/var

# DB 접속 후 pdns DB 및 계정생성
→ Master, Slave 서버 모두 PDNS 데몬 구동하니 3개 IP에 대한 접근을 모두 허용해준다.
mysql ((none))>create database pdns;
mysql (mysql)>GRANT ALL PRIVILEGES ON pdns.* to 'pdns'@'localhost' IDENTIFIED BY 'pdnsTest@DB@';
mysql (mysql)>GRANT ALL PRIVILEGES ON pdns.* to 'pdns'@'192.168.0.100' IDENTIFIED BY 'pdnsTest@DB@';
mysql (mysql)>GRANT ALL PRIVILEGES ON pdns.* to 'pdns'@'192.168.0.101' IDENTIFIED BY 'pdnsTest@DB@';
mysql (mysql)>GRANT ALL PRIVILEGES ON pdns.* to 'pdns'@'192.168.0.102' IDENTIFIED BY 'pdnsTest@DB@';
mysql ((none))>flush privileges;


# pdns schema 생성
# cd /usr/share/doc/pdns-backend-mysql-4.6.0
# cp -pv schema.mysql.sql /usr/local/src/ ; sed -i "s/latin1/utf8/g" /usr/local/src/schema.mysql.sql
# mysql -uroot -p pdns < /usr/local/src/schema.mysql.sql


# systemctl enable pdns
# systemctl start pdns

 

3. pdns.conf 파일 수정

# cp -pv /etc/pdns/pdns.conf /etc/pdns/pdns.conf_org
# chmod 644 /etc/pdns/pdns.conf


# cat /etc/pdns/pdns.conf
any-to-tcp=yes
default-soa-edit=webdns.hktest.shop

daemon=yes
guardian=yes

setgid=pdns
setuid=pdns

local-address=0.0.0.0
local-address-nonexist-fail=no
local-port=53

launch=gmysql
gmysql-dnssec
gmysql-host=192.168.0.200
gmysql-port=3306
gmysql-user=pdns
gmysql-password=pdnsTest@DB@
gmysql-dbname=pdns

version-string=powerdns

 

4. 조회 테스트

# dig webdns.hktest.shop @pdnsm.hktest.shop
mysql ((none))>show processlist;
+----+------+-----------------------+------+---------+------+-------+------------------+----------+
| Id | User | Host | db | Command | Time | State | Info | Progress |
+----+------+-----------------------+------+---------+------+-------+------------------+----------+
| 10 | pdns | 192.168.0.200:42690 | pdns | Sleep | 15 | | NULL | 0.000 |
| 11 | root | localhost | NULL | Query | 0 | init | show processlist | 0.000 |
+----+------+-----------------------+------+---------+------+-------+------------------+----------+


# dig webdns.hktest.shop @pdnss.hktest.shop
mysql ((none))>show processlist;
+----+------+-----------------------+------+---------+------+-------+------------------+----------+
| Id | User | Host | db | Command | Time | State | Info | Progress |
+----+------+-----------------------+------+---------+------+-------+------------------+----------+
| 11 | root | localhost | NULL | Query | 0 | init | show processlist | 0.000 |
| 12 | pdns | 192.168.0.101:42834 | pdns | Sleep | 0 | | NULL | 0.000 |
+----+------+-----------------------+------+---------+------+-------+------------------+----------+

 

■ PDNS 구성

아래와 같이 압축해제 및 웹 접속을 할수 있도록 설정 후, webdns.hktest.shop로 접속하여 추가 설정을 진행해주면 됩니다.

# cd /home
# wget https://sourceforge.net/projects/poweradmin/files/poweradmin-2.2.0.tar.gz/download
# mv download poweradmin.tar.gz
# tar zxvf poweradmin.tar.gz
# mv /home/poweradmin-2.2.0 /home/WebDNS

# Apache에 연결
# mv /usr/local/httpd2/conf /DATA/APACHE_CONF
# ln -s /home/APACHE_CONF /usr/local/httpd2/conf


# vhosts.conf에 등록
→ webdns.hktest.shop에는 VIP를 넣어주면 됩니다.

<VirtualHost *:80>
ServerAdmin webmaster@hktest.shop
ServerName webdns.hktest.shop
DocumentRoot /home/WebDNS
CustomLog logs/pdns.hktest.shop-access.log common
</VirtualHost>

 

 

'Linux > HA' 카테고리의 다른 글

Pacemaker + DRBD 를 이용한 이중화 구성  (0) 2022.03.24
Pacemaker + ldirectord 를 이용한 LVS 구성  (0) 2022.03.24

+ Recent posts