MySQL 복제는 사용자가 하나 이상의 MySQL 데이터베이스의 여러 복사본을 관리할 수 있도록 하는 흥미로운 기능입니다. 데이터는 자동으로 소스에서 복제본 데이터베이스로 복사됩니다. 이는 메인 데이터베이스를 손상시키지 않고 데이터를 작업하거나, 데이터 백업, 또는 데이터베이스 액세스 확장 등 다양한 상황에서 유용할 수 있습니다.
이 가이드에서는 한 서버에 MySQL 인스턴스를 소스 데이터베이스로 설정한 다음, 다른 서버에 MySQL 인스턴스를 구성하여 복제본으로 작동하도록 하는 단계를 살펴보겠습니다..
전제 조건
이 가이드는 MySQL 복제의 매우 간단한 예를 보여줍니다. 여기에는 하나의 소스 및 하나의 복제본 데이터베이스가 포함됩니다. 소스 데이터베이스는 데이터베이스의 기본 복사본인 반면, 복제본 데이터베이스는 소스 데이터베이스의 복제본이 됩니다. 데모를 위해 두 개의 서버가 다음과 같은 IP 주소로 구성됩니다.
- 소스 서버: 31.171.240.179
- 복제본 서버: 31.171.250.139
각 서버는 최신 Ubuntu 20.04 서버 구성으로 설정되어 있습니다. 먼저, Ubuntu 서버를 설정하는 방법을 보여주는 튜토리얼 단계를 따르십시오. 복제본 데이터베이스의 수는 더 많을 수 있습니다. 이 가이드는 이미 MySQL이 설치 및 구성되어 있다고 가정합니다. MySQL 설치에 도움이 필요하신가요? 이 가이드는 MySQL 설치 및 기본 사용법.
의 단계를 자세히 설명합니다. 요약하자면, 필요한 패키지는 다음과 같습니다.
|
1 |
$ sudo apt install mysql-server mysql-client |
두 시스템의 방화벽은 포트 3306에서 두 시스템의 트래픽을 허용하도록 구성해야 합니다. 이는 MySQL의 기본 포트입니다. 데모를 통한 UFW 기본 사항에 대해 저희 블로그 게시물에서 자세히 알아볼 수 있습니다.
소스 데이터베이스 구성
-
MySQL 구성 조정
MySQL은 my.cnf를 기본 구성 파일로 사용합니다. 우리는 my.cnf를 업데이트하여 서버를 소스로 지정할 것입니다. 먼저, 텍스트 편집기로 구성 파일을 엽니다:
|
1 |
$ sudo nano /etc/mysql/my.cnf |
그런 다음, mysqld 섹션 아래에 다음 줄을 추가합니다:
|
1 2 3 4 |
bind-address = 31.171.240.179 server-id = 1 log_bin = /var/log/mysql/mysql-bin.log binlog_do_db = newdatabase |
이 줄들은 무엇을 의미하나요?
bind-address: 서비스와 IP 주소 간의 연결을 정의하는 항목입니다. 기본적으로 값은127.0.0.1(localhost)일 수 있습니다. 새 값은 서버의 IP 주소가 됩니다.server-id: MySQL 복제에서 각 서버는 고유한 서버 ID를 가져야 합니다. 어떤 숫자든 될 수 있습니다. 단순화를 위해 이 값은1.log_bin: 복제의 실제 세부 정보를 저장합니다. 복제본 데이터베이스는 로그에 등록된 모든 내용을 복사합니다.binlog_do_db: 복제본 서버에서 복제 대상이 될 데이터베이스를 지정합니다. 둘 이상의 데이터베이스가 있을 수 있습니다. 여기서 샘플 데이터베이스는newdatabase.
변경 사항을 적용한 후 구성 파일을 저장합니다. MySQL은 다음 파일에 대한 변경 사항을 로드하기 위해 재시작해야 합니다: my.cnf:
|
1 |
$ sudo service mysql restart |
-
복제본 사용자에게 권한 부여
다음 단계는 복제본 사용자를 생성하고 적절한 권한을 부여하는 것입니다. 이는 MySQL 셸에서 수행해야 합니다. 먼저 MySQL 셸을 실행합니다:
|
1 |
$ sudo mysql -u root -p |
다음으로, 복제본 데이터베이스를 위한 전용 사용자를 생성합니다. 사용자 이름과 비밀번호를 적절하게 변경하십시오:
|
1 |
$ CREATE USER 'cloudsigma_s'@'31.171.240.179' IDENTIFIED BY 'password_123'; |
이제 사용자에게 적절한 권한을 부여합니다:
|
1 |
$ GRANT REPLICATION SLAVE ON *.* TO 'cloudsigma_s'@'31.171.240.179'; |
저희 블로그 게시물에서 MySQL 사용자 및 권한에 대해 자세히 알아볼 수 있습니다. 다음으로, 변경 사항을 적용하기 위해 권한 테이블을 다시 로드합니다:
|
1 |
$ FLUSH PRIVILEGES; |
-
데이터베이스 조정
복제본에 소스 데이터베이스의 복사본이 필요합니다. 구조를 수동으로 구축하는 것도 가능합니다. 하지만 대부분의 경우 이는 상당히 불편합니다. 그렇기 때문에 데이터베이스를 직접 내보내는 것이 가장 최적의 솔루션입니다. 이 예에서 소스 데이터베이스는 newdatabase입니다. 현재 데이터베이스를 변경합니다:
|
1 |
$ USE newdatabase; |
다음 명령은 데이터베이스를 잠가 새로운 변경 사항을 방지합니다:
|
1 |
$ FLUSH TABLES WITH READ LOCK; |
그런 다음 데이터베이스 상태를 확인합니다:
|
1 |
$ SHOW MASTER STATUS; |
이 위치부터 복제본 데이터베이스가 소스로부터 복제를 시작합니다. 이 번호들은 나중에 유용하게 사용되므로 기록해 두세요. 동일한 창에서 변경 사항이 발생하면 MySQL이 자동으로 데이터베이스 잠금을 해제합니다. 따라서 다음 단계는 다른 터미널 탭이나 창에서 수행하는 것이 좋습니다. 데이터베이스는 여전히 잠겨 있습니다. 휴대용 SQL 파일로 내보냅니다:
|
1 |
$ mysqldump -u root -p --opt newdatabase > newdatabase.sql |
이제 작업이 완료되었습니다. 다음으로 데이터베이스 잠금을 해제합니다:
|
1 |
$ UNLOCK TABLES; |
마지막으로 셸을 종료합니다:
|
1 |
$ QUIT; |
복제본 구성
이제 복제본 데이터베이스를 구성할 시간입니다.
-
소스 데이터베이스 가져오기
복제본 서버에 소스 데이터베이스의 복사본이 필요합니다. 이를 위해 앞서 내보낸 SQL 파일을 사용합니다. MySQL 셸을 실행합니다:
|
1 |
$ sudo mysql -u root -p |
그 후, 동일한 데이터베이스 이름을 사용하여 빈 데이터베이스를 생성합니다:
|
1 |
$ CREATE DATABASE newdatabase; |
다음으로 셸을 종료합니다:
|
1 |
$ EXIT; |
이제 SQL 파일을 데이터베이스로 가져옵니다:
|
1 |
$ sudo mysql -u root -p newdatabase < newdatabase.sql |
-
MySQL 구성 미세 조정
MySQL 구성 파일에 선언해야 할 몇 가지 사항이 있습니다. 텍스트 편집기에서 구성 파일을 엽니다:
|
1 |
$ sudo nano /etc/mysql/my.cnf |
다음 항목은 mysqld 섹션 아래에 들어가야 합니다. 그렇지 않으면 작동하지 않습니다. 첫 번째는 서버 ID입니다. 앞서 언급했듯이, 소스-복제본 복제 구성의 모든 서버에 대해 고유해야 합니다. 데모를 위해 다음과 같이 설정합니다: 2:
|
1 |
$ server-id = 2 |
다음으로 아래 줄을 추가합니다:
|
1 2 3 |
$ relay-log = /var/log/mysql/mysql-relay-bin.log $ log_bin = /var/log/mysql/mysql-bin.log $ binlog_do_db = newdatabase |
여기서 오직 relay-log만 새로운 항목입니다. 이는 복제 중에 복제본 서버가 생성하는 로그입니다. 로그 형식은 바이너리 로그와 동일합니다. 구성 파일을 저장하고 MySQL을 다시 시작합니다:
|
1 |
$ sudo service mysql restart |
-
복제 활성화
마지막으로, MySQL 내에서 복제를 활성화할 준비가 되었습니다. MySQL 셸을 실행합니다:
|
1 |
$ sudo mysql -u root -p |
다음 명령을 실행합니다. 먼저 IP 주소, 사용자 이름 및 비밀번호를 그에 맞게 변경합니다:
|
1 |
$ CHANGE MASTER TO MASTER_HOST='31.171.240.179',MASTER_USER='cloudsigma_master', MASTER_PASSWORD='password_123', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS= 107; |
이 명령은 다음을 수행합니다:
- 현재 서버가 소스 서버의 복제본으로 표시됩니다.
- 복제본 서버에 올바른 로그인 자격 증명이 설정됩니다.
- 복제본 서버가 어디서부터 복제를 시작해야 하는지 알게 됩니다. 소스 서버에서 확인한 데이터베이스 상태를 기억하시나요? 소스 로그 파일과 로그 위치가 거기서 제공됩니다.
마지막으로 복제본 서버를 활성화합니다:
|
1 |
$ START REPLICA; |
-
기타
복제본의 현재 상태에 대한 세부 정보를 확인해야 하나요? MySQL 셸에서 다음 명령을 실행하세요. 끝에 있는 \G는 텍스트를 더 읽기 쉽게 재배치하기 위한 것입니다:
|
1 |
$ SHOW REPLICA STATUS\G |
연결 문제가 있는 경우, 복제본 서버를 시작하여 이를 건너뛰어 보세요:
|
1 |
$ SET GLOBAL SQL_REPLICA_SKIP_COUNTER = 1; REPLICA START; |
결론
MySQL 복제는 많은 시사점을 가집니다. 이는 기본적인 형태에 대한 간단한 시연일 뿐입니다. 하지만 여러 소스-복제본(source-replica) 구성으로 쉽게 확장할 수 있습니다. 동일한 단계가 더 높은 수준의 복잡한 구성에도 적용됩니다. 나중에 구성을 테스트해 보는 것이 항상 좋습니다. 몇 가지 insert, delete 또는 update 명령을 소스 데이터베이스에서 실행해 보세요. 설정이 제대로 작동한다면 복제본 데이터베이스가 모든 내용을 올바르게 반영할 것입니다.
또한, MySQL로 할 수 있는 작업들을 다룬 저희 블로그의 더 많은 리소스를 살펴보실 수 있습니다:
- SQLite vs MySQL vs. PostgreSQL: 관계형 데이터베이스 관리 시스템 비교
- MariaDB 또는 MySQL 루트(root) 비밀번호 재설정 방법
- Ubuntu 20.04에 LEMP 스택(Linux, Nginx, MySQL PHP)을 설치하는 방법
즐거운 컴퓨팅 되세요!







댓글
아직 댓글이 없습니다. 첫 번째로 작성해 보세요.