◇ 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 웹 관리자와 연결하면 편하게 추가 및 삭제를 할 수 있습니다. 크리티컬 한 보안 문제가 발생하지 않는다면야 앞으로도 이 방법을 주로 이용할 것으로 보입니다.
'◈『Open(Source) Solution』 > 네임서버(DNS)' 카테고리의 다른 글
PowerAdmin(PowerDNS) - 네임서버 레코드 종류 (0) | 2020.08.03 |
---|---|
CentOS 8 - 네임서버(PowerDNS 4.X) - 로그[Logging] 설정 (0) | 2020.07.27 |
CentOS 8 - 네임서버(PowerDNS) 구축(With MariaDB, PowerAdmin) (0) | 2020.07.24 |