.

MySQL 5.6.x Replication(MySQL 5.6 이중화)

by 담배맛구마


참조

MySQL 공식문서

http://dev.mysql.com/doc/refman/5.6/en/replication.html

참고 블로그들

원리부터 설명까지 : http://blog.hibrainapps.net/130

여기도 설명 굿 : http://gywn.net/2012/02/mysql-replication-2/


여기서 설명은 대부분 MySQL 공식문서에서 Setting하는 순서와 여러 블로그 내용을 참조


Step1. Create a Data Snapshot


Replication을 시작하기전에 dump를 이용해 임포트하자.


case1) Using mysqldump

mysqldump -u root -p 'password' --all-databases --master-data=2 > dbdump.sql

mysqldump의 실행결과는 그냥 출력되기에 리다이렉트를 사용해야 한다.

--all-databases

모든 database

--master-data

Slave가 Replication 프로세스를 시작하기전에 필요로하는 상태인 CHANGE MASTER TO를 자동적으로 추가

--master-data=1

이건 잘 모르겠다. 구글링해봥

--master-data=2

이건 sql문으로 작성된다는데 구글링해봥


그냥 --master-data 설정해놓고 찜찜해서 CHANGE MASTER TO를 그냥 해버렸다


Slave로는 다양한 방법이 있겟지만 scp를 사용해서 전송했다.



또 Slave에서는 다음과 같이 적용시켰다.



case2) Using Raw Data Files

DB가 크다면 Raw Data File들을 복사하는 것이 mysqldump를 사용하는 것 보다 효율적이다.



Step2. Master Configuration


- Enable binary logging

바뀐 데이터를 Master에서 Slaves로 보낸데 있어서 기본이기에 반드시 해야만한다.


- Establish a unique server ID

Replication group의 각각의 Server들은 고유의 Server ID를 가지고 있어야한다.

Server ID값은 1부터 65535까지의 양수가 될 수 있다. 어떻게 부여할지는 전적으로 당신의 몫


- MySQL Server를 설치하고 my.cnf나 my.ini 파일을 수정해야한다.

mysqld 섹션에 다음과 같이 추가한다.(yum으로 깔았더니 /etc/my.cnf 라는 경로를 가졌다.)

[mysqld]

log-bin=mysql-bin

server-id=1


- Debian/Ubuntu 같은 OS는 ski-networking이 "bind-address to 127.0.0.1"로 표기

-- 이 주소에 Slave의 주소나 HostName을 넣어야한다.


아래와 같이 설정했다


참고사항

※ Server-id는 설정하지 않으면 기본값은 0이다.

※ 트랜잭션들과함께 InnoDB를 이용해 Replication을 설정하는데 있어서 가능한한 최대한의 지속성과 일관성을 위해

당신은 innodb_flush_log_at_trx_commit=1 과 sync_binlog=1을 my.cnf파일에 추가해야한다.

※ skip-networking 옵션은 당신의 Replication Master에서 사용할 수 없음을 보장한다.

만일 네트워킹이 중지된다면, 당신의 Slave는 Master와 통신할 수가 없고 Replication은 실패하게 된다.

※ Master 또한 Slave라면 my.cnf나 my.ini에 "log-slave-updates"라는 구문을 추가해야한다.


※ Binary Log를 남기게 되는 순간부터 datadir에 가보면(/var/lib/mysql)에 보면 다음과 같이 Log들이 남는다.



Step3. Slave Configuration

- Establish a unique server ID.

server-id 값은 IP주소 같은거로 생각하면된다.

이 ID들은 Replication 파트너와의 통신에서 유일하게 각각의 server instance를 구분한다.

server-id 값을 생략하면 기본값은 0이되며, Master로의 연결을 거부하게 된다.


(Step1과 똑같은 파일입니다)


※ Slave들은 binary logging을 할필요가없지만 데이터 백업이나 충돌 회복 용으로도 사용이 가능하다.

물론 또다른 Slave들을 사용하는데에도 사용이 가능하다.

※ my.cnf에 "report-host=hostname"을 넣어주면 Master에서 "show slave hosts" 명령어가 작동한다.



Step4. Create a User for Replication


Slave들이 Master에 접근하기위해서 Master의 User계정이 필요하다. 

어떤 계정이든 상관없고 REPLICATION SLAVE 권한이 필요하다.

Slave마다 다른 계정을 줄 수도 있고 같은 계정을 줄 수도 있다.

어떤 계정을 따로 만들 필요없지만

master.info에 평문으로 User name과 password가 저장된다는 것을 알고 있어야 한다.

그러므로 Replication 작업만을 위한 계정을 따로 생성할 필요가 있다.


mysql> CREATE USER 'repl'@'IP주소 or 호스트이름' IDENTIFIED BY 'slavepass';


mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.mydomain.com';




Step5. Obtaining the Replication Master Binary Log Coordinates


