데이터베이스 복제 · 6 min read · Jan 29, 2026
MariaDB 10을 사용하여 Debian 8에서 마스터 데이터베이스 복제하기
데이터베이스 복제는 데이터 손실로부터 보호하고 애플리케이션의 최적화된 성능을 허용하는 중복성을 생성합니다. 이 튜토리얼에서는 기존 MariaDB 10.0 마스터 데이터베이스를 하나 이상의 슬레이브로 복제하는 기본 사항을 다룰 것입니다. 다음 예제에서 호스트 운영 체제는 Debian 8입니다.
이 지침은 다른 운영 체제에도 적용될 수 있지만, 여러 명령 및 기본 파일 위치가 다를 수 있음을 유의하십시오. 특히, /etc/mysql/my.cnf, /var/lib/mysql의 경로, 이진 로그 파일의 기본 이름 및 경로, mysqld를 시작, 중지 및 재시작하는 명령을 시스템의 세부 사항에 따라 대체해야 합니다.
1. 연결 확인하기
진행하기 전에 마스터와 슬레이브가 네트워크에서 서로 도달할 수 있는지 확인하고, 각자의 /etc/hosts 파일에 서로에 대한 항목이 있는지 확인합니다. 각 호스트는 서로를 ping할 수 있어야 하며, 각 호스트에서 다른 호스트로 일반 사용자로 ssh할 수 있어야 합니다.
2. 마스터에서 mysqld 이진 로그 활성화하기
마스터 호스트에서 이진 로깅이 활성화되어 있는지 확인합니다. –verbose –help 스위치를 사용하여 mysqld를 호출하면 MariaDB 데몬의 운영 값이 표시됩니다. 루트로:
mysqld --verbose --help | grep log-bin...
log-bin (No default value)
...log-bin 항목의 값은 이진 로그 파일의 명명 규칙을 정의합니다. Debian에서는 이러한 파일이 /var/lib에 있습니다. log-bin의 값이 (No default value)인 경우, 구성 파일 my.cnf를 수정하여 로깅을 활성화해야 합니다. Debian에서는 my.cnf가 /etc/mysql 디렉토리에 있습니다.
텍스트 편집기에서 /etc/mysql/my.cnf를 열고 [mysqld] 그룹을 찾습니다. 존재하지 않으면 생성하고, log-bin이라는 한 줄을 입력합니다.
[mysqld]
log-bin이 항목을 포함하면 mysqld가 재시작될 때 이진 로깅이 활성화됩니다.
log-bin에 대한 값을 설정할 수도 있습니다. 예를 들어, log-bin= filename을 사용하여 이진 로그 파일의 사용자 정의 이름을 정의할 수 있습니다. 이 튜토리얼에서는 값을 설정하지 않고 기본 로그 파일 이름을 사용할 것입니다.
mysqld를 재시작합니다:
service mysql restart변경 사항이 적용되었는지 확인합니다:
mysqld --verbose --help | grep log-bin...
log-bin mysqld-bin
...여기에서 보여지듯이, Debian의 기본 이진 로그 파일 이름은 mysqld-bin으로 시작하며, 예를 들어 mysqld-bin. nnnnnn입니다.
3. 복제 사용자에게 권한 부여하기
모든 복제 작업을 전용 복제 사용자가 수행하도록 하는 것이 모범 사례입니다. 이 예제에서는 사용자의 이름을 repluser로 하고 이 사용자의 비밀번호를 replpass로 설정합니다.
이 사용자에게 전역 권한 SUPER, RELOAD, 및 REPLICATION SLAVE를 부여합니다. 이는 복제 사용자가 슈퍼유저 명령을 실행하고, 데이터베이스 캐시를 플러시하며, 마스터 서버에서 업데이트를 가져올 수 있도록 합니다.
데이터베이스 루트로 MariaDB 클라이언트에 들어갑니다:
mysql -u root -pMariaDB 프롬프트에서 다음 명령을 입력합니다:
GRANT SUPER, RELOAD, REPLICATION SLAVE ON *.* TO 'repluser'@'%' IDENTIFIED BY 'replpass';여기서 호스트 이름 와일드카드 ‘%‘는 복제 사용자가 모든 호스트에서 연결할 수 있도록 허용합니다.
권한이 부여되었는지 확인합니다:
SHOW GRANTS FOR 'repluser'4. 데이터베이스 캐시 플러시 및 테이블을 읽기 전용으로 설정하기
데이터베이스의 스냅샷을 만들 준비를 위해 모든 테이블을 플러시하고 READ LOCK으로 설정합니다. 이는 비수기 또는 시스템 유지 관리 기간 동안 신속하게 수행해야 합니다.
마스터에서:
FLUSH TABLES WITH READ LOCK;이제 테이블이 잠겨 있으므로 마스터 상태를 확인합니다:
SHOW MASTER STATUS;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| mysqld-bin.000005 | 995 | | |
+-------------------+----------+--------------+------------------+정보는 다를 수 있지만 File 및 Position 값을 기록해 두십시오. 이 정보는 7단계에서 사용됩니다.
MariaDB 클라이언트를 종료합니다:
\q5. 슬레이브 호스트를 위한 데이터베이스 스냅샷 만들기
복제하려는 마스터에 존재하는 데이터베이스 또는 데이터베이스의 아카이브를 만듭니다. 이러한 각 데이터베이스는 /var/lib/mysql에 고유한 디렉토리를 가지고 있습니다. 이 예제에서는 /var/lib/mysql/dbname 경로에 있는 단일 데이터베이스를 tar로 압축합니다.
이 명령은 단일 데이터베이스를 아카이브합니다. 추가 데이터베이스를 아카이브하는 경우, 명령에 전체 경로를 추가합니다. 예: /var/lib/mysql/dbname1 /var/lib/mysql/dbname2…
tar cjvf /home/[username]/mysql-master.tar.bz2 /var/lib/mysql/dbname이제 일반 사용자 username으로 이 파일을 슬레이브 호스트의 일반 사용자 계정으로 전송합니다:
rsync -avP mysql-master.tar.bz2 [username]@slavehost:~/.또는 scp를 사용하여:
scp mysql-master.tar.bz2 [username]@slavehost:~/.그런 다음, 슬레이브 호스트에 SSH로 접속합니다:
ssh [username]@slavehost루트로 슬레이브에서 mysqld를 중지합니다:
service mysql stop…그리고 아카이브를 추출합니다:
tar xjvf /home/[username]/mysql-master.tar.bz2 -C /.6. 마스터 및 슬레이브의 서버 ID 구성하기
마스터에서 /etc/mysql/my.cnf를 수정하여 [mysqld] 그룹에 server-id= n 항목을 추가합니다. 여기서 n은 서버를 식별하는 고유한 정수입니다. 일반적으로 n =1은 마스터 서버에 해당하지만, n은 [ 1, 2^32-1 ] 범위의 고유한 정수일 수 있습니다. 우리는 마스터를 server-id=1로, 슬레이브를 server-id=100으로 설정합니다.
(슬레이브에 my.cnf가 존재하지 않으면 생성합니다. 존재하는 경우, 기존 server-id 항목을 찾아 해당 줄의 주석을 제거하거나 편집합니다).
마스터 호스트의 /etc/mysql/my.cnf에서:
[mysqld]
server-id=1슬레이브 호스트의 /etc/mysql/my.cnf에서:
[mysqld]
server-id=1007. 테이블 잠금 해제 및 마스터 및 슬레이브에서 mysqld 시작/재시작하기
마스터 서버에서, 데이터베이스 루트로 MariaDB 클라이언트에 들어가 테이블의 잠금을 해제합니다:
mysql -u root -pUNLOCK TABLES;\q마스터에서 mysqld를 재시작합니다:
service mysql restart슬레이브에서 시작합니다:
service mysql start각 호스트에서 새로운 server-id 값이 적용되었는지 확인할 수 있습니다. 루트로:
mysqld --verbose --help | grep server-id8. 슬레이브에서 마스터의 정체성 구성하기
슬레이브에서 마스터 서버의 정체성을 구성합니다. MariaDB 클라이언트에 들어갑니다:
mysql -u root -p다음 명령을 실행합니다. MASTER_LOG_FILE 및 MASTER_LOG_POS의 값을 4단계에서 기록한 이진 로그 File 및 Position으로 바꾸고, MASTER_HOST, MASTER_USER, 및 MASTER_PASSWORD의 값을 자신의 값으로 바꿉니다.
CHANGE MASTER TO MASTER_HOST='masterhost', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysqld-bin.000005', MASTER_LOG_POS=995;9. 슬레이브 활성화하기
슬레이브에서, 데이터베이스 루트로 MariaDB 클라이언트에 들어갑니다:
START SLAVE;이제 슬레이브의 상태를 확인할 수 있습니다:
SHOW SLAVE STATUS \G;************************* 1. row *************************
Slave_IO_State: Waiting for master to send event
Master_Host: masterhost
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysqld-bin.000009
Read_Master_Log_Pos: 1330
Relay_Log_File: mysqld-relay-bin.000008
Relay_Log_Pos: 1618
Relay_Master_Log_File: mysqld-bin.000009
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: 1330
Relay_Log_Space: 2204
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
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos:복제 프로세스에 오류가 있는 경우, 여기에서 나열됩니다.
10. 마스터에서 변경 사항 만들고 슬레이브에서 복제 확인하기
마스터에서 새 데이터베이스를 생성하고 슬레이브에서 변경 사항을 확인하여 복제가 발생하고 있는지 확인할 수 있습니다.
mysql -u root -p새 데이터베이스를 생성합니다:
CREATE DATABASE repltest;USE repltest테이블을 생성하고 값을 삽입합니다:
CREATE TABLE test (hello VARCHAR(10));INSERT INTO test VALUES ('world');\q이제 슬레이브에서 MariaDB 클라이언트에 들어갑니다:
mysql -u root -pUSE repltestSELECT * FROM test;+-------+
| hello |
+-------+
| world |
+-------+
1 row in set (0.00 sec)11. 추가 슬레이브에 대해 프로세스 반복하기
각 추가 슬레이브에 대해 이 프로세스를 반복할 수 있습니다. 특히, 다음 단계를 수행합니다:
11 ( a) . 마스터에서, 데이터베이스 루트로 MariaDB 클라이언트에 들어가 테이블을 플러시하고 잠급니다:
FLUSH TABLES WITH READ LOCK;잠금 후, 마스터 상태를 보여줍니다:
**SHOW MASTER STATUS;File 및 Position 값을 기록해 둡니다.
11 ( b) . 마스터에서, 루트로:
tar cjvf /home/[username]/mysql-master.tar.bz2 /var/lib/mysql/dbname11 ( c) . 마스터에서, 일반 사용자로:
rsync -avP mysql-master.tar.bz2 [username]@slavehost2:~/.11 ( d) . 슬레이브에서, 루트로:
service mysql stoptar xjvf /home/[username]/mysql-master.tar.bz2 -C /.11 ( e) . 슬레이브 호스트의 /etc/mysql/my.cnf에서 [mysqld] 그룹의 server-id= 줄을 추가하거나 편집합니다. 여기서 server-id의 값은 새롭고 고유해야 합니다:
[mysqld]
server-id=20011 ( f) . 마스터에서, 데이터베이스 루트로 MariaDB 클라이언트에 들어가 테이블의 잠금을 해제합니다:
UNLOCK TABLES;11 ( g) . 마스터에서, 루트로 mysqld를 재시작합니다:
service mysql restart11 ( h) . 슬레이브에서, 루트로 mysqld를 시작합니다:
**service mysql start
11 ( i) . 슬레이브에서, 데이터베이스 루트로 MariaDB 클라이언트에 들어가 마스터 정체성을 구성하고 10(a) 단계에서의 이진 로그 파일 이름 및 위치를 설정합니다:
CHANGE MASTER TO MASTER_HOST='masterhost', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysqld-bin.nnnnnn’, MASTER_LOG_POS=n;11 ( j) . 슬레이브에서, 데이터베이스 루트로 MariaDB 클라이언트에 들어가 복제를 활성화합니다:
START SLAVE;12. 문제 해결: 슬레이브가 마스터에 연결할 수 없음
마스터에서 /var/mysql/my.cnf의 bind-address 항목을 확인합니다. bind-address가 127.0.0.1로 설정되어 있으면 서버는 로컬호스트에서만 연결을 수락합니다. 이 줄의 주석을 제거하거나 값을 *로 설정하여 모든 IPv4 및 IPv6 주소에서의 연결을 허용합니다. my.cnf를 수정한 경우, mysqld를 재시작하는 것을 잊지 마십시오.
연결이 여전히 작동하지 않으면 서버가 포트 3306에서의 연결을 허용하고 있는지 확인합니다. 마스터에서 커널 방화벽 테이블을 나열합니다:
iptables -L다음 명령을 사용하여 포트 3306에서의 연결을 허용할 수 있습니다. 필요에 따라 eth0를 네트워크 인터페이스 장치 이름으로 대체하십시오:
iptables -A INPUT -i eth0 -p tcp --destination-port 3306 -j ACCEPT새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.