본문 바로가기

DB

NCP를 활용한 데이터베이스(MySQL) Replication 구성

개요

개인 프로젝트에 데이터베이스 Replication을 적용해 보자

 

NCP를 사용하여 환경 구축

이번 프로젝트에서는 NCP를 활용하여 데이터베이스 서버를 구성하였습니다.

NCP로 Master 서버 1개와 Slave 서버 1개를 준비하였습니다.

스펙은 다음과 같습니다.

  • DBMS: 이미지 MySQL 5.7
  • OS: ubuntu-14.04
  • 서버 사양: Compact 1 vCPU, 2GB Mem, 50GB Disk

 

서버 인코딩 설정

Mysql 서버를 처음 생성하였을 때 기본 CharacterSet이 latin1입니다.

이걸 UTF8로 변경하지 않으면 한글이 깨져서 보입니다. 

my.cnf 파일을 열어 인코딩 설정을 해야 합니다.

파일 위치를 제대로 찾지 못하여 헤매었습니다.

다음의 명령어로 my.cnf의 위치를 정확히 알고 수정하시길 바랍니다.

find / -name my.cnf

 

저는 /etc/mysql/my.cnf 에 있었습니다.

vi 명령어를 사용하여 편집을 하면 됩니다.

vi /etc/mysql/my.cnf

 

my.cnf파일을 열었는데 빈 파일이라면 아마 잘못 연 것일 겁니다. 

제대로 열었다면 다음 내용을 추가해 줍시다.

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
init_connect=SET collation_connection=utf8_general_ci
init_connect=SET NAMES utf8

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqldump]
default-character-set=utf8

 

MySQL 서버 restart를 진행합니다.

service mysql restart

 

Mysql에 접속하여 Status를 확인해 characterset이 urf8로 변경되었는지 확인합니다.

 

Replication 적용

마스터 서버의 MySQL에 접속하여 계정을 생성합니다.

create user '계정명'@'%' identified by '비밀번호';

 

생성한 계정에 권한을 부여합니다.

 GRANT REPLICATION SLAVE ON *.* to '계정명'@'%' IDENTIFED BY '비밀번호';

 

권한을 부여한 후 flush를 통해 적용합니다.

flush privileges;

mysql DB에 user 테이블에서 계정이 잘 생성되었는지 확인할 수 있습니다.(맨 위에 있는 게 새로 생성된 계정이다.)

 

 

권한을 적용하였으면 MySQL을 나가서 다시 my.cnf 파일에 설정을 추가합니다.

log-bin=mysql-bin
server-id=1
binlog-do-db=DB이름

 

설정을 하였으면 Mysql을 재시작합니다.

service mysql restart

 

이제 Master에서 Slave로 dump 파일을 생성하여 보냅니다.

덤프파일을 생성하기 전에 MySQL 서버에 접속하여 Lock을 걸어야 합니다.

flush tables with read lock;

 

다음 MySQL 서버를 빠져나와 dump 파일을 생성합니다.

 mysqldump -u '계정명' -p DB이름 > DB이름.sql

sql 파일이 잘 생성되었는지 확인해 봅니다.

 

파일이 잘 생성되었다면 이제 slave server에 전송을 합니다.

scp DB이름.sql '슬레이브 서버 관리자 이름'@'슬레이브 서버의 비공인 IP주소':/root/

 

전송까지 완료하였다면 MySQL에 접속하여 Master Status를 확인하고 File명과 poison값을 메모해 기억합시다.

show master status;

 

이후 Lock을 풀어줍니다.

unlock tables;

 

Slave 서버에 접속하여 my.cnf를 수정합니다.

log-bin=mysql-bin
server-id=2
read_only = 1

 

Master에서 보낸 덤프파일을 받습니다.

mysql -u '계정명' -p DB이름 < DB이름.sql

 

Slave MySQL 서버에 접속하여 마스터 정보를 입력합니다.

CHANGE MASTER TO MASTER_HOST='마스터 서버 공인 IP주소', MASTER_PORT=3306, MASTER_USER='위에서 생성한 계정', MASTER_PASSWORD='비밀번호', MASTER_LOG_FILE='Master Status에서 확인한 File명', MASTER_LOG_POS=Master Status에서 확인한 Position 값;

 

이제 Replication을 시작할 수 있습니다.

start slave;

 

Replication을 시작한 후 제대로 적용되었는지 확인해 보겠습니다.

show slave status\G;

 

저는 Slave_IO_Running,  Slave_SQL_Running 이 Yes와 No가 번갈아 가면서 나왔습니다.

다음과 같은 방법으로 문제를 해결해 보겠습니다. 

service stop mysql
rm -rf /var/lib/mysql/auto/cnt
service start mysql

 

만약에 Read_Master_Log_Pos: 값과 Exec_masterlog_pos 값이 차이가 날 경우, 정상적으로 replication 이 실행되지 않는 상태

Last_Errno를 확인하여 my.cnf에 다음과 같은 설정을 추가하여 문제를 해결하였습니다.

작성하고 mysql서버를 restart 합니다.

[mysqld]
slave-skip-errors=에러번호, 에러번호

 

다음 포스팅에서 스프링 개인 프로젝트와 DB를 연결해 보겠습니다.