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

전체적인 설치에 대한 방법이니, 설치 및 구성에 참고 바랍니다.

 

■ 구축 환경

OS
- CentOS Linux release 7.9.2009 (Core)

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

 

■ Pacemaker Cluster 구성

 기본 설치 및 설정 같은 경우, Pacemaker + ldirectord 를 이용한 LVS 구성 를 참조 부탁드립니다.

 

■ DRBD 설치

※ DRBD란 ?

 - Distributed Replicated Block Device의 약자로, HA(High Availabilty) 구성을 위한 Block Device 입니다.

Active 상태의 서버 Disk에서 데이터를 저장할 경우, 네트워크를 통해 디스크 블럭단위로 standby 서버에 미러링 되는 방식이라고 보시면 됩니다.

 

1. /etc/hosts 에 호스트 등록

# vi /etc/hosts
192.168.0.100 active
192.168.0.101 standby

 

2. 주요 패키지 설치

# yum 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
drbd 585395 0
libcrc32c 12644 2 drbd,nf_conntrack

 

3. DRBD 관련 설정 ( Actvie, Standby )

# vi /etc/drbd.conf
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 active {
device /dev/drbd0;
disk /dev/xvda2;
address 192.168.0.100:7787;
meta-disk internal;
}


on standby {
device /dev/drbd0;
disk /dev/xvda2;
address 192.168.0.101:7787;
meta-disk internal;
}


}

 

3. DRBD Metadata 생성 (Active, Standby)

 metadata 생성 전 DRBD 볼륨으로 사용할 공간은 파일 시스템이 생성되어 있지 않아야 하며, 미리 파일시스템이 생성된 상태면 dd명령어를 이용하여 MBR 영역을 제거해야 합니다.

# drbdadm create-md r0
--== Thank you for participating in the global usage survey ==--
The server's response is:


you are the 4215th user to install this version
initializing activity log
initializing bitmap (960 KB) to all zero
Writing meta data...
New drbd meta data block successfully created.
Success


# systemctl start drbd
# systemctl status drbd
● drbd.service - DRBD -- please disable. Unless you are NOT using a cluster manager.
Loaded: loaded (/usr/lib/systemd/system/drbd.service; disabled; vendor preset: disabled)
Active: active (exited) since 목 2021-10-14 12:43:06 KST; 4 days ago
Process: 5530 ExecStart=/lib/drbd/drbd start (code=exited, status=0/SUCCESS)
Main PID: 5530 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/drbd.service

 

 정상적으로 연결되었는지 확인.

# cat /proc/drbd
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2020-04-05 02:58:18

0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:84 nr:35276312 dw:35276400 dr:2193 al:11 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

 

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

# drbdadm primary --force r0
# mkfs.ext4 /dev/drbd0
# mount /dev/drbd0 /home
/dev/drbd0 ext4 33G 49M 31G 1% /home

 

■ PCS resource 생성

CIB(Cluster Information Base), Raw xml 에 우선 설정을 저장 후 업데이트 하는 방식으로 진행

# pcs cluster cib drbd_cfg
→ 'drbd_cfg' 파일을 cib 형식으로 생성.


# pcs -f drbd_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 drbd_cfg resource master DataSync Data1 master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
→ Master / Slave 구성 제약조건.

# pcs -f drbd_cfg resource create storage ocf:heartbeat:Filesystem device="/dev/drbd0" directory="/home" fstype="ext4"
drbd 파티션과 파일시스템을 지정하여 mount 시키는 리소스로, 노드별로 Master 노드에 마운트 시킨다.

# pcs -f drbd_cfg resource create VirtualIP ocf:heartbeat:IPaddr2 ip=[VIP] cidr_netmask=32 nic=eth0:1 op monitor timeout="30" interval="20" role="Master" op monitor timeout="30" interval="10" role="Slave"

→ VIP에 대한 Resource 설정.

# pcs -f drbd_cfg resource group add HA-GROUP VirtualIP storage
→ HA-GROUP에 VIP, DRBD mount 순서대로 구동되도록 그룹화.

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

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

 

■ Failover 테스트

 

1. ative 서버에서 서비스 중 확인.

# pcs status

 

2. active cluster 를 standby 상태로 변경하여 테스트 진행.

→ 등록한 resource들이 정상적으로 넘어갔는지 확인진행.

[active]
# pcs cluster standby active

[standby]
# pcs status


# cat /proc/drbd

 

■ 그 외 서비스들 추가.

실제로 DRBD로 이중화 구성할 경우 WEB, DB와 같은 서비스들을 같이 사용한다. 자신이 구축할 서버에 용도에 맞게 리소스를 추가하시면 됩니다. 아래의 예는 Apache , Mysql 설치 후 추가로 등록한 예시입니다.  LSB 방식으로 구동되도록 설정 진행하였으니, /etc/init.d 아래에 실행파일을 등록하시면 됩니다.

 

※ Apache

→ /etc/init.d/ 경로에 아래와 같은 스크립트 작성

#!/bin/sh


case "$1" in
start)
echo -n "Starting apahce: "
/usr/local/httpd2/bin/apachectl start
;;
stop)
echo -n "Shutting down apache"
/usr/local/httpd2/bin/apachectl stop
;;
*)
echo "Usage: $0 {start|stop}"
esac


exit 0

 

※ Mysql

→ Mysql 설치 시 제공되는 mysql.server 실행파일을 /etc/init.d/ 경로에 옮겨 사용하였습니다.

 

1. resource 추가

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

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


 

2. HA-GROUP에  추가

 서비스의 시작 순서를 판단하여 넣어주도록 합니다.

# pcs -f drbd_cfg resource group add HA-GROUP VirtualIP storage Apache Mysql

 

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

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

