여러 데이터베이스의 MySQL 복제. MySQL의 복제란 무엇입니까? 슬레이브 서버에서 추가 작업을 수행합니다.

데이터 복제 mysql하나 이상의 다른 서버(슬레이브 서버)에 있는 마스터 서버(선도 서버)의 한 서버에서 데이터베이스의 정확한 복사본을 가질 수 있습니다. 기본적으로 MySQL 복제는 비동기식입니다.
즉, 마스터 서버는 제어할 수 없으며 슬레이브 서버가 로그 파일을 읽고 있는지, 그리고 올바르게 수행하고 있는지 알 수 없습니다.
이러한 프로세스가 제어되는 다른 유형의 동기화(동기식 및 반동기식)도 있습니다.
설정에 따라 전체 데이터베이스와 개별 데이터베이스 테이블을 모두 복제할 수 있습니다.

복제를 어떤 용도로 사용할 수 있나요?
1. 성능 향상을 위해 호스트 간 부하 분산.
이러한 방식에서 마스터 노드는 읽기 및 쓰기 작업을 수행하고, 마스터 노드에 가입한 노드는 읽기를 위한 기반을 제공하므로 마스터 서버의 읽기 작업을 덜어줍니다.
2. 데이터 보안 및 유지 관리 용이성. 슬레이브 노드에는 읽기 전용 데이터가 포함되어 있으므로 구독자의 데이터 변경이 제한됩니다. 유지 관리 용이성 - 애플리케이션 작동을 중단하지 않고 데이터베이스를 제공하는 프로세스를 실행할 수 있는 기능
3. 장거리 데이터 배포. 위치에 관계없이 모든 호스트에 데이터 복제본을 생성할 수 있습니다.
mysql다음 복제 방법을 지원합니다.
전통적 - 이 방법은 마스터 바이너리 로그 파일의 이벤트 복제를 기반으로 하며 로그 파일이 필요합니다. 마스터 서버와 슬레이브 서버 간의 위치가 동기화되어야 합니다.
글로벌 트랜잭션 식별자 GTID를 사용하는 방법(트랜잭션 방법)
mysql다음 유형의 동기화를 지원합니다.
비동기식(단방향 동기화)
반동기식(가입자 부분 제어)
동기식(가입자에 대한 전체 제어)

MySQL 데이터베이스 복제 기존 방법 설정

작동 원리
마스터 서버에는 다음이 포함됩니다. 큰 상자마스터 데이터베이스에서 발생하는 모든 변경 사항을 기록하는 로그 파일, 이름을 설명하는 파일 큰 상자파일 및 마지막 마스터 데이터가 기록된 로그의 위치
슬레이브 노드는 이름에 대한 정보를 가지고 있는 마스터로부터 데이터를 받습니다. 큰 상자파일 및 로그 파일의 위치입니다.

마법사 설정
my.ini고유 식별자(1부터 2부터 32제곱까지의 숫자, 1, server-id)를 포함해야 합니다.
기본적으로 server-id=0은 슬레이브 서버의 구독을 수락하지 않음을 의미합니다.

로그빈=mysql-bin
서버 ID=1

이 두 줄이면 시작하기에 충분합니다
참고: 단, InnoDB를 사용하는 경우에는 추가로 추가하는 것이 좋습니다.
innodb_flush_log_at_trx_commit=1
sync_binlog=1

그리고 네트워크 작업 기능이 비활성화되어 있지 않고 네트워킹 건너뛰기 매개변수가 설정되어 있는지 확인해야 합니다.
슬레이브 서버는 사용자 이름과 비밀번호를 사용하여 마스터에 연결하므로 먼저 마스터 서버에 사용자를 만듭니다.
사용자 생성 repl@%.mydomain.com은 Slavepass로 식별됩니다.
*.*에 복제 슬레이브를 repl@%.mydomain.com으로 부여합니다.

상태를 살펴보자
마스터 상태 표시
바이너리 로그 생성 절차가 이미 시작된 경우 InnoDB 테이블의 경우 먼저 세션 중 하나에서 테이블을 잠가야 합니다.
읽기 잠금 기능이 있는 테이블을 플러시합니다.
세션을 종료하면 테이블 잠금이 자동으로 해제됩니다.
다른 세션에서는 이름 값을 얻습니다. 큰 상자로그와 위치
두 값 모두 슬레이브 서버가 복제를 시작하기 위해 원하는 위치에서 파일 읽기를 시작해야 하는 복제 좌표를 나타냅니다.
다음 단계는 슬레이브 서버에 데이터가 있는지, 마스터 서버에 데이터가 있는지에 따라 다릅니다.
존재하는 경우 테이블을 잠긴 상태로 두고 생성합니다. 덤프(이것은 InnoDB를 사용할 때 권장되는 방법입니다)
다음 명령을 사용하여 데이터베이스 유형을 확인할 수 있습니다.
mysqlshow -u mysql_user -p -i 데이터베이스 이름
데이터베이스가 바이너리 파일로 저장되어 있으면 마스터 서버에서 슬레이브 서버로 복사할 수 있습니다.
하자 덤프
mysqldump --all-databases --master-data dbdump.db
베이스를 선택하려면 mysqldump --databases --master-data dbdump.db
마스터 데이터 매개변수, 자동으로 추가 마스터를 다음으로 변경슬레이브 노드에서 매개변수가 추가되지 않으면 세션의 모든 테이블을 수동으로 잠가야 합니다.
터놓다
테이블 잠금 해제;