Replication하기전에 Master의 Binary Log File의 이름과 Position(아마 Coordinates가 이건듯)을 알아야한다.

이 정보들은 나중에 Slave들이 Replication하기 전에 CHANGE MASTER TO작업에서 필요하다.


Master가 남긴 수 많은 Binary Log File들 중에 어떤 File을 어디서 부터 읽을 것이냐? 이런걸 표현하는 것 같다.


MySQL 문서를 보면 이 작업하기전에 반드시 Master에서 하고있는 모든 실행 상태를 정지하라고 한다. 내 생각이지만 계속 작업을 진행중이라면 Binary Log File이 계속 수정될 것이고 Position(Coordinates) 또한 그럴 것이기 때문이다.


mysql> SHOW MASTER STATUS;


File명과 Position을 기록하라!


아래 부터는 MySQL 문서를 대강 번역했다.

-------------------------------------------------------------------------------------------------------------------------------

Replication 작업을 시작하기전에 Slave들과 동기화하길 원하는 Master의 Data들이 있다면, 반드시 Master에서의 모든 실행 상태를 정지하고

다시 실행하기 전까지 Master의 현재 Binary Log 좌표(Position)를 얻어라.


만일 실행상태를 멈출수 없다면, 데이터 dump와 당신이 사용할 마스터의 상황 정보는 match되지 않을 것이고(아다리가 안맞는다는말인듯)

Slave에서 불일치하고 퇴폐된 데이터베이스를 가지게될 것이다.


1st) Master에서 Command-line client로 접속함으로써 세션을 시작하고,

모든 테이블들을 flush하고 "FLUSH TABLES WITH READ LOCK"의 실행으로써 Write Statements들을 Block한다.

※ 만약 client로 세션을 끊으면 Lock을 풀리게 된다.


2nd) Master의 또 다른 세션으로 "SHOW MASTER STATUS"을 통해 현재 binary log파일의 이름과 위치를 확인한다.

나중에 Slave를 세팅할때 필요한다음 기록해두어야한다.

그 정보들은 Slave가 Master로부터 새로운 update의 처리를 시작하기 위해 Replication 좌표를 표현한다.


만일 Master가 binary logging enabled없이(Step2.없이) 이때까지 실행되어왔다면,

로그 파일 이름과 포지션 값들은

SHOW MASTER STATUS"과

mysqldump --master-data에서 empty값일 것이다.

(아까 --master-data가 CHANGE TO MASTER 구문을 자동으로 추가한다고 했는데

CHANGE TO MASTER 구문에서는 Binary Log File이름과 Position을 필요로한다.

자동으로 추가된 File 이름과 Position이 빈 값이라는 표현같다.)

이런 경우에는, Slave의 로그파일과 포지션들을 지정할때 당신이 필요로 할 값들은 empty string('') 값이다.

-------------------------------------------------------------------------------------------------------------------------------



Step6. Start Replication!


모든 준비가 끝났다. Replication을 시작하기전에 마지막 세팅을 하면 된다.

※ 위 에서 mysqldump할때 --master-data 자동으로 추가한다는게 CHANGE MASTER TO 였다.




1) 설정을 해보자

※ 빡 침 주 의 ! ! P u t t y 로 작업 요 망 (숫 자 에 는 작 은 따 옴 표 안 붙 음 ! )


mysql> CHANGE MASTER TO

MASTER_HOST = ' IP주소 ',

MASTER_USER = ' MASTER에 접속할 DB 계정 ',

MASTER_PASSWORD = ' MASTER에 접속할 DB계정의 패스워드',

MASTER_PORT = ' MASTER가 있는 DB의 리스터 포트(MySQL은 디폴트 포드가 3306이다) ',

MASTER_LOG_FILE = ' 아까 기록해두었던 Binary Log File의 이름이다. ',

MASTER_LOG_POS = 아까 기록해두었던 Position값이다. ,

MASTER_CONNECT_RETRY = MASTER로의 접속을 하는 주기이다. 양의 정수로 단위는 초(Second)이다.

;


2) SLAVE 시작

mysql > START SLAVE;


3) 상태확인해보자

mysql > SHOW SLAVE STATUS;

※ 캡쳐가 상당히 더럽지만 핵심은 Waiting for master to send event이다.

Slave의 I/O Thread가 Master의 변경 Event를 감지하고 있는 것이다.

※ SHOW SLAVE STATUS \G; 이렇게하면 깔끔하게 나온다!! Shift + Page Down(OR UP) 으로 스크롤 업 다운



4) Master 쪽에서도 확인을 해보자.

mysql > show slaves host;


※) 만일 Slave에서 계속 접속을 시도하고 있다면?

Solution1) 방화벽을 확인(firewall-cmd로 3306포트를 풀어준다.)


반응형

블로그의 정보

정윤상이다.

담배맛구마

활동하기