웹사이트 검색

MySQL 마스터-마스터 복제 설정 방법


상태: 더 이상 사용되지 않음

이 자습서는 더 이상 사용되지 않으며 더 이상 유지 관리되지 않습니다.

이유:

대신 참조:

소개

"Scaling Web Applications\의 두 번째 기사에서는 2개의 VPS를 통해 mysql 배포를 확장하는 데 필요한 단계를 나열합니다.

이 시리즈의 첫 번째 기사는 2개의 VPS를 통해 nginx의 부하를 분산하는 데 필요한 단계를 설명했으며 해당 기사를 먼저 읽는 것이 좋습니다.

MySQL 복제는 MySQL 데이터베이스에 저장된 단일 데이터 세트가 두 번째 서버에 라이브 복사되는 프로세스입니다. "마스터-슬레이브\ 복제라고 하는 이 구성은 일반적인 설정입니다. 마스터-마스터 복제를 통해 데이터를 한 서버에서 다른 서버로 복사할 수 있기 때문에 우리의 설정이 그보다 더 나을 것입니다. 이 미묘하지만 중요한 차이점은 두 서버 중 하나에서 mysql 읽기 또는 쓰기 수행 이 구성은 중복성을 추가하고 데이터 액세스를 처리할 때 효율성을 높입니다.

이 문서의 예제는 서버 C와 서버 D라는 두 개의 VPS를 기반으로 합니다.

서버 C: 3.3.3.3

서버 D: 4.4.4.4

1단계 - 서버 C에 MySQL 설치 및 구성

가장 먼저 해야 할 일은 서버에 mysql-server 및 mysql-client 패키지를 설치하는 것입니다. 다음을 입력하면 됩니다.

sudo apt-get install mysql-server mysql-client

기본적으로 mysql 프로세스는 localhost(127.0.0.1)의 연결만 허용합니다. 이 기본 동작을 변경하고 복제가 제대로 작동하는 데 필요한 몇 가지 다른 설정을 변경하려면 서버 C에서 /etc/mysql/my.cnf를 편집해야 합니다. 변경해야 하는 네 줄이 있으며 현재 수행원:

#server-id              = 1
#log_bin                = /var/log/mysql/mysql-bin.log
#binlog_do_db           = include_database_name
bind-address            = 127.0.0.1

첫 번째 행은 복제 구성에서 특정 서버를 고유하게 식별하는 것입니다. 이 줄 앞에 있는 "#\를 제거하여 해당 줄의 주석을 제거해야 합니다. 두 번째 줄은 mysql 데이터베이스 또는 테이블에 대한 변경 사항이 기록될 파일을 나타냅니다.

세 번째 줄은 서버 간에 복제하려는 데이터베이스를 나타냅니다. 원하는 만큼 이 행에 데이터베이스를 추가할 수 있습니다. 이 문서에서는 단순화를 위해 "예제\라는 단일 데이터베이스를 사용합니다. 마지막 줄은 서버에 인터넷 연결을 수락하도록 지시합니다(127.0.0.1에서 수신 대기하지 않음).

server-id               = 1
log_bin                 = /var/log/mysql/mysql-bin.log
binlog_do_db            = example
# bind-address            = 127.0.0.1

이제 mysql을 다시 시작해야 합니다.

sudo service mysql restart

다음으로 mysql 인스턴스 내에서 일부 명령줄 설정을 변경해야 합니다. 쉘로 돌아가서 다음을 입력하여 루트 mysql 사용자에 액세스할 수 있습니다.

mysql -u root -p 

이 명령이 묻는 암호는 드롭릿의 루트 사용자가 아니라 루트 mysql 사용자의 암호라는 점에 유의하십시오. mysql 셸에 로그인했는지 확인하려면 프롬프트가 다음과 같아야 합니다.

mysql> 

로그인하면 몇 가지 명령을 실행해야 합니다.

두 VPS 간에 데이터를 복제하는 데 사용할 의사 사용자를 생성해야 합니다. 이 문서의 예제에서는 이 사용자의 이름을 "replicator\라고 가정합니다. "password\를 복제에 사용하려는 암호로 바꾸십시오.

create user 'replicator'@'%' identified by 'password'; 

다음으로 이 사용자에게 mysql 데이터를 복제할 수 있는 권한을 부여해야 합니다.

grant replication slave on *.* to 'replicator'@'%'; 

유감스럽게도 복제 권한은 데이터베이스별로 부여할 수 없습니다. 사용자는 구성 파일에서 지시한 데이터베이스만 복제합니다.

초기 서버 C 구성의 마지막 단계에서는 나중에 서버 D에 제공할 현재 MySQL 인스턴스에 대한 정보를 가져와야 합니다.

다음 명령은 기록해 두어야 할 몇 가지 중요한 정보를 출력합니다.

show master status; 

출력은 다음과 유사하게 표시되며 두 가지 중요한 정보가 있습니다.

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      107 | example      |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

다음 단계에서 사용할 파일과 위치를 기록해 두어야 합니다.

2단계 - 서버 D에 MySQL 설치 및 구성

서버 C에서 수행한 것과 동일한 단계를 반복해야 합니다. 먼저 설치해야 하며 다음 명령을 사용하여 수행할 수 있습니다.

sudo apt-get install mysql-server mysql-client

두 패키지가 제대로 설치되면 서버 C를 구성한 것과 거의 동일한 방식으로 구성해야 합니다. 먼저 /etc/mysql/my.cnf 파일을 편집합니다.

