본문으로 바로가기

◆ [설치환경]


■ 최신 릴리즈 설치 테스트 : 2017년 5월 7일


□ CentOS 7 64bit [ 제가 포스팅한 설치이후 환경에서 작업 ]

□ Kernel 4.10.X ↑ [ 해당서버는 최신 커널을 이용합니다. 기존커널에서 작업하셔도 됩니다. ]

□ 일부 설정이나 경로가 다를 수 있습니다. 실서버가 아닌 VMware 환경에서 작업이 이루어 집니다.


□ PowerDNS 4.X [참고] 설치 버전입니다.

Mysql(Replication) 복제 기능을 이용한 1차 / 2차 네임서버 구성하는 방법입니다.


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


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


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


구성도 예시)

 1차 네임서버 (ns1.testdns.com)

 2차 네임서버 (ns2.testdns.com)

 웹(PowerAdmin)

 웹(PowerAdmin)

 PowerDNS

 PowerDNS

 Mysql(Master) ↔

 Mysql(Slave)

위와 같은 구성으로 이루어져 있으며 웹(PowerAdmin) / PowerDNS 셋팅은 동일하며, DB만 마스터/슬레이브 상호작용을 하신다고 생각하면 됩니다.

그럼 이제부터 셋팅방법을 알아보도록 하겠습니다.


먼저 [PowerDNS] 설치한 두대의 네임서버를 준비합니다.



■ 1차 네임서버(Master DB) 셋팅 진행


1. my.cnf 설정후 서비스 재시작

(저는 include /etc/my.cnf.d 되어있는 server.cnf 에다가 설정했지만 그냥 my.cnf 파일에 적용해도 상관없습니다.)

BASH

[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 (추가)


:wq (저장)

BASH

[root@localhost ~]# service mysqld restart (재시작)

Redirecting to /bin/systemctl restart mysqld.service

[root@localhost ~]# ls -al /var/lib/mysql (바이너리 파일 생성확인)

-rw-rw---- 1 mysql mysql 313 5?? 7 05:45 mysql-bin.000001 -rw-rw---- 1 mysql mysql 19 5?? 7 05:45 mysql-bin.index


2. Mysql 접속후 셋팅

BASH

[root@localhost ~]# mysql -u root -p

Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 4 Server version: 10.1.23-MariaDB MariaDB Server Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> grant replication slave on *.* to 'pdnsbak' identified by 'test123'; (슬레이브 접속할 계정 생성)

Query OK, 0 rows affected (0.00 sec)


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


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


ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

콘솔하나 더 연결하여 [BASH]

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


[root@localhost ~]# ls -al pdns_bak.sql (백업파일 확인) -rw-r--r-- 1 root root 15087 5?? 7 05:53 pdns_bak.sql

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ


MariaDB [(none)]> show master status; (중요! : 파일 및 포지션 숫자 확인 / 슬레이브 셋팅시 일치해야함) +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 606 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)


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


ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

[root@localhost ~]# service mysqld restart (서비스 재시작) Redirecting to /bin/systemctl restart mysqld.service

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ


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

BASH

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


# 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 22 -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


:wq (저장후)

BASH

[root@localhost ~]# service iptables restart (서비스 재시작)

Redirecting to /bin/systemctl restart iptables.service


[root@localhost ~]# iptables -nL (포트 오픈 확인)

ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:3306




■ 2차 네임서버(Slave DB) 셋팅 진행


1. my.cnf 설정후 서비스 재시작

BASH

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


# this is only for the mysqld standalone daemon [mysqld] server-id=2 (추가, Master서버와 값이 중복되면 안됩니다.)

log-bin=mysql-bin (추가)


:wq (저장)

BASH

[root@localhost ~]# service mysqld restart (재시작)

Redirecting to /bin/systemctl restart mysqld.service


[root@localhost ~]# ls -al /var/lib/mysql (바이너리 파일 생성확인)