■ LVS 란?

 Linux Virtual Server의 약자이며, 말 그대로 리눅스 가상 서버입니다. HA(고가용성) 서버를 구축하기 위해 리눅스 환경의 서버를 로드 밸런싱 할수 있도록 도와줍니다. 

 (L4 스위치를 이용한 운영이 가장 좋습니다만, 가격적인 부분이 부담스러워 사용하는 경우가 대부분 일것같습니다.)

 

■ 구축 환경

※ OS
- CentOS Linux release 7.9.2009 (Core)
- 실제로 테스트 당시에는, Public IP를 사용하였으니 참고 바랍니다.


※ 구성에 사용되는 데몬
- Corosync : 클러스터 인프라 지원(Quorum 관리, 메세지 관리 등)
- Pacemaker : 클러스터 자원 관리자
- PCS : Corosync / pacemaker 관리하는 Management 데몬
- ldirectord : 원격 서비스를 모니터링하고, LVS를 제어하는 데몬

 

■ Pacemaker 설치 (LVS-Master, Slave 모두 설치)

Pacemaker 관련 내용은 추가로 업데이트할 예정이며, 설치 및 설정에 관한 내용만 게시하였습니다.

 

1. /etc/hosts 에 호스트 등록

→ IP 같은 경우 환경에 맞게 수정 부탁드립니다.

192.168.0.250 lvsm
192.168.0.251 lvss

 

2. /etc/sysctl.conf에 아래의 설정 추가

# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1

#sysctp -p

 

3. 주요 패키지 설치

# yum install -y pacemaker corosync pcs psmisc policycoreutils-python
# systemctl enable pcsd
# systemctl enable corosync
# systemctl enable pacemaker

 

4.  PCS 데몬 구동 및 노드간 통신을 위해 관리계정 (hacluster) 패스워드 설정

→ 노드간 로그인을 통해 corosync 구성을 동기화 하거나, 다른 노드에서 클러스터 실행 및 중지 작업 수행에 必

 ※ Master, Slave 모두 동일한 패스워드로 설정

# systemctl start pcsd
# password hacluster
# echo 'hklvstest' | passwd --stdin hacluster

 

5. Cluster Node 인증 설정 ( Master 에서만 진행 )

 → 방화벽이 올라와 있을 경우 아래의 포트를 오픈해준 후 진행해야 인증이 가능

※ Open이 필요한 방화벽 포트
◇ TCP : 2224, 3121, 21064

◇ UDP : 5405

# pcs cluster auth lvsm lvss

Username: hacluster
Password:
lvsm: Authorized
lvss: Authorized

 

6. Cluster 구성 및 활성화

# pcs cluster setup --name lvs_cluster lvsm lvss



# pcs cluster start --all

# pcs cluster enable --all
→ 노드간 통신은 UDP 포트를 이용하여 통신




 

7. Cluster 기본 셋팅

STONITH(Fencing Device) : 의도치 않은 동시 엑세스로 인한 데이터 손상을 보호함.
→ 클러스터 장애 시 해당 node를 끊어 공유 데이터의 무결성을 보장.
no-quorum-policy : 클러스터에 quorum이 없을 때의 수행작업을 설정.


# pcs property set stonith-enabled=false
→ Fencing Device 기능 비활성화

# pcs property set no-quorum-policy=ignore
→ 2개의 node로 구성 시 일반적으로 사용하는 옵션이며, 해당 설정이 안되어 있을 경우, 클러스터 간에 failover 시 부자연스러울 수 있음.

 

8. Resource 등록

 자신이 사용할 VIP를 입력하여, 리소스 등록

# pcs resource create VirtualIP ocf:heartbeat:IPaddr2 ip=[VIP] cidr_netmask=32 nic=eth0:1 op monitor interval=30s

 

■ ldirectord 설치 (LVS-Master, Slave 모두 설치)

로드 밸런싱을 위해 설치합니다.

 

1. ldirectord 설치

# cd /usr/local/src/;wget --content-disposition https://packagecloud.io/s_mcleod/pacemaker/packages/el/7/ldirectord-4.0.1-1.84.caee.el7.centos.x86_64.rpm/download.rpm

# yum -y install ldirectord-4.0.1-1.84.caee.el7.centos.x86_64.rpm

 

2. ldirectord 설정 추가 

 IP 같은 경우 환경에 맞도록 수정해서 넣어줍니다.

 

※ [LVS Server]

# vi /etc/ha.d/ldirectord.cf
checktimeout=10
checkinterval=10
autoreload=no
quiescent=no


# HTTP Service
virtual = [VIP]:80
real=[RealServer1 IP]:80 gate 10
real=[RealServer2 IP]:80 gate 10

service=http
scheduler=wlc
persistent=3600
protocol=tcp
checkport=80
checktype=connect

※ [Real Server]

 

# vi /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
IPADDR=[VIP]
NETMASK=255.255.255.255
ONBOOT=no

# 해당 설정을 하지 않을경우, lo:0에서 VIP의 MAC주소를 가져오려는 시도가 계속됩니다.
# vi /etc/sysctl.conf

net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.eth0.arp_announce = 2

# sysctp -p

 

3. ldirectord Resource 추가

# pcs resource create ldirectord lsb:ldirectord op monitor interval="20" timeout="10"

 

4. VIP, ldirectord 순으로 실행되기 위해 colocation 설정 추가.

# pcs constraint colocation add VirtualIP with ldirectord


→ lvss에 (-)INFINITY 값을 부여하여 마스터 서버에서 리소스를 가져가게 설정이 됨.

 

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

PDNS 이중화 구성  (0) 2022.03.28
Pacemaker + DRBD 를 이용한 이중화 구성  (0) 2022.03.24

+ Recent posts