sudo nano /etc/mysql/my.cnf

이전에 변경한 것과 같이 구성 파일에서 동일한 네 줄을 변경해야 합니다.

기본값은 아래에 나열되어 있으며 그 뒤에 변경해야 할 사항이 있습니다.

#server-id              = 1
#log_bin                = /var/log/mysql/mysql-bin.log
#binlog_do_db           = include_database_name
bind-address            = 127.0.0.1

아래 줄과 일치하도록 이 네 줄을 변경해야 합니다. 서버 C와 달리 서버 D의 서버 ID는 1로 설정할 수 없습니다.

server-id              = 2
log_bin                = /var/log/mysql/mysql-bin.log
binlog_do_db           = example
# bind-address            = 127.0.0.1

해당 파일을 저장하고 종료한 후 mysql을 다시 시작해야 합니다.

sudo service mysql restart

mysql 셸로 이동하여 몇 가지 추가 구성 옵션을 설정할 때입니다.

mysql -u root -p 

먼저 서버 C에서와 마찬가지로 복제를 담당할 의사 사용자를 생성합니다. "password\를 사용하려는 암호로 바꾸십시오.

create user 'replicator'@'%' identified by 'password'; 

다음으로 VPS 전체에 복제할 데이터베이스를 생성해야 합니다.

create database example; 

그리고 새로 만든 '복제' 사용자 권한을 부여하여 복제할 수 있도록 해야 합니다.

grant replication slave on *.* to 'replicator'@'%'; 

다음 단계는 앞서 기록한 정보를 mysql 인스턴스에 적용하는 것입니다. 이렇게 하면 복제를 시작할 수 있습니다. 다음은 mysql 셸에 입력해야 합니다.

slave stop; 
CHANGE MASTER TO MASTER_HOST = '3.3.3.3', MASTER_USER = 'replicator', MASTER_PASSWORD = 'password', MASTER_LOG_FILE = 'mysql-bin.000001', MASTER_LOG_POS = 107; 
slave start; 

'암호'를 복제를 위해 선택한 암호로 바꿔야 합니다. MASTER_LOG_FILE 및 MASTER_LOG_POS에 대한 값은 위의 값과 다를 수 있습니다. "SHOW MASTER STATUS\가 서버 C에 반환하는 값을 복사해야 합니다.

mysql 마스터-마스터 복제를 완료하기 전에 마지막으로 해야 할 일은 다른 방향(서버 D에서 서버 C로) 복제에 사용할 마스터 로그 파일과 위치를 기록하는 것입니다.

다음을 입력하면 됩니다.

SHOW MASTER STATUS; 

출력은 다음과 유사하게 표시됩니다.

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 |      107 | example      |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

양방향 복제를 완료하려면 서버 C에 입력해야 하므로 파일과 위치를 기록해 둡니다.

다음 단계에서 이를 수행하는 방법을 설명합니다.

3단계 - 서버 C에서 복제 완료

서버 C로 돌아가서 명령줄에서 복제 구성을 완료해야 합니다. 이 명령을 실행하면 서버 D의 모든 데이터가 복제됩니다.

slave stop; 
CHANGE MASTER TO MASTER_HOST = '4.4.4.4', MASTER_USER = 'replicator', MASTER_PASSWORD = 'password', MASTER_LOG_FILE = 'mysql-bin.000004', MASTER_LOG_POS = 107; 
slave start; 

귀하의 가치는 위의 가치와 다를 수 있습니다. MASTER_PASSWORD 값도 복제 사용자 설정 시 생성한 비밀번호로 변경해주세요.

출력은 다음과 유사하게 표시됩니다.

Query OK, 0 rows affected (0.01 sec)

마지막으로 할 일은 두 VPS에서 복제가 작동하는지 테스트하는 것입니다. 마지막 단계에서는 이 구성을 테스트하는 쉬운 방법을 설명합니다.

4단계 - 마스터-마스터 복제 테스트

이제 모든 구성이 설정되었으므로 이제 테스트할 것입니다. 이를 위해 서버 C의 예제 데이터베이스에 테이블을 생성하고 서버 D를 확인하여 표시되는지 확인합니다. 그런 다음 서버 D에서 삭제하고 서버 C에 더 이상 표시되지 않는지 확인합니다.

이제 서버 간에 복제될 데이터베이스를 만들어야 합니다. mysql 셸에서 다음을 입력하면 됩니다.

create database example; 

완료되면 서버 C에 더미 테이블을 생성해 보겠습니다.

create table example.dummy (`id` varchar(10)); 

이제 서버 D를 확인하여 테이블이 존재하는지 확인합니다.

show tables in example; 

다음과 유사한 출력이 표시되어야 합니다.

+-------------------+
| Tables_in_example |
+-------------------+
| dummy             |
+-------------------+
1 row in set (0.00 sec)

마지막 테스트는 서버 D에서 더미 테이블을 삭제하는 것입니다. 서버 C에서도 삭제해야 합니다.

서버 D에 다음을 입력하여 이를 수행할 수 있습니다.

DROP TABLE dummy; 

이를 확인하기 위해 서버 C에서 "show tables\ 명령을 실행하면 테이블이 표시되지 않습니다.

Empty set (0.00 sec)

그리고 당신은 그것을 가지고 있습니다! 작업 mysql 마스터-마스터 복제. 언제나 그렇듯이 모든 피드백을 환영합니다.