CentOS 8 네임서버(PowerDNS) - MariaDB(Replication) 이용한 1차 / 2차 네임서버 구성

    MariaDB(Replication) 레플리케이션(이)란?

    기본적으로 데이터베이스(Database)는 레플리케이션(Replication) 기능이 대부분 있습니다. 보통 시스템 의미적으로 마스터(Master)/슬레이브(Slave)를 뜻하며 원본과 복사본 사이를 다룹니다. 마스터는 변경 사항을 기록하고 그 결과를 그대로 슬레이브에게 복제 전달합니다. 이는 마스터 서버에서 정상적으로 값이 수정되거나 삭제를 했을 때 슬레이브에게 전달하도록 합니다.

     

    여기서의 1차/2차 네임서버 구성은 PowerDNS 솔루션 자체의 마스터/슬레이브 기능을 의미하는 것은 아니며 MariaDB만 레플리케이션 기능을 이용한 방법입니다. 실제 도메인 정보를 데이터베이스에 저장하는 PowerDNS 특성을 이용한 방법이며 한번 설정을 하면 2차 네임서버를 같이 관리하는 수고를 덜 수 있습니다. 물론 두 개 이상의 서버 시스템이 있어야 하며 여러 대 설정할 경우 복잡도로 인해 실용적이지는 못하다고 하지만 단순 2대의 마스터/슬레이브 설정하는 거라면 크게 문제가 없다고 생각하며 실제로 이렇게 문제없이 5년 이상정도 PowerDNS 서버를 유지해왔습니다.

     

    ※ 구성도 예시

    1차 네임서버
    (ns1.testdns.com)
    2차 네임서버
    (ns2.testdns.com)
    웹(PowerAdmin) 웹(PowerAdmin)
    PowerDNS PowerDNS
    MariaDB(Master) ↔ MariaDB(Slave)

    위와 같은 구성으로 이루어져 있으며 웹(PowerAdmin) / PowerDNS 세팅은 동일하며, DB만 마스터/슬레이브 상호작용을 하신다고 생각하면 됩니다. 그럼 이제부터 세팅방법을 알아보도록 하겠습니다.

    ■ [설치환경 및 준비물]

    릴리즈 설치 테스트 : 2020-07-29

    1. CentOS 8 PowerDNS 서버 준비 [포스팅 참고]

    2. 동일한 세팅을 한 서버를 두대 준비하기 [VMware 가상 솔루션은 복제(Clone) 기능 이용]

    3. 마스터(Master) 서버 IP[192.168.232.141] / 마스터(Slave) 서버 IP[192.168.232.142] 사설 세팅되어있다고 가정합니다.


    ■ 진행순서

     

    ① 1차 네임서버(Master DB) 서버 IP [192.168.232.141] 세팅 진행

    STEP01 → MariaDB Config 설정 후 재시작

    ※ 저의 경우는 include /etc/my.cnf.d/server.cnf 설정을 했지만 /etc/my.cnf 설정해도 상관없습니다.

    ◇ 마스터 서버 1순위 설정

    [root@localhost ~]# vi /etc/my.cnf.d/server.cnf

    # this is only for the mysqld standalone daemon

    [mysqld]
    server-id=1  [라인 추가]
    log-bin=mysql-bin  [라인 추가]

    ◇ MariaDB 서비스 재시작

    [root@localhost ~]# systemctl restart mysqld

    ◇ 바이너리 파일 생성 확인

    [root@localhost ~]# ls -al /var/lib/mysql | grep bin

    -rw-rw----   1 mysql mysql       328  7월 28 21:45 mysql-bin.000001

    -rw-rw----   1 mysql mysql        19  7월 28 21:45 mysql-bin.index

     

     

    STEP02 → MariaDB 접속 후 세팅 [순서 중요]

    ※ 접속 세션을 2개 연결하여 진행

    ◇ 1번 세션

    [root@localhost ~]# mysql -u root -p   [MariaDB 접속]

     

    MariaDB [(none)]> grant replication slave on *.* to 'pdnsbak' identified by 'test123'; [Slave 접속할 계정 생성]
    Query OK, 0 rows affected (0.122 sec)

     

    MariaDB [(none)]> flush privileges;  [적용]
    Query OK, 0 rows affected (0.008 sec)

     

    MariaDB [(none)]> flush tables with read lock;  [테이블 락 걸기]
    Query OK, 0 rows affected (0.001 sec)

    ◇ 2번 세션 전환

    [root@localhost ~]# mysqldump -u root -p pdns > pdns_bak.sql  [PDNS 데이터베이스 백업]

    Enter password: [패스워드 입력]

     

    [root@localhost ~]# ls -al pdns_bak.sql  [백업 파일 확인]

    -rw-r--r-- 1 root root 15725  7월 28 21:52 pdns_bak.sql

    ◇ 1번 세션 전환

    MariaDB [(none)]> show master status;  [중요! - 파일 및 포지션 숫자 확인 / 슬레이브 세팅 시 필요]
    +------------------+----------+--------------+------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+----------+--------------+------------------+
    mysql-bin.000001 |      637 |              |                  |
    +------------------+----------+--------------+------------------+
    1 row in set (0.013 sec)

     

    MariaDB [(none)]> unlock tables;  [테이블 락 해제]
    Query OK, 0 rows affected (0.000 sec)

    ◇ 2번 세션 전환

    [root@localhost ~]# systemctl restart mysqld  [서비스 재시작]

    ※ 예시

     

     

    STEP03 → 슬레이브에서 DB 접근 가능할 수 있도록 3306 포트 허용

    ◇ iptables 수정 후 저장[순서 중요]

    [root@localhost ~]# vi /etc/sysconfig/iptables

    # sample configuration for iptables service
    # you can edit this manually or use system-config-firewall
    # please do not ask us to add additional ports/services to this default configuration
    *filter
    :INPUT ACCEPT [0:0]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    -A INPUT -p icmp -j ACCEPT
    -A INPUT -i lo -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 8888 -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT  [라인 추가]
    -A INPUT -j REJECT --reject-with icmp-host-prohibited
    -A FORWARD -j REJECT --reject-with icmp-host-prohibited
    COMMIT

    ◇ 서비스 재시작

    [root@localhost ~]# systemctl restart iptables

    ◇ 포트 허용 확인

    [root@localhost ~]# iptables -nL | grep 3306
    ACCEPT  tcp --  0.0.0.0/0   0.0.0.0/0  state NEW tcp dpt:3306

     

     

    ② 2차 네임서버(Slave DB) 서버 IP [192.168.232.142] 세팅 진행

    STEP01 → MariaDB Config 설정 후 재시작

    ◇ 슬레이브 서버 2순위 설정

    [root@localhost ~]# vi /etc/my.cnf.d/server.cnf

    # this is only for the mysqld standalone daemon

    [mysqld] 
    server-id=2  [라인 추가]
    log-bin=mysql-bin  [라인 추가]

    ◇ MariaDB 서비스 재시작

    [root@localhost ~]# systemctl restart mysqld

    ◇ 바이너리 파일 생성 확인

    [root@localhost ~]# ls -al /var/lib/mysql | grep bin

    -rw-rw----   1 mysql mysql       328  7월 28 22:18 mysql-bin.000001

    -rw-rw----   1 mysql mysql        19  7월 28 22:18 mysql-bin.index

     

     

    STEP02 → 마스터 서버에서 백업한 pdns 데이터베이스 파일을 가져옵니다.

    ◇ 알 싱크(rsync)를 이용한 파일 가져오기

    [root@localhost ~]# rsync -avz -e 'ssh -p 8888' root@192.168.232.141:/root/pdns_bak.sql /root/

    The authenticity of host '[192.168.232.141]:8888 ([192.168.232.141]:8888)' can't be established.
    ECDSA key fingerprint is...

    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

    Warning: Permanently added '[192.168.232.141]:8888' (ECDSA) to the list of known hosts.
    root@192.168.232.141's password: [패스워드 입력]
    receiving incremental file list
    pdns_bak.sql

     

    sent 43 bytes  received 2,580 bytes  276.11 bytes/sec
    total size is 15,725  speedup is 6.00

    ◇ 파일 확인

    [root@localhost ~]# ls -al | grep pdns
    -rw-r--r-- 1 root root  15725  7월 28 21:52 pdns_bak.sql

     

     

    STEP03 → MariaDB 접속 후 세팅[순서 중요]

    ※ 접속 세션을 2개 연결하여 진행

    ◇ 1번 세션

    [root@localhost ~]# mysql -u root -p  [MariaDB 접속]

     

    MariaDB [(none)]> drop database pdns;  [기존 데이터베이스 삭제]
    Query OK, 16 rows affected (0.190 sec)

     

    MariaDB [(none)]> create database pdns;  [재생성]
    Query OK, 1 row affected (0.019 sec)

    ◇ 2번 세션 전환

    [root@localhost ~]# mysql -u root -p pdns < pdns_bak.sql  [Master 서버에서 받은 파일을 복원]

    Enter password: [패스워드 입력]

    ◇ 1번 세션 전환

    MariaDB [(none)]> use pdns;  [데이터베이스 선택]
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A

     

    Database changed
    MariaDB [pdns]> show tables;  [정상 복원되었는지 확인]
    +--------------------+
    | Tables_in_pdns     |
    +--------------------+
    | comments           |
    | cryptokeys         |
    | domainmetadata     |
    | domains            |
    | migrations         |
    | perm_items         |
    | perm_templ         |
    | perm_templ_items   |
    | records            |
    | records_zone_templ |
    | supermasters       |
    | tsigkeys           |
    | users              |
    | zone_templ         |
    | zone_templ_records |
    | zones              |
    +--------------------+
    16 rows in set (0.000 sec)

     

    MariaDB [pdns]> RESET SLAVE;  [Slave 설정을 초기화]
    Query OK, 0 rows affected (0.018 sec)

     

    MariaDB [pdns]> STOP SLAVE;  [Slave 정지]
    Query OK, 0 rows affected, 1 warning (0.000 sec)

     

    [Slave 세팅 / Master server status 값과 일치]

    MariaDB [pdns]> change master to
     master_host='192.168.232.141',
     master_user='pdnsbak',
     master_port=3306,
     master_password='test123',
     master_log_file='mysql-bin.000001',
     master_log_pos=637;
    Query OK, 0 rows affected (0.009 sec)

     

    MariaDB [pdns]> START SLAVE;  [Slave 시작]
    Query OK, 0 rows affected (0.009 sec)

    ※ 예시

    여기까지 오면 세팅은 완료가 되었습니다.

    이제 문제없이 마스터/슬레이브 역할을 하고 있는지 확인해보도록 하겠습니다.

     

     

    ③ 레플리케이션(동기화) 기능 작동 확인

    ◇ 1차 네임서버[192.168.232.141] 마스터 서버 status 값 확인

    MariaDB [(none)]> show master status \G;
    *************************** 1. row ***************************
                File: mysql-bin.000002
            Position: 342
        Binlog_Do_DB:
    Binlog_Ignore_DB:
    1 row in set (0.000 sec)

    ◇ 2차 네임서버[192.168.232.142] 슬레이브 status 값 확인

    MariaDB [pdns]> show slave status \G;
    *************************** 1. row ***************************
                    Slave_IO_State: Waiting for master to send event
                       Master_Host: 192.168.232.141
                       Master_User: pdnsbak
                       Master_Port: 3306
                     Connect_Retry: 60
                   Master_Log_File: mysql-bin.000002  [값 일치 확인]
               Read_Master_Log_Pos: 342  [값 일치 확인]
                    Relay_Log_File: localhost-relay-bin.000003
                     Relay_Log_Pos: 641
             Relay_Master_Log_File: mysql-bin.000002
                  Slave_IO_Running: Yes
                 Slave_SQL_Running: Yes
                   Replicate_Do_DB:
               Replicate_Ignore_DB:
                Replicate_Do_Table:
            Replicate_Ignore_Table:
           Replicate_Wild_Do_Table:
       Replicate_Wild_Ignore_Table:
                        Last_Errno: 0
                        Last_Error:
                      Skip_Counter: 0
               Exec_Master_Log_Pos: 342  [값 일치 확인]
                   Relay_Log_Space: 1253
                   Until_Condition: None
                    Until_Log_File:
                     Until_Log_Pos: 0
                Master_SSL_Allowed: No
                Master_SSL_CA_File:
                Master_SSL_CA_Path:
                   Master_SSL_Cert:
                 Master_SSL_Cipher:
                    Master_SSL_Key:
             Seconds_Behind_Master: 0
     Master_SSL_Verify_Server_Cert: No
                     Last_IO_Errno: 0
                     Last_IO_Error:
                    Last_SQL_Errno: 0
                    Last_SQL_Error:
       Replicate_Ignore_Server_Ids:
                  Master_Server_Id: 1  [마스터 서버 ID]
                    Master_SSL_Crl:
                Master_SSL_Crlpath:
                        Using_Gtid: No
                       Gtid_IO_Pos:
           Replicate_Do_Domain_Ids:
       Replicate_Ignore_Domain_Ids:
                     Parallel_Mode: optimistic
                         SQL_Delay: 0
               SQL_Remaining_Delay: NULL
           Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
                  Slave_DDL_Groups: 0
    Slave_Non_Transactional_Groups: 0
        Slave_Transactional_Groups: 0

    와 같이 마스터 서버 상태 값과 전부 일치하면 문제없이 실시간 동기화가 진행되고 있는 부분입니다.

    만약 에러가 나면 다음과 같이 바로 표시하니 확인하여 수정해나가시면 됩니다.

     

    ◇ 에러가 날 경우 예시

    ※ 지금의 경우는 마스터 서버 쪽 3306 포트를 허용하지 않아 에러가 발생한 부분입니다.

    MariaDB [pdns]> show slave status \G;
    *************************** 1. row ***************************

    Master_SSL_Verify_Server_Cert: No
                    Last_IO_Errno: 2003
                    Last_IO_Error: error connecting to master 'pdnsbak@192.168.232.141:3306' - retry-time: 60  maximum-retries: 86400  message:
                                   Can't connect to MySQL server on '192.168.232.141' (113 "No route to host")
                   Last_SQL_Errno: 0

     

     

    ④ 레플리케이션(동기화) 기능 작동 확인

    ◇ 존(Zone) 파일 생성 확인[1차 생성 → 2차 전파 확인]

     

    ◇ 존(Zone) 파일 삭제 확인[1차 생성 → 2차 전파 확인]

    ※ 주의사항

    1. 존(Zone)파일/레코드(Records) 등록 및 삭제는 꼭 마스터 서버에서 진행할 것

    슬레이브 서버에서 작업 시에는 동기화가 되지 않음, 즉 마스터 서버 쪽으로 값이 반영되지 않습니다.

     

    2. 하드웨어 장애로 인한 서버가 강제 종료가 되었다면 재부팅 시 마스터/슬레이브 기능이 제대로 작동하지 않을 수 있으므로 문제가 발생할 경우는 슬레이브 서버만 DB를 재시작해주거나 위 동기화 작업을 다시 해주면 됩니다.

     

     

    마무리

    네임서버 구성도 운영방식에 따라 다양하므로 그중 하나의 방법입니다. 저는 BIND보다는 PowerDNS를 더 신뢰하다 보니 서버 구축할 때마다 항상 이 방식으로 운영을 해왔습니다. 백엔드로 DB에 직접 정보를 저장하여 질의응답을 잘못된 정보가 발생할 확률이 낮으며 Poweradmin 웹 관리자와 연결하면 편하게 추가 및 삭제를 할 수 있습니다. 크리티컬 한 보안 문제가 발생하지 않는다면야 앞으로도 이 방법을 주로 이용할 것으로 보입니다.

    Designed by JB FACTORY