-rw-rw---- 1 mysql mysql 313 5?? 7 05:45 mysql-bin.000001

-rw-rw---- 1 mysql mysql 19 5?? 7 05:45 mysql-bin.index


2. 마스터서버에서 백업한 pdns 파일을 가져옵니다. (가져오는 방법은 알아서~)

BASH

[root@localhost ~]# rsync -avz -e 'ssh -p 22' root@192.168.223.129:/root/pdns_bak.sql /root/ (알싱크를 이용한 파일 가져오기)

The authenticity of host '192.168.223.129 (192.168.223.129)' can't be established. ECDSA key fingerprint is ... Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.223.129' (ECDSA) to the list of known hosts. root@192.168.223.129's password: receiving incremental file list pdns_bak.sql (파일 리스트 확인) sent 30 bytes received 2354 bytes 317.87 bytes/sec total size is 15087 speedup is 6.33


[root@localhost ~]# ls -al pdns_bak.sql (파일 확인) -rw-r--r-- 1 root root 15087 5?? 7 05:53 pdns_bak.sql


3. Mysql 접속후 셋팅

BASH

[root@localhost ~]# mysql -u root -p

Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 4 Server version: 10.1.23-MariaDB MariaDB Server Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


MariaDB [(none)]> drop database pdns; (기존 데이터베이스 삭제후)

Query OK, 16 rows affected (1.04 sec)


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


ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

콘솔하나 더 연결하여 [BASH]

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

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ


MariaDB [(none)]> use pdns; (데이터베이스 선택후) 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.00 sec)


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


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


MariaDB [pdns]> change master to (Slave 셋팅 / Master server status 값과 일치) -> master_host='192.168.223.129', -> master_user='pdnsbak', -> master_port=3306, -> master_password='test123', -> master_log_file='mysql-bin.000001', -> master_log_pos=606; Query OK, 0 rows affected (0.02 sec)


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


여기까지 오셨다면 모든 셋팅이 완료가 되었습니다!

이제 정상적으로 마스터/슬레이브 역활을 하고 있는지 확인할 필요가 있겠죠?



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

BASH

MariaDB [(none)]> show master status \G; (1차네임서버 마스터서버 status 값 확인) *************************** 1. row *************************** File: mysql-bin.000002 Position: 327 Binlog_Do_DB: Binlog_Ignore_DB: 1 row in set (0.00 sec)



MariaDB [pdns]> show slave status \G; (2차네임서버 슬레이브 status 값 확인) *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.223.129 Master_User: pdnsbak Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000002 (File: mysql-bin.000002 일치확인) Read_Master_Log_Pos: 327 (Position: 327 일치 확인) Relay_Log_File: localhost-relay-bin.000003 Relay_Log_Pos: 615 Relay_Master_Log_File: mysql-bin.000002 (File: mysql-bin.000002 일치확인) Slave_IO_Running: Yes (Yes 이상없음) Slave_SQL_Running: Yes (Yes 이상없음) Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 (상태값이 0 이면 이상없음) Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 327 (Position: 327 일치 확인) Relay_Log_Space: 1205 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: conservative 1 row in set (0.00 sec)


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

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


예시)

지금의 경우는 마스터서버쪽 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.223.129:3306' - retry-time: 60 maximum-retries: 86400 message:

Can't connect to MySQL server on '192.168.223.129' (113 "No route to host") Last_SQL_Errno: 0 .

.


■ 웹(PowerAdmin) 인터페이스 생성 및 수정, 삭제 테스트


□ 단 작업시 꼭 마스터 서버(1차네임서버)에서 작업을 해주시기 바랍니다. 

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

□ 간혹 하드웨어가 문제가 발생하여 서버가 강제로 꺼지거나 재부팅되었을시 역시 꼬일수가 있으며 그때는 슬레이브 서버쪽만 DB를 재시작 해주시면 됩니다.


이부분만 조심하면 문제 없이 운영가능합니다.

참고하시기 바랍니다.


댓글을 달아 주세요