슬레이브 노드 구성
다음에 추가 my.ini마스터 및 기타 노드의 개인 서버 ID

서버 ID=2

구독 만들기
마스터를 다음으로 변경
MASTER_HOST=마스터_호스트_이름,
MASTER_USER=replication_user_name,
MASTER_PASSWORD=replication_password,
MASTER_LOG_FILE=기록_로그_파일_이름,
MASTER_LOG_POS=기록_로그_위치;

기존 데이터로 복제를 설정하는 경우 복제가 시작되기 전에 마스터에서 슬레이브로 스냅샷을 전송해야 합니다.
우리는 사용 mysqldump
1. 다음을 사용하여 슬레이브 노드를 시작합니다. --스킵-슬레이브-시작복제가 시작되지 않도록 하는 매개변수
2. 덤프 파일 가져오기
mysql fulldb.dump
3. 구독 절차를 시작하세요
슬레이브 시작;
복제 상태 확인
슬레이브 상태 표시\G
Slave_IO_State: - 슬레이브 장치의 현재 상태
Slave_IO_Running: - 마스터에서 데이터 스트림을 읽는지 여부
Slave_SQL_Running: - 실행 중입니까? SQL 쿼리, 그렇습니다

마스터(master) 서버를 구성해 봅시다 - ip 11.11.11.10 V my.ini
[
mysqld] 로그-bin=mysql-bin 서버-id=1
사용자 생성 mysql -u root -p GRANT REPLICATION SLAVE ON *.* TO 레플리카@% IDENTIFIED BY 비밀번호; 플러시 권한;
다음으로 데이터베이스의 모든 테이블을 잠급니다. 읽기 잠금 기능이 있는 테이블을 플러시합니다.
상태를 본다 마스터 상태 표시; 파일 이름과 위치를 기억하고 있으며 구독을 위해 슬레이브 서버에서 사용합니다.

슬레이브 B에서 my.ini
로그-bin=mysql-bin 서버-id=2

구독 만들기 마스터를 MASTER_HOST=11.11.11.10, MASTER_PORT=3306으로 변경,
MASTER_USER=복제본, MASTER_PASSWORD=비밀번호,
MASTER_LOG_FILE=서버-mysql-bin.000002,
MASTER_LOG_POS=1151664, MASTER_CONNECT_RETRY=10;
슬레이브 시작;
복제 상태 SHOW SLAVE STATUS\G

복제라는 용어는 정보 보안, 내결함성 및 시스템 성능을 향상시키는 여러 데이터 복사본을 동기화하는 메커니즘을 나타내는 데 사용됩니다. 눈에 띄는 예는 두 서버 간의 데이터베이스 복제입니다.

마스터-슬레이브 MySQL 복제

마스터-슬레이브 용어에서 마스터는 데이터베이스가 있는 기본 서버입니다. 데이터베이스에 쓰지만 읽기는 시스템의 로드에 따라 마스터와 슬레이브 간에 분산되므로 내결함성과 성능이 향상됩니다. 또한 이 접근 방식 덕분에 데이터베이스 복사본이 항상 준비되어 있으며 서버 중 하나에 오류가 발생하면 복원할 수 있습니다.

어떤 상황에서 슬레이브 서버가 필요할 수 있나요? 예를 들어 데이터베이스에 쓰기 위해 대량의 데이터 배열이 도착하고 마스터 서버가 읽을 시간이 없어 클라이언트가 쓰기가 끝날 때까지 기다려야 하는 경우 슬레이브 서버 덕분에 이러한 상황을 피할 수 있습니다.

마스터 서버에 장애가 발생하는 경우도 있는데, 이 경우 마스터 서버가 복구될 때까지 슬레이브 서버가 마스터의 모든 기능을 대신 맡아 단독으로 동작하게 된다. 고객은 아무것도 눈치 채지 못할 가능성이 높으며 기술자가 문제를 해결하는 데 한두 시간, 세 시간을 기다리지 않을 것입니다.

복제 설정은 메커니즘이 처음부터 MySQL에 내장되어 있으므로 전혀 어렵지 않습니다.

마스터 서버에서 설정

주로 /etc/mysql/my.cnf에 있는 구성 파일 my.cnf를 편집하는 것부터 시작해 보겠습니다. 찾아서 주석 처리를 해제(# 제거)하거나 해당 줄을 작성해야 합니다.

바인딩 주소 = 0.0.0.0 서버 ID = 1 log_bin = /var/log/mysql/mysql-bin.log

중요한! 바인드 주소가 이미 등록되어 있으면 변경해야 합니다. 그렇지 않으면 서버 간 연결을 설정할 수 없습니다.

그 직후에 서버에서 데이터베이스를 다시 시작합니다.

/etc/init.d/mysql 재시작

이제 데이터베이스를 복제할 수 있는 권한이 있는 사용자를 생성해야 합니다. 이 작업은 루트에서 수행할 수 있습니다. MySQL 콘솔명령을 사용하여

"slave_password"로 식별된 "slave_user"@"%"에 *.*의 복제 슬레이브를 부여합니다. 플러시 권한;

"slave_user" 및 "slave_password" 대신 슬레이브의 로그인 및 비밀번호를 작성해야 합니다.

이제 마스터 데이터를 살펴보겠습니다.

마스터 상태 표시;

열 값 파일 그리고 위치 기억해야 할 점은 이 값이 슬레이브를 설정하는 데 사용된다는 것입니다. 이제 슬레이브를 설정하는 것입니다.

슬레이브 서버에서 설정

첫 번째 단계는 복제할 데이터베이스와 동일한 이름을 가진 데이터베이스를 생성하는 것입니다. 이는 중요한 단계이므로 무시해서는 안 됩니다. 다음으로 이미 우리에게 익숙한 구성 파일로 이동합니다. 내.cnf 그리고 설정을 씁니다.

서버 ID = 2 릴레이 로그 = /var/log/mysql/mysql-relay-bin.log bin-log = /var/log/mysql/mysql-bin.log

중요한! bin-log에는 bin-log에 대한 경로가 기록됩니다. 메스터 서버에서 . 서버 ID는 마스터 ID와 달라야 하며, 1개 더 설정하는 것이 편리합니다.

마스터를 MASTER_HOST="1.1.1.1", MASTER_USER="slave_user", MASTER_PASSWORD="slave_password", MASTER_LOG_FILE = "mysql-bin.000001", MASTER_LOG_POS = 107로 변경; 슬레이브 시작;

호스트가 마스터의 IP 주소인 경우 로그인 및 비밀번호는 마스터에서 생성한 것과 일치하며 master_log_file 및 master_log_pos는 다음의 정보로 채워집니다. 마스터 서버 구성을 위한 마지막 항목 .

바로 이 순간부터 데이터베이스의 모든 변경 사항은 마스터에서 슬레이브로 전송됩니다.

복제 상태 확인 중

SHOW MASTER STATUS 명령 외에도; 정보가 포함된 테이블을 표시하는 슬레이브 SHOW SLAVE STATUS\G에도 비슷한 것이 있습니다. 서버가 연결되어 있고 올바르게 작동하고 있다는 주요 신호는 이러한 회선이 있다는 것입니다.

복제- 로드 상태에서 작동하는 시스템 아키텍처에 사용되는 기술로, 그 결과 여러 서버에 걸쳐 하나의 데이터베이스로 작업할 때 로드가 분산됩니다. MySQL MASTER SLAVE 복제가 더 자주 사용되지만 두 번째 복제 유형인 마스터-마스터도 사용됩니다.

MySQL MASTER SLAVE 복제란 무엇이며 어떤 용도로 사용됩니까?

복제 주인 노예슬레이브 MySQL 서버에 데이터를 복제하는 작업이 포함되며 이러한 복제는 대부분 신뢰성을 보장하기 위해 수행됩니다. Master 서버에 장애가 발생하면 해당 기능이 Slave로 전환됩니다.

시스템 성능을 향상시키기 위해 복제를 수행할 수도 있지만 여기에서는 성능이 거의 항상 부차적입니다.
애플리케이션이 데이터베이스와 함께 작동할 때 가장 자주 수행되는 작업은 다음과 같습니다. 선택하다- 데이터 읽기, 데이터 수정 요청 - 요청 삭제, 끼워 넣다, 업데이트, 바꾸다통계적으로는 훨씬 덜 자주 발생합니다.

서버 중 하나에 장애가 발생하는 경우 데이터 손실을 방지하기 위해 테이블의 정보를 변경하는 작업은 항상 마스터 서버에서 처리됩니다. 그런 다음 변경 사항이 슬레이브에 복제됩니다. 읽기는 Slave 역할을 하는 서버에서 할 수 있습니다.
이로 인해 안정성과 함께 성능도 향상될 수 있습니다.

이 솔루션은 널리 사용되지만 복제 중에 지연이 발생할 수 있으므로 항상 적용 가능한 것은 아닙니다. 이 경우 마스터 서버에서도 정보를 읽어야 합니다.

특정 유형의 요청을 특정 데이터베이스 서버로 보내는 것은 어떤 경우에도 애플리케이션 수준에서 구현됩니다.

분할을 하면 SELECT 쿼리나머지는 모두 프로그램 수준에서 그 중 하나가 실패할 때 원하는 서버로 보내면 인프라가 제공하는 애플리케이션이 작동하지 않게 됩니다. 이것이 작동하려면 더 많은 것을 제공해야합니다 복잡한 회로각 서버를 예약하세요.

복제는 확장을 위한 것이 아니라 내결함성을 위한 것입니다.

MySQL MASTER SLAVE 복제 - Debian에서 설정

주소가 있는 두 개의 서버를 사용합니다.

  • 마스터 서버 192.168.0.1
  • 슬레이브 서버 192.168.0.2

데모를 위해 로컬 네트워크에 연결된 VDS가 사용되었습니다.
어떤 서버에서 이 명령이나 해당 명령을 실행하고 있는지 항상 확인하기 위해 두 서버 모두에서 /etc/hosts 파일을 편집합니다.

192.168.0.1 마스터

192.168.0.2 슬레이브

/etc/hostname의 기존 값을 각각 마스터와 슬레이브로 바꿔 변경 사항이 적용되도록 하고 서버를 재부팅해 보겠습니다.

1. 마스터 서버에서 설정을 합니다.

루트@마스터:/#

주요 편집 구성 파일데이터베이스 서버

mcedit /etc/mysql/my.cnf

서버 ID를 선택하세요. 임의의 숫자를 지정할 수 있습니다. 기본값은 1입니다. 해당 줄의 주석 처리를 해제하세요.

서버 ID = 1

바이너리 로그에 대한 경로를 설정합니다. 또한 기본적으로 지정되며 주석 처리를 해제합니다.

다른 서버에 복제할 데이터베이스의 이름을 설정합니다.

binlog_do_db = db1

구성 파일을 다시 읽고 변경 사항이 적용되도록 MySQL을 다시 시작합니다.

/etc/init.d/mysql 재시작

2. 이용자에게 필요한 권한을 설정합니다.

데이터베이스 서버 콘솔로 이동합니다.

우리는 슬레이브 서버의 사용자에게 필요한 권한을 부여합니다:

"123"으로 식별된 "slave_user"@"%"에 *.*의 복제 슬레이브를 부여합니다.

데이터베이스의 모든 테이블 잠금

읽기 잠금 기능이 있는 테이블을 플러시합니다.

마스터 서버의 상태 확인:

+——————+———-+—————+——————+
| 파일 | 위치 | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+—————+——————+
| mysql-bin.000001 | 327 | DB1 | |
+——————+———-+—————+——————+
1줄 세트(0.00초)

3. 서버에 데이터베이스 덤프 생성

데이터베이스 덤프를 생성합니다:

mysqldump -u 루트 -p db1 > db1.sql

mysql 콘솔에서 테이블을 잠금 해제합니다.

4. 데이터베이스 덤프를 슬레이브 서버로 전송

scp db1.sql [이메일 보호됨]:/집

슬레이브 서버에서 추가 작업을 수행합니다.

루트@슬레이브:/#

5. 데이터베이스 생성

덤프 로드:

mysql -u 루트 -p db1< db1.sql

6. my.cnf를 변경합니다.

mcedit /etc/mysql/my.cnf

마스터 서버에 설정된 값을 증가시켜 ID를 할당합니다.

서버 ID = 2

릴레이 로그 경로 설정

릴레이 로그 = /var/log/mysql/mysql-relay-bin.log

마스터 서버의 bin 로그 경로

log_bin = /var/log/mysql/mysql-bin.log

베이스 지정

binlog_do_db = db1

서비스 다시 시작

/etc/init.d/mysql 재시작

7. 마스터 서버에 대한 연결 설정

마스터를 MASTER_HOST="192.168.0.1", MASTER_USER="slave_user", MASTER_PASSWORD="123", MASTER_LOG_FILE = "mysql-bin.000001", MASTER_LOG_POS = 327로 변경;

슬레이브 서버에서 복제를 시작합니다.

다음 요청을 통해 슬레이브의 복제 작업을 확인할 수 있습니다.

************************** 1. 행 ******************** * ********
Slave_IO_State: 마스터가 이벤트를 보낼 때까지 기다리는 중
마스터_호스트: 192.168.0.1
마스터_사용자: 슬레이브_사용자
마스터_포트: 3306
연결_재시도: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 107
Relay_Log_File: mysql-relay-bin.000003
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: 예
Slave_SQL_Running: 예
Replicate_Do_DB:
복제_무시_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
마지막_오류 번호: 0
마지막_오류:
건너뛰기_카운터: 0
Exec_Master_Log_Pos: 107
Relay_Log_Space: 555
Until_Condition: 없음
까지_로그_파일:
Until_Log_Pos: 0
Master_SSL_허용: 아니요
Master_SSL_CA_파일:
마스터_SSL_CA_경로:
마스터_SSL_인증서:
Master_SSL_암호:
Master_SSL_키:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: 아니요
Last_IO_Errno: 0
마지막_IO_오류:
Last_SQL_Errno: 0
마지막_SQL_오류:
Replicate_Ignore_Server_Id:
마스터_서버_ID: 1
1줄 세트(0.00초)

오류가 발생하지 않았으므로 복제가 올바르게 구성되었다고 결론을 내릴 수 있습니다.

~이다 좋은 도구크기 조정이 가능하지만 가장 큰 단점은 데이터 복사 및 지연의 비동기화이며 이는 매우 중요할 수 있습니다.

보다 현대적인 솔루션을 사용하면 이러한 문제를 완전히 피할 수 있습니다. 설정이 쉽고 안정적이며 데이터베이스 덤프를 수동으로 복사할 필요가 없습니다.

2009년 4월 8일 오전 11시 10분

MySQL 복제 기본 사항

  • MySQL

MySQL 서버의 복제에 대해서는 비교적 최근에 알게 되었고, 구성에 대한 다양한 실험을 하면서 나에게 맞는 것을 적어보았습니다. 꽤 많은 자료를 모았을 때 이 글을 써야겠다는 생각이 떠올랐습니다. 나는 내가 겪은 가장 기본적인 문제에 대한 팁과 해결책을 수집하려고 노력했습니다. 그 과정에서 문서 및 기타 소스에 대한 링크를 제공하겠습니다. 완전히 설명할 수는 없지만 이 기사가 도움이 되기를 바랍니다.

짧은 소개

복제(라틴어로 replico - 반복합니다)는 기본 데이터베이스 서버에서 하나 이상의 종속 서버로 데이터 변경 사항을 복제하는 것입니다. 메인 서버를 호출하겠습니다 주인및 종속 - 복제본.
마스터에서 발생하는 데이터 변경 사항은 복제본에서 반복됩니다(그 반대는 아님). 따라서 데이터를 변경하는 쿼리(INSERT, UPDATE, DELETE 등)는 마스터에서만 수행되고, 데이터를 읽는 쿼리(즉, SELECT)는 레플리카와 마스터 모두에서 수행될 수 있다. 복제본 중 하나의 복제 프로세스는 다른 복제본의 작동에 영향을 미치지 않으며 실제로 마스터의 작업에도 영향을 미치지 않습니다.
복제는 마스터에 유지되는 바이너리 로그를 사용하여 수행됩니다. 이는 데이터베이스의 변경으로 이어지는(또는 잠재적으로 이어지는) 모든 쿼리를 저장합니다(쿼리는 명시적으로 저장되지 않으므로 쿼리를 보려면 mysqlbinlog 유틸리티를 사용해야 합니다). binlog는 복제본으로 전송되고(마스터에서 다운로드된 binlog를 "릴레이 binlog"라고 함) 저장된 쿼리는 특정 위치부터 실행됩니다. 복제 중에는 변경된 데이터 자체가 전송되는 것이 아니라 변경을 유발하는 요청만 전송된다는 점을 이해하는 것이 중요합니다.
복제를 사용하면 데이터베이스의 내용이 여러 서버에 복제됩니다. 왜 복제에 의존해야 합니까? 몇 가지 이유가 있습니다:
  • 성능과 확장성. 데이터베이스의 동시 읽기 및 쓰기 작업으로 인해 발생하는 로드를 하나의 서버가 처리하지 못할 수도 있습니다. 복제본 생성의 이점은 시스템의 쓰기당 읽기 수가 많을수록 더 커집니다.
  • 결함 허용. 복제본 오류가 발생하는 경우 모든 읽기 요청이 마스터로 안전하게 전송될 수 있습니다. 마스터에 장애가 발생하면 쓰기 요청이 복제본으로 전송될 수 있습니다(마스터가 복원된 후 복제본의 역할을 인계받을 수 있음).
  • 데이터 백업. mysqldump를 수행하기 위해 복제본을 잠시 "느리게" 할 수 있지만 마스터는 그럴 수 없습니다.
  • 연기된 계산. 무겁고 느린 SQL 쿼리는 전체 시스템의 정상적인 작동을 방해할 염려 없이 별도의 복제본에서 실행할 수 있습니다.
게다가 몇 가지 다른 흥미로운 기능도 있습니다. 복제본으로 전송되는 것은 데이터 자체가 아니라 데이터 변경을 유발하는 쿼리이므로 마스터와 복제본에서 서로 다른 테이블 구조를 사용할 수 있습니다. 특히 테이블(엔진) 유형이나 인덱스 집합이 다를 수 있습니다. 예를 들어 전체 텍스트 검색을 수행하려면 마스터가 InnoDB를 사용한다는 사실에도 불구하고 복제본에서 MyISAM 테이블 유형을 사용할 수 있습니다.

복제 설정

작동 중인 데이터베이스가 있다고 가정해 보겠습니다. MySQL 데이터, 이미 데이터가 채워져 작업에 포함되어 있습니다. 위에서 설명한 이유 중 하나로 서버 복제를 활성화할 예정입니다. 초기 데이터:
  • 마스터 IP 주소는 192.168.1.101이고 복제본은 192.168.1.102입니다.
  • MySQL 설치 및 구성
  • testdb 데이터베이스 복제를 구성해야 합니다.
  • 잠시 동안 마법사를 일시 중지할 수 있습니다.
  • 물론 우리는 두 컴퓨터 모두에 루트가 있습니다
마법사 설정
다음 섹션에 고유한 서버 ID, 바이너리 로그 경로 및 복제할 데이터베이스 이름을 표시해야 합니다.
서버 ID = 1
로그 빈 = /var/lib/mysql/mysql-bin
복제-DO-DB = testdb
바이너리 로그를 위한 충분한 디스크 공간이 있는지 확인하세요.

복제를 수행할 권한이 있는 복제 사용자를 추가해 보겠습니다. "복제 슬레이브" 권한이면 충분합니다.
mysql@master> GRANT 복제 슬레이브 ON "testdb".* TO "replication"@"192.168.1.102" ID는 "password"로 식별됩니다.

구성 변경 사항을 적용하려면 MySQL을 재부팅하세요.
root@master# 서비스 mysqld 재시작

모든 것이 제대로 진행되었다면 "show master status" 명령이 다음과 같이 표시되어야 합니다.
mysql@master>마스터 상태 표시\G
파일: mysql-bin.000003
포지션: 98
Binlog_Do_DB:
Binlog_Ignore_DB:
마스터의 데이터베이스가 변경되면 위치 값이 증가해야 합니다.

복제본 설정
구성 섹션에 서버 ID, 복제할 데이터베이스 이름, 릴레이 binlog 경로를 지정한 다음 MySQL을 다시 로드해 보겠습니다.
서버 ID = 2
릴레이 로그 = /var/lib/mysql/mysql-relay-bin
릴레이 로그 인덱스 = /var/lib/mysql/mysql-relay-bin.index
복제-DO-DB = testdb

Root@replica# 서비스 mysqld 다시 시작

데이터 전송 중
여기서는 쓰기를 위해 데이터베이스를 잠가야 합니다. 이를 수행하려면 애플리케이션을 중지하거나 마스터에서 read_only 플래그를 사용할 수 있습니다(주의: 이 플래그는 SUPER 권한이 있는 사용자에게는 영향을 미치지 않습니다). MyISAM 테이블이 있는 경우 "테이블 플러시"도 수행해 보겠습니다.
mysql@master> READ LOCK으로 테이블을 플러시합니다.
mysql@master> SET GLOBAL 읽기_전용 = ON;

"show master status" 명령을 사용하여 마스터의 상태를 확인하고 File 및 Position 값을 기억해 보겠습니다(마스터를 성공적으로 차단한 후에는 변경되지 않아야 함).
파일: mysql-bin.000003
포지션: 98

데이터베이스를 덤프하고 작업이 완료된 후 마스터 잠금을 제거합니다.
mysql@master> SET GLOBAL 읽기_전용 = OFF;

덤프를 복제본으로 전송하고 복제본에서 데이터를 복원합니다.
마지막으로 "change master to" 및 "startslave" 명령을 사용하여 복제를 시작하고 모든 것이 잘 진행되었는지 확인합니다.
mysql@replica> 마스터를 MASTER_HOST = "192.168.1.101"로 변경, MASTER_USER = "복제", MASTER_PASSWORD = "비밀번호", MASTER_LOG_FILE = "mysql-bin.000003", MASTER_LOG_POS = 98;
mysql@replica> 슬레이브 시작;
마스터에서 MASTER_LOG_FILE 및 MASTER_LOG_POS 값을 가져옵니다.

"showslave status" 명령을 사용하여 복제가 어떻게 진행되는지 살펴보겠습니다.
mysql@replica> 슬레이브 상태 표시\G
Slave_IO_State: 마스터가 이벤트를 보낼 때까지 기다리는 중
마스터_호스트: 192.168.1.101
Master_User: 복제
마스터_포트: 3306
연결_재시도: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 98
Relay_Log_File: mysql-relay-bin.001152
Relay_Log_Pos: 235
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: 예
Slave_SQL_Running: 예
Replicate_Do_DB: testdb,testdb
복제_무시_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
마지막_오류 번호: 0
마지막_오류:
건너뛰기_카운터: 0
Exec_Master_Log_Pos: 98
Relay_Log_Space: 235
Until_Condition: 없음
까지_로그_파일:
Until_Log_Pos: 0
Master_SSL_허용: 아니요
Master_SSL_CA_파일:
마스터_SSL_CA_경로:
마스터_SSL_인증서:
Master_SSL_암호:
Master_SSL_키:
Seconds_Behind_Master: 5

지금은 가장 흥미로운 가치를 강조했습니다. 복제가 성공적으로 시작되면 해당 값은 목록과 거의 동일해야 합니다(문서의 "showslave status" 명령에 대한 설명 참조). Seconds_Behind_Master 값은 임의의 정수일 수 있습니다.
복제가 정상이면 복제본은 마스터를 따릅니다(Master_Log_File의 로그 번호와 Exec_Master_Log_Pos 위치가 증가합니다). 이상적으로는 마스터(Seconds_Behind_Master)에서 복제본의 지연 시간이 0과 같아야 합니다. 감소하거나 증가하지 않으면 복제본의 로드가 너무 높을 수 있습니다. 즉, 마스터에서 발생하는 변경 사항을 반복할 시간이 없습니다.
Slave_IO_State가 비어 있고 Seconds_Behind_Master가 NULL이면 복제가 시작되지 않은 것입니다. 이유를 찾아 제거하고 복제를 다시 시작하려면 MySQL 로그를 참조하세요.
mysql@replica> 슬레이브 시작;

이러한 간단한 단계를 통해 우리는 데이터가 마스터의 데이터와 동일한 복제본을 얻습니다.
그런데 마스터가 차단되는 시간은 덤프가 생성되는 시간입니다. 생성하는 데 시간이 너무 오래 걸리는 경우 다음을 시도해 볼 수 있습니다.

  • read_only 플래그를 사용하여 마스터에 쓰기를 차단하고 위치를 기억하고 MySQL을 중지합니다.
  • 그런 다음 데이터베이스 파일을 복제본에 복사하고 마스터를 활성화합니다.
  • 일반적인 방법으로 복제를 시작합니다.
마스터를 전혀 중지하지 않고 복제본을 생성하는 방법에는 여러 가지가 있지만 항상 작동하는 것은 아닙니다.

복제본 추가

이미 작업 중인 마스터와 복제본이 있고 여기에 하나를 더 추가해야 한다고 가정해 보겠습니다. 이는 첫 번째 복제본을 마스터에 추가하는 것보다 훨씬 쉽습니다. 그리고 훨씬 더 좋은 점은 이를 위해 마스터를 막을 필요가 없다는 것입니다.
먼저 두 번째 복제본에서 MySQL을 구성하고 구성에 필요한 매개변수를 입력했는지 확인하겠습니다.
서버 ID = 3
복제-DO-DB = testdb

이제 첫 번째 복제본에서 복제를 중지하겠습니다.
mysql@replica-1> 슬레이브 중지;

복제본은 계속해서 정상적으로 작동하지만 그 안의 데이터는 더 이상 최신 상태가 아닙니다. 상태를 살펴보고 복제를 중지하기 전에 복제본이 도달한 마스터 위치를 기억해 보겠습니다.
mysql@replica-1> 슬레이브 상태 표시\G

필요한 값은 Master_Log_File 및 Exec_Master_Log_Pos입니다.
Master_Log_File: mysql-bin.000004
Exec_Master_Log_Pos: 155

데이터베이스 덤프를 생성하고 첫 번째 복제본에서 복제를 계속해 보겠습니다.
mysql@replica-1> 슬레이브 시작;

두 번째 복제본의 덤프에서 데이터를 복원해 보겠습니다. 그런 다음 복제를 활성화합니다.
mysql@replica-2> 마스터를 MASTER_HOST = "192.168.1.101"로 변경, MASTER_USER = "복제", MASTER_PASSWORD = "비밀번호", MASTER_LOG_FILE = "mysql-bin.000004", MASTER_LOG_POS = 155;
mysql@replica-2> 슬레이브 시작;

MASTER_LOG_FILE 및 MASTER_LOG_POS 값은 각각 첫 번째 복제본에 대한 "showslave status" 명령의 결과에서 나온 Master_Log_File 및 Exec_Master_Log_Pos 값입니다.
복제는 첫 번째 복제본이 중지된 위치에서 시작되어야 합니다(따라서 덤프가 생성됨). 따라서 동일한 데이터를 가진 두 개의 복제본이 있게 됩니다.

복제본 병합

때때로 다음과 같은 상황이 발생합니다. 마스터에 두 개의 데이터베이스가 있으며 그 중 하나는 하나의 복제본에 복제되고 두 번째는 다른 복제본에 복제됩니다. 마스터에 데이터베이스를 덤프하거나 종료하지 않고 두 복제본에 두 데이터베이스의 복제를 설정하는 방법은 무엇입니까? 간단히 말해서 "startslave Until" 명령을 사용하는 것입니다.
따라서 우리는 데이터베이스 testdb1과 testdb2가 있는 마스터를 갖고 있으며, 이 데이터베이스는 각각 복제본-1과 복제본-2에 복제됩니다. 마스터를 중지하지 않고 두 데이터베이스를 모두 Replica-1에 복제하도록 구성해 보겠습니다.
다음 명령을 사용하여 복제본-2에서 복제를 중지하고 마스터 위치를 기억합니다.
mysql@replica-2> 슬레이브 중지;
mysql@replica-2> 슬레이브 상태 표시\G
Master_Log_File: mysql-bin.000015
Exec_Master_Log_Pos: 231

testdb2 데이터베이스의 덤프를 생성하고 복제를 재개해 보겠습니다(이렇게 하면 Replica-2를 사용한 조작이 완료됩니다). 덤프를 Replica-1로 복원합니다.

Replica-1의 상황은 다음과 같습니다. testdb1 데이터베이스가 한 마스터 위치에 있고 계속 복제되고, testdb2 데이터베이스가 다른 위치의 덤프에서 복원되었습니다. 동기화해 보겠습니다.

복제를 중지하고 마스터 위치를 기억해 보겠습니다.
mysql@replica-1> 슬레이브 중지;
mysql@replica-1> 슬레이브 상태 표시\G
Exec_Master_Log_Pos: 501

Replica-1의 구성에서 두 번째 데이터베이스의 이름이 다음 섹션에 표시되어 있는지 확인하겠습니다.
복제-DO-DB = testdb2

구성 변경 사항을 적용하려면 MySQL을 재부팅해 보겠습니다. 그건 그렇고, 복제를 중지하지 않고 간단히 MySQL을 다시 시작하는 것이 가능했습니다. 로그를 통해 마스터 복제의 어느 위치에서 중지되었는지 알 수 있습니다.

이제 Replica-2가 일시 중지된 위치에서 방금 복제를 일시 중지한 위치로 복제해 보겠습니다.
mysql@replica-1> 마스터를 MASTER_HOST = "192.168.1.101"로 변경, MASTER_USER = "복제", MASTER_PASSWORD = "비밀번호", MASTER_LOG_FILE = "mysql-bin.000015", MASTER_LOG_POS = 231;
mysql@replica-1> MASTER_LOG_FILE = "mysql-bin.000016 ", MASTER_LOG_POS = 501까지 슬레이브를 시작합니다.

복제본이 Until 섹션의 지정된 위치에 도달하자마자 복제가 종료되며, 그 후 두 데이터베이스 모두 동일한 마스터 위치(replica-1에서 복제가 중지된 위치)에 해당합니다. 이것을 확인해 봅시다:
mysql@replica-1> 슬레이브 상태 표시\G
mysql@replica-1> 슬레이브 시작;
Master_Log_File: mysql-bin.000016
Exec_Master_Log_Pos: 501

섹션의 Replica-1에 대한 구성에 두 데이터베이스의 이름을 추가해 보겠습니다.
복제-DO-DB = testdb1
복제-DO-DB = testdb2

중요: 각 데이터베이스는 별도의 줄에 나열되어야 합니다.
MySQL을 다시 시작하고 복제를 계속합니다.
mysql@replica-1> 마스터를 MASTER_HOST = "192.168.1.101"로 변경, MASTER_USER = "복제", MASTER_PASSWORD = "비밀번호", MASTER_LOG_FILE = "mysql-bin.000016", MASTER_LOG_POS = 501;
Replica-1이 마스터를 따라잡은 후에는 해당 데이터베이스의 내용이 동일해집니다. 비슷한 방법으로 또는 복제본-1의 전체 덤프를 만들어 데이터베이스를 복제본-2에 병합할 수 있습니다.

캐슬링 마스터 및 레플리카

예를 들어, 마스터 장애가 발생하거나 작업을 수행할 때 복제본을 마스터 모드로 전환해야 할 수도 있습니다. 기술적인 작업. 이러한 전환이 가능하려면 복제본을 마스터처럼 구성하거나 패시브 마스터.

다음 섹션의 구성에서 바이너리 로깅(릴레이 binlog 외에도)을 활성화해 보겠습니다.
로그 빈 = /var/lib/mysql/mysql-bin

그리고 복제할 사용자를 추가합니다.
mysql@master> GRANT 복제 슬레이브 ON 'testdb'.* TO 'replication'@'192.168.1.101′ IDENTIFIED BY "password";

패시브 마스터는 일반 복제본처럼 복제를 수행하지만 추가로 바이너리 로그를 생성합니다. 즉, 여기서 복제를 시작할 수 있습니다. "show master status" 명령을 사용하여 이를 확인해 보겠습니다.
mysql@replica> 마스터 상태 표시\G
파일: mysql-bin.000001
포지션: 61
Binlog_Do_DB:
Binlog_Ignore_DB:

이제 패시브 마스터를 액티브 모드로 전환하려면 해당 마스터에서 복제를 중지하고 이전 액티브 마스터에서 복제를 활성화해야 합니다. 전환 시 데이터가 손실되지 않도록 하려면 활성 마스터쓰기 잠금이 되어 있어야 합니다.
mysql@master> READ LOCK으로 테이블 플러시
mysql@master> SET GLOBAL 읽기_전용 = ON;
mysql@replica> 슬레이브 중지;
mysql@replica> 마스터 상태 표시;
파일: mysql-bin.000001
포지션: 61
mysql@master> 마스터를 MASTER_HOST = "192.168.1.102"로 변경, MASTER_USER = "복제", MASTER_PASSWORD = "비밀번호", MASTER_LOG_FILE = "mysql-bin.000001", MASTER_LOG_POS = 61;
mysql@master> 슬레이브 시작;
그게 다입니다. 그래서 우리는 활성 마스터를 변경했습니다. 이전 마스터에서 블록을 제거할 수 있습니다.

결론

우리는 MySQL에서 복제를 설정하고 몇 가지 기본 작업을 수행하는 방법에 대해 조금 배웠습니다. 안타깝게도 다음과 같은 중요한 질문은 이 문서의 범위를 벗어납니다.

  • 단일 장애 지점(SPF, Single Points of Failure)을 제거합니다. 전용으로 사용시 MySQL 서버, 그 실패로 인해 전체 시스템이 실패했습니다. 여러 대의 서버를 사용하는 경우, 특별히 처리하지 않는 한 그 중 하나에 오류가 발생하면 시스템 오류가 발생합니다. 마스터와 복제본의 장애로 인한 상황을 처리할 수 있는 수단을 제공해야 합니다. 기존 도구 중 하나가 MMM이지만 파일 수정이 필요합니다.
  • 로드 밸런싱. 여러 복제본을 사용할 때 특히 복제본의 성능이 고르지 않은 경우 투명한 균형 조정 메커니즘을 사용하고 싶습니다. Linux에서는 표준 솔루션인 LVS를 사용할 수 있습니다.
  • 응용 프로그램의 논리를 변경합니다. 이상적인 상황에서는 데이터 읽기 요청을 복제본으로 보내고, 데이터 변경 요청을 마스터로 보내야 합니다. 그러나 복제본의 지연 가능성으로 인해 이러한 체계는 종종 효과적이지 않으며 여전히 마스터에서 실행되어야 하는 읽기 요청을 식별해야 합니다.
향후 기사에서 이러한 문제를 다루기를 바랍니다.
관심을 가져주셔서 감사합니다!

태그:

  • mysql
  • 복제
태그 추가

얼마 전 나는 이야기를 해보라는 요청을 받았다. MySQL의 복제. 나는 이 주제가 많은 사람들에게 유용할 것이라고 판단했기 때문에 이 기사에서는 MySQL의 복제란 무엇이며 언제 필요하며 구성 방법.

복제의 주요 임무는 여러 서버의 성능을 결합. 귀하의 웹 사이트에 전용 서버가 있지만 시간이 지남에 따라 방문 횟수가 많아지고 더 이상 부하를 견딜 수 없다고 가정해 보겠습니다. 결과적으로 서버가 정기적으로 느려지고 충돌하기 시작합니다. 가장 쉬운 방법은 더 강력한 서버를 구입하는 것이며, 이것이 대부분의 사람들이 하는 일입니다. 그러나 조만간 서버 가격 인상 비용이 성능 향상과 일치하지 않을 때가 있으므로 구매하는 것이 더 수익성이 높습니다. 2 다른 서버더 적은 돈으로.

결과적으로 데이터베이스는 동시에 두 대의 서버에 있게 됩니다. 하나의 메인 서버(일명 헤드 서버)가 더 이상 대응할 수 없으면 예비 서버로 전환됩니다.

모두 데이터베이스 업데이트 요청은 항상 헤드 서버로 이동합니다.. 헤드 서버를 업데이트한 후 이에 대한 정보를 별도의 파일, 슬레이브 서버가 모든 정보를 얻는 곳입니다. 그러나 일반적으로 가장 많이 발생하고 가장 느린 샘플링 작업은 데이터가 두 서버 모두 동일하기 때문에 이미 슬레이브 서버로 전송될 수 있습니다.

이제 알아 봅시다 MySQL에서 복제를 구성하는 방법:

  1. 가장 많이 설치하세요. 최신 버전의 MySQL모든 서버에.
  2. 메인 서버에 대한 권한을 가진 사용자 생성 슬레이브 교체. 연결할 수 있는 주소는 " 모두".
  3. 모든 서버를 중지합니다.
  4. 설정에서 MySQL(파일에서 내.cnf) 장에서 다음 줄을 추가하세요: log-bin
    server-id=1 주의하세요 서버 ID모든 서버에서 달라야 합니다. 실제로 이것이 한 서버를 다른 서버와 구별하는 요소입니다.
  5. 슬레이브 서버에서 설정에 추가 MySQL다음 줄: master-host=master_host_name
    master-user=created_user의 로그인
    master-password=created_user의 비밀번호
    마스터 포트=port_for_connecting_to_the_master_server
    서버 ID=id_of_this_slave_server
  6. 모든 기지를 이동헤드 서버에서 슬레이브까지.
  7. 달리다헤드 서버, 그 다음에는 모든 슬레이브.