카테고리 없음

AWS 환경에서 MySQL Master - Master 복제 구현

흰색남자 2022. 10. 23. 14:18

환경 정보

OS : CENTOS7

Instance : t2.small

IP & Subnet

1. master-01 // private-03 10.10.10.211:3306

2. master-02 // private-04 10.10.12.96:3306

 

목표 아키텍처 : 고가용성 유지를 위한 Master to Master 동기화

MySQL : 5.7 버전

 

mysql의 백업서버는 비용 문제로 따로 설정하지는 않는다.

  

0. Mysql에서 master to slave 복제 방식

1. Master 서버에서 쿼리 커밋을 수행한다.

2. 해당 쿼리를 innodb엔진에 의해 최적화 과정을 거친다

3. 스토리지 엔진에 해당 쿼리 플랜을 반영한다.

4. 해당 로그를 바이너리 로그 ( bin-log )에 반영한다.

5. master서버의 별도의 스레드가 slave 서버의 i/o 스레드에게 해당 로그를 전달한다.

6. slave 서버는 로그를 Relay 로그에 기록한다.

7. slavesql 스레드에게 해당 변경 데이터를 읽어서 복제한다. ( 스토리지 엔진에 반영한다 )

 

# mysql은 프로세스가 아닌 스레드 기반으로 동작한다.

>> 프로세스 기반으로 동작을 하게 된다면 하나의 쿼리 요청마다 하나의 프로세스가 생기게 되어서 cpu 비용이 크다. 그래서 스레드 기반으로 만들었다고함.

또한 내부적으로 스레드 풀을 이용해서 스레드를 종료시키거나 생성하는 비용을 줄였다고 함.

 

 

 

생소한 용어 정리

1. Master 스레드

bin-log를 읽어서 slave i/o 스레드로 전송하는 단 하나의 역할만을 수행함.

Binlog sender, binlog dump라고도 불림.

해당 스레드에 접속할 경우에는 mysql에 접속하기 위한 계정이 필요하다.

마스터 스레드에 slave 스레드가 접속하고 특정 명령 프토로콜을 수행해서 자신이 replication slave라고 알리고 binary 송신을 요청하는 프로토콜( COM_BINLOG_DUMP, COM_BINLOG_DUMP_GTID )을 요청함.

 

 

2. Slave i/o 스레드

마스터 스레드로부터 지속적으로 수신한 데이터를 relay log파일에 순차적으로 기록함.

해당 파일은 bin-log 파일의 포맷과 일치함.

 

 

 

2. slave sql 스레드

Relay log에서 변경된 데이터를 읽어 스토리지 엔진에 적용하는 역할을 수행함.

당연히 slave i/o 스레드보다 연산량이 많을 수 밖에 없고, mysql 5.7 버전 이상부터는 MTS ( Mulit Thread Salve )가 나오면서 해결됨.

 

 

 

1. MySQL 5.7 설치 ( master 1,2 서버 둘 다 설정 )

 

 

# 파일 다운로드를 위한 wget 설치

sudo yum install wget        

 

# net-tools, vim을 추가적으로 설치.

Sudo yum install vim net-tools openssh-server -y

 

# Mysql 5.7 rpm 다운로드

wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

 

# Mysql 설치

$ sudo yum install mysql-server -y

 

# mysql GPG KEY 등록

sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022                                     

 

 

 

# 초기 비밀번호 세팅 확인

grep 'temporary password' /var/log/mysqld.log

 

 

# 시작 환경 세팅

$ sudo mysql_secure_installation

초기 비밀번호 입력 후 원하는 비밀번호로 변경

비밀번호는 12자리 이상, 대소문자, 특수 문자를 만족하여야함.

 

다음으로 임시 유저 삭제, 루트 계정 원격 로그인 비활성화, 임시 데이터베이스 삭제, 설정 반영을 해야함.

자신이 원하는 조건으로 y or n 으로 설정한다.

 

# Mysql 복제를 위한 my.cnf 파일 수정

Sudo vi /etc/my.cnf

 

Server-id=${num}

Log-bin=mysql-bin

# num은 서버마다 다른 값으로 다르게 설정한다.  

 

 

# 서버 다시 시작

Sudo systemctl restart mysqld              

 

 

 

2. master-1 to master-2 replication 수행

 

# master-1 접속을 위한 계정 생성

grant replication slave on *.* to 'replicator'@'%' identified by ‘Whdgns1002@@’;

flush privileges;

 

# 복제를 하고 싶은 데이터베이스 생성

# 예제를 위한 nexpotdb 생성

Create database nexpotdb;

Use nexpotdb;

# 버전 차이로 인한 sql 파일 변경

Utf8mb4_0990_ai_ci >> utf8mb4_unicode_ci

 

# 모든 sql 파일 적용

Source /home/centos/data/auth_group.sql

 

~~

 

Source /home/centos/data/youtube.sql

 

Sql 파일 모두 적용

 

# 데이터베이스 백업

Mysqldump -u root -p nexpotdb > nexpotdb.sql

 

# master-2로 복사

Scp -I ‘kjhaws.pem’ nexpotdb.sql centos@10.10.32.224:/home/centos/

 

# Master-1 bin, position 정보 확인

# bin : 데이터베이스의 로그파일

# position : 복구에 필요한 log 위치를 가르킴

 

# 복제 서버에서 실행

복제 데이터 베이스 생성

Mysql -u root -p

Create database nexpotdb

Flush privileges;

Exit;

 

Mysql -u root -p nexpotdb < nexpotdb.sql

 

 

위에서 얻은 file, position, master-01 접속정보를 적용해야함.

# public 주소가 아닌 nat주소 기입

change master to master_host='10.10.12.96', master_user='replicator',\

 master_password='Whdgns1002@@', _log_file='mysqld-bin.000002',  master_log_pos=154;

 

start slave;

 

 

# master에서 실행

Show slave status\G;

# 양방향 복사를 위해 똑같이 반대방향에서 위 과정을 실행함.

 

 

 

 

 

 

4. 개선 사항

AWS 환경에서는 VIP 를 개념을 구성하는데 제약조건이 있음.

1. eni 를 옮기는 방식으로 VIP 를 구성해서 헬스체크와 VRRP 를 수행해야하는데 시간이 부족하여 구현하지 못함.

AWS Lambda 서비스를 사용하면 구현을 할 수 있을 것 같은데 추후에 시도함.

 

2. VIP 구현 이슈로 인한 L7 로드밸런싱 기반 Failover를 적용.

AWS Route53 서비스를 기반으로 Failover를 구성하고, 문제가 생겼을 시, standby 서비스로 라우팅함.

 

 

환경 정보

OS : CENTOS7

Instance : t2.small

IP & Subnet

1. master-01 // private-03 10.10.10.211:3306

2. master-02 // private-04 10.10.12.96:3306

 

목표 아키텍처 : 고가용성 유지를 위한 Master to Master 동기화

 

MySQL : 5.7 버전

 

mysql의 백업서버는 비용 문제로 따로 설정하지는 않는다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0. Mysql에서 master to slave 복제 방식

1. Master 서버에서 쿼리 커밋을 수행한다.

2. 해당 쿼리를 innodb엔진에 의해 최적화 과정을 거친다

3. 스토리지 엔진에 해당 쿼리 플랜을 반영한다.

4. 해당 로그를 바이너리 로그 ( bin-log )에 반영한다.

5. master서버의 별도의 스레드가 slave 서버의 i/o 스레드에게 해당 로그를 전달한다.

6. slave 서버는 로그를 Relay 로그에 기록한다.

7. slavesql 스레드에게 해당 변경 데이터를 읽어서 복제한다. ( 스토리지 엔진에 반영한다 )

 

# mysql은 프로세스가 아닌 스레드 기반으로 동작한다.

>> 프로세스 기반으로 동작을 하게 된다면 하나의 쿼리 요청마다 하나의 프로세스가 생기게 되어서 cpu 비용이 크다. 그래서 스레드 기반으로 만들었다고함.

또한 내부적으로 스레드 풀을 이용해서 스레드를 종료시키거나 생성하는 비용을 줄였다고 함.

 

 

 

생소한 용어 정리

1. Master 스레드

bin-log를 읽어서 slave i/o 스레드로 전송하는 단 하나의 역할만을 수행함.

Binlog sender, binlog dump라고도 불림.

해당 스레드에 접속할 경우에는 mysql에 접속하기 위한 계정이 필요하다.

마스터 스레드에 slave 스레드가 접속하고 특정 명령 프토로콜을 수행해서 자신이 replication slave라고 알리고 binary 송신을 요청하는 프로토콜( COM_BINLOG_DUMP, COM_BINLOG_DUMP_GTID )을 요청함.

 

 

2. Slave i/o 스레드

마스터 스레드로부터 지속적으로 수신한 데이터를 relay log파일에 순차적으로 기록함.

해당 파일은 bin-log 파일의 포맷과 일치함.

 

 

 

2. slave sql 스레드

Relay log에서 변경된 데이터를 읽어 스토리지 엔진에 적용하는 역할을 수행함.

당연히 slave i/o 스레드보다 연산량이 많을 수 밖에 없고, mysql 5.7 버전 이상부터는 MTS ( Mulit Thread Salve )가 나오면서 해결됨.

 

 

 

1. MySQL 5.7 설치 ( master 1,2 서버 둘 다 설정 )

 

 

# 파일 다운로드를 위한 wget 설치

sudo yum install wget        

 

# net-tools, vim을 추가적으로 설치.

Sudo yum install vim net-tools openssh-server -y

 

# Mysql 5.7 rpm 다운로드

wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

 

# Mysql 설치

$ sudo yum install mysql-server -y

 

# mysql GPG KEY 등록

sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022                                     

 

 

 

# 초기 비밀번호 세팅 확인

grep 'temporary password' /var/log/mysqld.log

 

 

# 시작 환경 세팅

$ sudo mysql_secure_installation

초기 비밀번호 입력 후 원하는 비밀번호로 변경

비밀번호는 12자리 이상, 대소문자, 특수 문자를 만족하여야함.

 

다음으로 임시 유저 삭제, 루트 계정 원격 로그인 비활성화, 임시 데이터베이스 삭제, 설정 반영을 해야함.

자신이 원하는 조건으로 y or n 으로 설정한다.

 

# Mysql 복제를 위한 my.cnf 파일 수정

Sudo vi /etc/my.cnf

 

Server-id=${num}

Log-bin=mysql-bin

# num은 서버마다 다른 값으로 다르게 설정한다.  

 

 

# 서버 다시 시작

Sudo systemctl restart mysqld              

 

 

 

2. master-1 to master-2 replication 수행

 

# master-1 접속을 위한 계정 생성

grant replication slave on *.* to 'replicator'@'%' identified by ‘Whdgns1002@@’;

flush privileges;

 

# 복제를 하고 싶은 데이터베이스 생성

# 예제를 위한 nexpotdb 생성

Create database nexpotdb;

Use nexpotdb;

# 버전 차이로 인한 sql 파일 변경

Utf8mb4_0990_ai_ci >> utf8mb4_unicode_ci

 

# 모든 sql 파일 적용

Source /home/centos/data/auth_group.sql

 

~~

 

Source /home/centos/data/youtube.sql

 

Sql 파일 모두 적용

 

# 데이터베이스 백업

Mysqldump -u root -p nexpotdb > nexpotdb.sql

 

# master-2로 복사

Scp -I ‘kjhaws.pem’ nexpotdb.sql centos@10.10.32.224:/home/centos/

 

# Master-1 bin, position 정보 확인

# bin : 데이터베이스의 로그파일

# position : 복구에 필요한 log 위치를 가르킴

 

# 복제 서버에서 실행

복제 데이터 베이스 생성

Mysql -u root -p

Create database nexpotdb

Flush privileges;

Exit;

 

Mysql -u root -p nexpotdb < nexpotdb.sql

 

 

위에서 얻은 file, position, master-01 접속정보를 적용해야함.

# public 주소가 아닌 nat주소 기입

change master to master_host='10.10.12.96', master_user='replicator',\

 master_password='Whdgns1002@@', _log_file='mysqld-bin.000002',  master_log_pos=154;

 

start slave;

 

 

# master에서 실행

Show slave status\G;

# 양방향 복사를 위해 똑같이 반대방향에서 위 과정을 실행함.

 

 

 

 

 

 

4. 개선 사항

AWS 환경에서는 VIP 를 개념을 구성하는데 제약조건이 있음.

1. eni 를 옮기는 방식으로 VIP 를 구성해서 헬스체크와 VRRP 를 수행해야하는데 시간이 부족하여 구현하지 못함.

AWS Lambda 서비스를 사용하면 구현을 할 수 있을 것 같은데 추후에 시도함.

 

2. VIP 구현 이슈로 인한 L7 로드밸런싱 기반 Failover를 적용.

AWS Route53 서비스를 기반으로 Failover를 구성하고, 문제가 생겼을 시, standby 서비스로 라우팅함.

 

 

환경 정보

OS : CENTOS7

Instance : t2.small

IP & Subnet

1. master-01 // private-03 10.10.10.211:3306

2. master-02 // private-04 10.10.12.96:3306

 

목표 아키텍처 : 고가용성 유지를 위한 Master to Master 동기화

 

MySQL : 5.7 버전

 

mysql의 백업서버는 비용 문제로 따로 설정하지는 않는다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0. Mysql에서 master to slave 복제 방식

1. Master 서버에서 쿼리 커밋을 수행한다.

2. 해당 쿼리를 innodb엔진에 의해 최적화 과정을 거친다

3. 스토리지 엔진에 해당 쿼리 플랜을 반영한다.

4. 해당 로그를 바이너리 로그 ( bin-log )에 반영한다.

5. master서버의 별도의 스레드가 slave 서버의 i/o 스레드에게 해당 로그를 전달한다.

6. slave 서버는 로그를 Relay 로그에 기록한다.

7. slavesql 스레드에게 해당 변경 데이터를 읽어서 복제한다. ( 스토리지 엔진에 반영한다 )

 

# mysql은 프로세스가 아닌 스레드 기반으로 동작한다.

>> 프로세스 기반으로 동작을 하게 된다면 하나의 쿼리 요청마다 하나의 프로세스가 생기게 되어서 cpu 비용이 크다. 그래서 스레드 기반으로 만들었다고함.

또한 내부적으로 스레드 풀을 이용해서 스레드를 종료시키거나 생성하는 비용을 줄였다고 함.

 

 

 

생소한 용어 정리

1. Master 스레드

bin-log를 읽어서 slave i/o 스레드로 전송하는 단 하나의 역할만을 수행함.

Binlog sender, binlog dump라고도 불림.

해당 스레드에 접속할 경우에는 mysql에 접속하기 위한 계정이 필요하다.

마스터 스레드에 slave 스레드가 접속하고 특정 명령 프토로콜을 수행해서 자신이 replication slave라고 알리고 binary 송신을 요청하는 프로토콜( COM_BINLOG_DUMP, COM_BINLOG_DUMP_GTID )을 요청함.

 

 

2. Slave i/o 스레드

마스터 스레드로부터 지속적으로 수신한 데이터를 relay log파일에 순차적으로 기록함.

해당 파일은 bin-log 파일의 포맷과 일치함.

 

 

 

2. slave sql 스레드

Relay log에서 변경된 데이터를 읽어 스토리지 엔진에 적용하는 역할을 수행함.

당연히 slave i/o 스레드보다 연산량이 많을 수 밖에 없고, mysql 5.7 버전 이상부터는 MTS ( Mulit Thread Salve )가 나오면서 해결됨.

 

 

 

1. MySQL 5.7 설치 ( master 1,2 서버 둘 다 설정 )

 

 

# 파일 다운로드를 위한 wget 설치

sudo yum install wget        

 

# net-tools, vim을 추가적으로 설치.

Sudo yum install vim net-tools openssh-server -y

 

# Mysql 5.7 rpm 다운로드

wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

 

# Mysql 설치

$ sudo yum install mysql-server -y

 

# mysql GPG KEY 등록

sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022                                     

 

 

 

# 초기 비밀번호 세팅 확인

grep 'temporary password' /var/log/mysqld.log

 

# 시작 환경 세팅

$ sudo mysql_secure_installation

초기 비밀번호 입력 후 원하는 비밀번호로 변경

비밀번호는 12자리 이상, 대소문자, 특수 문자를 만족하여야함.

 

다음으로 임시 유저 삭제, 루트 계정 원격 로그인 비활성화, 임시 데이터베이스 삭제, 설정 반영을 해야함.

자신이 원하는 조건으로 y or n 으로 설정한다.

 

# Mysql 복제를 위한 my.cnf 파일 수정

Sudo vi /etc/my.cnf

 

Server-id=${num}

Log-bin=mysql-bin

# num은 서버마다 다른 값으로 다르게 설정한다.  

 

 

# 서버 다시 시작

Sudo systemctl restart mysqld              

 

 

 

2. master-1 to master-2 replication 수행

 

# master-1 접속을 위한 계정 생성

grant replication slave on *.* to 'replicator'@'%' identified by ‘Whdgns1002@@’;

flush privileges;

 

# 복제를 하고 싶은 데이터베이스 생성

# 예제를 위한 nexpotdb 생성

Create database nexpotdb;

Use nexpotdb;

# 버전 차이로 인한 sql 파일 변경

Utf8mb4_0990_ai_ci >> utf8mb4_unicode_ci

 

# 모든 sql 파일 적용

Source /home/centos/data/auth_group.sql

 

~~

 

Source /home/centos/data/youtube.sql

 

Sql 파일 모두 적용

 

# 데이터베이스 백업

Mysqldump -u root -p nexpotdb > nexpotdb.sql

 

# master-2로 복사

Scp -I ‘kjhaws.pem’ nexpotdb.sql centos@10.10.32.224:/home/centos/

 

# Master-1 bin, position 정보 확인

# bin : 데이터베이스의 로그파일

# position : 복구에 필요한 log 위치를 가르킴

# 복제 서버에서 실행

복제 데이터 베이스 생성

Mysql -u root -p

Create database nexpotdb

Flush privileges;

Exit;

 

Mysql -u root -p nexpotdb < nexpotdb.sql

 

 

위에서 얻은 file, position, master-01 접속정보를 적용해야함.

# public 주소가 아닌 nat주소 기입

change master to master_host='10.10.12.96', master_user='replicator',\

 master_password='Whdgns1002@@', _log_file='mysqld-bin.000002',  master_log_pos=154;

 

start slave;

 

# master에서 실행

Show slave status\G;

# 양방향 복사를 위해 똑같이 반대방향에서 위 과정을 실행함.

 

 

 

 

 

 

4. 개선 사항

AWS 환경에서는 VIP 를 개념을 구성하는데 제약조건이 있음.

1. eni 를 옮기는 방식으로 VIP 를 구성해서 헬스체크와 VRRP 를 수행해야하는데 시간이 부족하여 구현하지 못함.

AWS Lambda 서비스를 사용하면 구현을 할 수 있을 것 같은데 추후에 시도함.

 

2. VIP 구현 이슈로 인한 L7 로드밸런싱 기반 Failover를 적용.

AWS Route53 서비스를 기반으로 Failover를 구성하고, 문제가 생겼을 시, standby 서비스로 라우팅함.

 

 

환경 정보

OS : CENTOS7

Instance : t2.small

IP & Subnet

1. master-01 // private-03 10.10.10.211:3306

2. master-02 // private-04 10.10.12.96:3306

 

목표 아키텍처 : 고가용성 유지를 위한 Master to Master 동기화

 

MySQL : 5.7 버전

 

mysql의 백업서버는 비용 문제로 따로 설정하지는 않는다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0. Mysql에서 master to slave 복제 방식

1. Master 서버에서 쿼리 커밋을 수행한다.

2. 해당 쿼리를 innodb엔진에 의해 최적화 과정을 거친다

3. 스토리지 엔진에 해당 쿼리 플랜을 반영한다.

4. 해당 로그를 바이너리 로그 ( bin-log )에 반영한다.

5. master서버의 별도의 스레드가 slave 서버의 i/o 스레드에게 해당 로그를 전달한다.

6. slave 서버는 로그를 Relay 로그에 기록한다.

7. slavesql 스레드에게 해당 변경 데이터를 읽어서 복제한다. ( 스토리지 엔진에 반영한다 )

 

# mysql은 프로세스가 아닌 스레드 기반으로 동작한다.

>> 프로세스 기반으로 동작을 하게 된다면 하나의 쿼리 요청마다 하나의 프로세스가 생기게 되어서 cpu 비용이 크다. 그래서 스레드 기반으로 만들었다고함.

또한 내부적으로 스레드 풀을 이용해서 스레드를 종료시키거나 생성하는 비용을 줄였다고 함.

 

 

 

생소한 용어 정리

1. Master 스레드

bin-log를 읽어서 slave i/o 스레드로 전송하는 단 하나의 역할만을 수행함.

Binlog sender, binlog dump라고도 불림.

해당 스레드에 접속할 경우에는 mysql에 접속하기 위한 계정이 필요하다.

마스터 스레드에 slave 스레드가 접속하고 특정 명령 프토로콜을 수행해서 자신이 replication slave라고 알리고 binary 송신을 요청하는 프로토콜( COM_BINLOG_DUMP, COM_BINLOG_DUMP_GTID )을 요청함.

 

 

2. Slave i/o 스레드

마스터 스레드로부터 지속적으로 수신한 데이터를 relay log파일에 순차적으로 기록함.

해당 파일은 bin-log 파일의 포맷과 일치함.

 

 

 

2. slave sql 스레드

Relay log에서 변경된 데이터를 읽어 스토리지 엔진에 적용하는 역할을 수행함.

당연히 slave i/o 스레드보다 연산량이 많을 수 밖에 없고, mysql 5.7 버전 이상부터는 MTS ( Mulit Thread Salve )가 나오면서 해결됨.

 

 

 

1. MySQL 5.7 설치 ( master 1,2 서버 둘 다 설정 )

 

 

# 파일 다운로드를 위한 wget 설치

sudo yum install wget        

 

# net-tools, vim을 추가적으로 설치.

Sudo yum install vim net-tools openssh-server -y

 

# Mysql 5.7 rpm 다운로드

wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

 

# Mysql 설치

$ sudo yum install mysql-server -y

 

# mysql GPG KEY 등록

sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022                                     

 

 

 

# 초기 비밀번호 세팅 확인

grep 'temporary password' /var/log/mysqld.log

 

 

# 시작 환경 세팅

$ sudo mysql_secure_installation

초기 비밀번호 입력 후 원하는 비밀번호로 변경

비밀번호는 12자리 이상, 대소문자, 특수 문자를 만족하여야함.

 

다음으로 임시 유저 삭제, 루트 계정 원격 로그인 비활성화, 임시 데이터베이스 삭제, 설정 반영을 해야함.

자신이 원하는 조건으로 y or n 으로 설정한다.

 

# Mysql 복제를 위한 my.cnf 파일 수정

Sudo vi /etc/my.cnf

 

Server-id=${num}

Log-bin=mysql-bin

# num은 서버마다 다른 값으로 다르게 설정한다.  

 

 

# 서버 다시 시작

Sudo systemctl restart mysqld              

 

 

 

2. master-1 to master-2 replication 수행

 

# master-1 접속을 위한 계정 생성

grant replication slave on *.* to 'replicator'@'%' identified by ‘Whdgns1002@@’;

flush privileges;

 

# 복제를 하고 싶은 데이터베이스 생성

# 예제를 위한 nexpotdb 생성

Create database nexpotdb;

Use nexpotdb;

# 버전 차이로 인한 sql 파일 변경

Utf8mb4_0990_ai_ci >> utf8mb4_unicode_ci

 

# 모든 sql 파일 적용

Source /home/centos/data/auth_group.sql

 

~~

 

Source /home/centos/data/youtube.sql

 

Sql 파일 모두 적용

 

# 데이터베이스 백업

Mysqldump -u root -p nexpotdb > nexpotdb.sql

 

# master-2로 복사

Scp -I ‘kjhaws.pem’ nexpotdb.sql centos@10.10.32.224:/home/centos/

 

# Master-1 bin, position 정보 확인

# bin : 데이터베이스의 로그파일

# position : 복구에 필요한 log 위치를 가르킴

 

# 복제 서버에서 실행

복제 데이터 베이스 생성

Mysql -u root -p

Create database nexpotdb

Flush privileges;

Exit;

 

Mysql -u root -p nexpotdb < nexpotdb.sql

 

 

위에서 얻은 file, position, master-01 접속정보를 적용해야함.

# public 주소가 아닌 nat주소 기입

change master to master_host='10.10.12.96', master_user='replicator',\

 master_password='Whdgns1002@@', _log_file='mysqld-bin.000002',  master_log_pos=154;

 

start slave;

 

 

# master에서 실행

Show slave status\G;

# 양방향 복사를 위해 똑같이 반대방향에서 위 과정을 실행함.

 

 

 

 

 

 

4. 개선 사항

AWS 환경에서는 VIP 를 개념을 구성하는데 제약조건이 있음.

1. eni 를 옮기는 방식으로 VIP 를 구성해서 헬스체크와 VRRP 를 수행해야하는데 시간이 부족하여 구현하지 못함.

AWS Lambda 서비스를 사용하면 구현을 할 수 있을 것 같은데 추후에 시도함.

 

2. VIP 구현 이슈로 인한 L7 로드밸런싱 기반 Failover를 적용.

AWS Route53 서비스를 기반으로 Failover를 구성하고, 문제가 생겼을 시, standby 서비스로 라우팅함.

 

 

환경 정보

OS : CENTOS7

Instance : t2.small

IP & Subnet

1. master-01 // private-03 10.10.10.211:3306

2. master-02 // private-04 10.10.12.96:3306

 

목표 아키텍처 : 고가용성 유지를 위한 Master to Master 동기화

 

MySQL : 5.7 버전

 

mysql의 백업서버는 비용 문제로 따로 설정하지는 않는다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0. Mysql에서 master to slave 복제 방식

1. Master 서버에서 쿼리 커밋을 수행한다.

2. 해당 쿼리를 innodb엔진에 의해 최적화 과정을 거친다

3. 스토리지 엔진에 해당 쿼리 플랜을 반영한다.

4. 해당 로그를 바이너리 로그 ( bin-log )에 반영한다.

5. master서버의 별도의 스레드가 slave 서버의 i/o 스레드에게 해당 로그를 전달한다.

6. slave 서버는 로그를 Relay 로그에 기록한다.

7. slavesql 스레드에게 해당 변경 데이터를 읽어서 복제한다. ( 스토리지 엔진에 반영한다 )

 

# mysql은 프로세스가 아닌 스레드 기반으로 동작한다.

>> 프로세스 기반으로 동작을 하게 된다면 하나의 쿼리 요청마다 하나의 프로세스가 생기게 되어서 cpu 비용이 크다. 그래서 스레드 기반으로 만들었다고함.

또한 내부적으로 스레드 풀을 이용해서 스레드를 종료시키거나 생성하는 비용을 줄였다고 함.

 

 

 

생소한 용어 정리

1. Master 스레드

bin-log를 읽어서 slave i/o 스레드로 전송하는 단 하나의 역할만을 수행함.

Binlog sender, binlog dump라고도 불림.

해당 스레드에 접속할 경우에는 mysql에 접속하기 위한 계정이 필요하다.

마스터 스레드에 slave 스레드가 접속하고 특정 명령 프토로콜을 수행해서 자신이 replication slave라고 알리고 binary 송신을 요청하는 프로토콜( COM_BINLOG_DUMP, COM_BINLOG_DUMP_GTID )을 요청함.

 

 

2. Slave i/o 스레드

마스터 스레드로부터 지속적으로 수신한 데이터를 relay log파일에 순차적으로 기록함.

해당 파일은 bin-log 파일의 포맷과 일치함.

 

 

 

2. slave sql 스레드

Relay log에서 변경된 데이터를 읽어 스토리지 엔진에 적용하는 역할을 수행함.

당연히 slave i/o 스레드보다 연산량이 많을 수 밖에 없고, mysql 5.7 버전 이상부터는 MTS ( Mulit Thread Salve )가 나오면서 해결됨.

 

 

 

1. MySQL 5.7 설치 ( master 1,2 서버 둘 다 설정 )

 

 

# 파일 다운로드를 위한 wget 설치

sudo yum install wget        

 

# net-tools, vim을 추가적으로 설치.

Sudo yum install vim net-tools openssh-server -y

 

# Mysql 5.7 rpm 다운로드

wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

 

# Mysql 설치

$ sudo yum install mysql-server -y

 

# mysql GPG KEY 등록

sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022                                     

 

 

 

# 초기 비밀번호 세팅 확인

grep 'temporary password' /var/log/mysqld.log

 

 

# 시작 환경 세팅

$ sudo mysql_secure_installation

초기 비밀번호 입력 후 원하는 비밀번호로 변경

비밀번호는 12자리 이상, 대소문자, 특수 문자를 만족하여야함.

 

다음으로 임시 유저 삭제, 루트 계정 원격 로그인 비활성화, 임시 데이터베이스 삭제, 설정 반영을 해야함.

자신이 원하는 조건으로 y or n 으로 설정한다.

 

# Mysql 복제를 위한 my.cnf 파일 수정

Sudo vi /etc/my.cnf

 

Server-id=${num}

Log-bin=mysql-bin

# num은 서버마다 다른 값으로 다르게 설정한다.  

 

 

# 서버 다시 시작

Sudo systemctl restart mysqld              

 

 

 

2. master-1 to master-2 replication 수행

 

# master-1 접속을 위한 계정 생성

grant replication slave on *.* to 'replicator'@'%' identified by ‘Whdgns1002@@’;

flush privileges;

 

# 복제를 하고 싶은 데이터베이스 생성

# 예제를 위한 nexpotdb 생성

Create database nexpotdb;

Use nexpotdb;

# 버전 차이로 인한 sql 파일 변경

Utf8mb4_0990_ai_ci >> utf8mb4_unicode_ci

 

# 모든 sql 파일 적용

Source /home/centos/data/auth_group.sql

 

~~

 

Source /home/centos/data/youtube.sql

 

Sql 파일 모두 적용

 

# 데이터베이스 백업

Mysqldump -u root -p nexpotdb > nexpotdb.sql

 

# master-2로 복사

Scp -I ‘kjhaws.pem’ nexpotdb.sql centos@10.10.32.224:/home/centos/

 

# Master-1 bin, position 정보 확인

# bin : 데이터베이스의 로그파일

# position : 복구에 필요한 log 위치를 가르킴

 

# 복제 서버에서 실행

복제 데이터 베이스 생성

Mysql -u root -p

Create database nexpotdb

Flush privileges;

Exit;

 

Mysql -u root -p nexpotdb < nexpotdb.sql

 

 

위에서 얻은 file, position, master-01 접속정보를 적용해야함.

# public 주소가 아닌 nat주소 기입

change master to master_host='10.10.12.96', master_user='replicator',\

 master_password='Whdgns1002@@', _log_file='mysqld-bin.000002',  master_log_pos=154;

 

start slave;

 

 

# master에서 실행

Show slave status\G;

# 양방향 복사를 위해 똑같이 반대방향에서 위 과정을 실행함.

 

 

 

 

 

 

4. 개선 사항

AWS 환경에서는 VIP 를 개념을 구성하는데 제약조건이 있음.

1. eni 를 옮기는 방식으로 VIP 를 구성해서 헬스체크와 VRRP 를 수행해야하는데 시간이 부족하여 구현하지 못함.

AWS Lambda 서비스를 사용하면 구현을 할 수 있을 것 같은데 추후에 시도함.

 

2. VIP 구현 이슈로 인한 L7 로드밸런싱 기반 Failover를 적용.

AWS Route53 서비스를 기반으로 Failover를 구성하고, 문제가 생겼을 시, standby 서비스로 라우팅함.

 

 

환경 정보

OS : CENTOS7

Instance : t2.small

IP & Subnet

1. master-01 // private-03 10.10.10.211:3306

2. master-02 // private-04 10.10.12.96:3306

 

목표 아키텍처 : 고가용성 유지를 위한 Master to Master 동기화

 

MySQL : 5.7 버전

 

mysql의 백업서버는 비용 문제로 따로 설정하지는 않는다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0. Mysql에서 master to slave 복제 방식

1. Master 서버에서 쿼리 커밋을 수행한다.

2. 해당 쿼리를 innodb엔진에 의해 최적화 과정을 거친다

3. 스토리지 엔진에 해당 쿼리 플랜을 반영한다.

4. 해당 로그를 바이너리 로그 ( bin-log )에 반영한다.

5. master서버의 별도의 스레드가 slave 서버의 i/o 스레드에게 해당 로그를 전달한다.

6. slave 서버는 로그를 Relay 로그에 기록한다.

7. slavesql 스레드에게 해당 변경 데이터를 읽어서 복제한다. ( 스토리지 엔진에 반영한다 )

 

# mysql은 프로세스가 아닌 스레드 기반으로 동작한다.

>> 프로세스 기반으로 동작을 하게 된다면 하나의 쿼리 요청마다 하나의 프로세스가 생기게 되어서 cpu 비용이 크다. 그래서 스레드 기반으로 만들었다고함.

또한 내부적으로 스레드 풀을 이용해서 스레드를 종료시키거나 생성하는 비용을 줄였다고 함.

 

 

 

생소한 용어 정리

1. Master 스레드

bin-log를 읽어서 slave i/o 스레드로 전송하는 단 하나의 역할만을 수행함.

Binlog sender, binlog dump라고도 불림.

해당 스레드에 접속할 경우에는 mysql에 접속하기 위한 계정이 필요하다.

마스터 스레드에 slave 스레드가 접속하고 특정 명령 프토로콜을 수행해서 자신이 replication slave라고 알리고 binary 송신을 요청하는 프로토콜( COM_BINLOG_DUMP, COM_BINLOG_DUMP_GTID )을 요청함.

 

 

2. Slave i/o 스레드

마스터 스레드로부터 지속적으로 수신한 데이터를 relay log파일에 순차적으로 기록함.

해당 파일은 bin-log 파일의 포맷과 일치함.

 

 

 

2. slave sql 스레드

Relay log에서 변경된 데이터를 읽어 스토리지 엔진에 적용하는 역할을 수행함.

당연히 slave i/o 스레드보다 연산량이 많을 수 밖에 없고, mysql 5.7 버전 이상부터는 MTS ( Mulit Thread Salve )가 나오면서 해결됨.

 

 

 

1. MySQL 5.7 설치 ( master 1,2 서버 둘 다 설정 )

 

 

# 파일 다운로드를 위한 wget 설치

sudo yum install wget        

 

# net-tools, vim을 추가적으로 설치.

Sudo yum install vim net-tools openssh-server -y

 

# Mysql 5.7 rpm 다운로드

wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

 

# Mysql 설치

$ sudo yum install mysql-server -y

 

# mysql GPG KEY 등록

sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022                                     

 

 

 

# 초기 비밀번호 세팅 확인

grep 'temporary password' /var/log/mysqld.log

 

 

# 시작 환경 세팅

$ sudo mysql_secure_installation

초기 비밀번호 입력 후 원하는 비밀번호로 변경

비밀번호는 12자리 이상, 대소문자, 특수 문자를 만족하여야함.

 

다음으로 임시 유저 삭제, 루트 계정 원격 로그인 비활성화, 임시 데이터베이스 삭제, 설정 반영을 해야함.

자신이 원하는 조건으로 y or n 으로 설정한다.

 

# Mysql 복제를 위한 my.cnf 파일 수정

Sudo vi /etc/my.cnf

 

Server-id=${num}

Log-bin=mysql-bin

# num은 서버마다 다른 값으로 다르게 설정한다.  

 

 

# 서버 다시 시작

Sudo systemctl restart mysqld              

 

 

 

2. master-1 to master-2 replication 수행

 

# master-1 접속을 위한 계정 생성

grant replication slave on *.* to 'replicator'@'%' identified by ‘Whdgns1002@@’;

flush privileges;

 

# 복제를 하고 싶은 데이터베이스 생성

# 예제를 위한 nexpotdb 생성

Create database nexpotdb;

Use nexpotdb;

# 버전 차이로 인한 sql 파일 변경

Utf8mb4_0990_ai_ci >> utf8mb4_unicode_ci

 

# 모든 sql 파일 적용

Source /home/centos/data/auth_group.sql

 

~~

 

Source /home/centos/data/youtube.sql

 

Sql 파일 모두 적용

 

# 데이터베이스 백업

Mysqldump -u root -p nexpotdb > nexpotdb.sql

 

# master-2로 복사

Scp -I ‘kjhaws.pem’ nexpotdb.sql centos@10.10.32.224:/home/centos/

 

# Master-1 bin, position 정보 확인

# bin : 데이터베이스의 로그파일

# position : 복구에 필요한 log 위치를 가르킴

 

# 복제 서버에서 실행

복제 데이터 베이스 생성

Mysql -u root -p

Create database nexpotdb

Flush privileges;

Exit;

 

Mysql -u root -p nexpotdb < nexpotdb.sql

 

 

위에서 얻은 file, position, master-01 접속정보를 적용해야함.

# public 주소가 아닌 nat주소 기입

change master to master_host='10.10.12.96', master_user='replicator',\

 master_password='Whdgns1002@@', _log_file='mysqld-bin.000002',  master_log_pos=154;

 

start slave;

 

 

# master에서 실행

Show slave status\G;

# 양방향 복사를 위해 똑같이 반대방향에서 위 과정을 실행함.

 

 

 

 

 

 

4. 개선 사항

AWS 환경에서는 VIP 를 개념을 구성하는데 제약조건이 있음.

1. eni 를 옮기는 방식으로 VIP 를 구성해서 헬스체크와 VRRP 를 수행해야하는데 시간이 부족하여 구현하지 못함.

AWS Lambda 서비스를 사용하면 구현을 할 수 있을 것 같은데 추후에 시도함.

 

2. VIP 구현 이슈로 인한 L7 로드밸런싱 기반 Failover를 적용.

AWS Route53 서비스를 기반으로 Failover를 구성하고, 문제가 생겼을 시, standby 서비스로 라우팅함.

 

 

환경 정보

OS : CENTOS7

Instance : t2.small

IP & Subnet

1. master-01 // private-03 10.10.10.211:3306

2. master-02 // private-04 10.10.12.96:3306

 

목표 아키텍처 : 고가용성 유지를 위한 Master to Master 동기화

 

MySQL : 5.7 버전

 

mysql의 백업서버는 비용 문제로 따로 설정하지는 않는다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0. Mysql에서 master to slave 복제 방식

1. Master 서버에서 쿼리 커밋을 수행한다.

2. 해당 쿼리를 innodb엔진에 의해 최적화 과정을 거친다

3. 스토리지 엔진에 해당 쿼리 플랜을 반영한다.

4. 해당 로그를 바이너리 로그 ( bin-log )에 반영한다.

5. master서버의 별도의 스레드가 slave 서버의 i/o 스레드에게 해당 로그를 전달한다.

6. slave 서버는 로그를 Relay 로그에 기록한다.

7. slavesql 스레드에게 해당 변경 데이터를 읽어서 복제한다. ( 스토리지 엔진에 반영한다 )

 

# mysql은 프로세스가 아닌 스레드 기반으로 동작한다.

>> 프로세스 기반으로 동작을 하게 된다면 하나의 쿼리 요청마다 하나의 프로세스가 생기게 되어서 cpu 비용이 크다. 그래서 스레드 기반으로 만들었다고함.

또한 내부적으로 스레드 풀을 이용해서 스레드를 종료시키거나 생성하는 비용을 줄였다고 함.

 

 

 

생소한 용어 정리

1. Master 스레드

bin-log를 읽어서 slave i/o 스레드로 전송하는 단 하나의 역할만을 수행함.

Binlog sender, binlog dump라고도 불림.

해당 스레드에 접속할 경우에는 mysql에 접속하기 위한 계정이 필요하다.

마스터 스레드에 slave 스레드가 접속하고 특정 명령 프토로콜을 수행해서 자신이 replication slave라고 알리고 binary 송신을 요청하는 프로토콜( COM_BINLOG_DUMP, COM_BINLOG_DUMP_GTID )을 요청함.

 

 

2. Slave i/o 스레드

마스터 스레드로부터 지속적으로 수신한 데이터를 relay log파일에 순차적으로 기록함.

해당 파일은 bin-log 파일의 포맷과 일치함.

 

 

 

2. slave sql 스레드

Relay log에서 변경된 데이터를 읽어 스토리지 엔진에 적용하는 역할을 수행함.

당연히 slave i/o 스레드보다 연산량이 많을 수 밖에 없고, mysql 5.7 버전 이상부터는 MTS ( Mulit Thread Salve )가 나오면서 해결됨.

 

 

 

1. MySQL 5.7 설치 ( master 1,2 서버 둘 다 설정 )

 

 

# 파일 다운로드를 위한 wget 설치

sudo yum install wget        

 

# net-tools, vim을 추가적으로 설치.

Sudo yum install vim net-tools openssh-server -y

 

# Mysql 5.7 rpm 다운로드

wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

 

# Mysql 설치

$ sudo yum install mysql-server -y

 

# mysql GPG KEY 등록

sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022                                     

 

 

 

# 초기 비밀번호 세팅 확인

grep 'temporary password' /var/log/mysqld.log

 

 

# 시작 환경 세팅

$ sudo mysql_secure_installation

초기 비밀번호 입력 후 원하는 비밀번호로 변경

비밀번호는 12자리 이상, 대소문자, 특수 문자를 만족하여야함.

 

다음으로 임시 유저 삭제, 루트 계정 원격 로그인 비활성화, 임시 데이터베이스 삭제, 설정 반영을 해야함.

자신이 원하는 조건으로 y or n 으로 설정한다.

 

# Mysql 복제를 위한 my.cnf 파일 수정

Sudo vi /etc/my.cnf

 

Server-id=${num}

Log-bin=mysql-bin

# num은 서버마다 다른 값으로 다르게 설정한다.  

 

 

# 서버 다시 시작

Sudo systemctl restart mysqld              

 

 

 

2. master-1 to master-2 replication 수행

 

# master-1 접속을 위한 계정 생성

grant replication slave on *.* to 'replicator'@'%' identified by ‘Whdgns1002@@’;

flush privileges;

 

# 복제를 하고 싶은 데이터베이스 생성

# 예제를 위한 nexpotdb 생성

Create database nexpotdb;

Use nexpotdb;

# 버전 차이로 인한 sql 파일 변경

Utf8mb4_0990_ai_ci >> utf8mb4_unicode_ci

 

# 모든 sql 파일 적용

Source /home/centos/data/auth_group.sql

 

~~

 

Source /home/centos/data/youtube.sql

 

Sql 파일 모두 적용

 

# 데이터베이스 백업

Mysqldump -u root -p nexpotdb > nexpotdb.sql

 

# master-2로 복사

Scp -I ‘kjhaws.pem’ nexpotdb.sql centos@10.10.32.224:/home/centos/

 

# Master-1 bin, position 정보 확인

# bin : 데이터베이스의 로그파일

# position : 복구에 필요한 log 위치를 가르킴

 

# 복제 서버에서 실행

복제 데이터 베이스 생성

Mysql -u root -p

Create database nexpotdb

Flush privileges;

Exit;

 

Mysql -u root -p nexpotdb < nexpotdb.sql

 

 

위에서 얻은 file, position, master-01 접속정보를 적용해야함.

# public 주소가 아닌 nat주소 기입

change master to master_host='10.10.12.96', master_user='replicator',\

 master_password='Whdgns1002@@', _log_file='mysqld-bin.000002',  master_log_pos=154;

 

start slave;

 

 

# master에서 실행

Show slave status\G;

# 양방향 복사를 위해 똑같이 반대방향에서 위 과정을 실행함.

 

 

 

 

 

 

4. 개선 사항

AWS 환경에서는 VIP 를 개념을 구성하는데 제약조건이 있음.

아래 사진이 구현하려던 아키텍처인데, 실력이 미천하여 구현을 하지 못하였음. 추후에 시도할 예정

1. eni 를 옮기는 방식으로 VIP 를 구성해서 헬스체크와 VRRP 를 수행해야하는데 시간이 부족하여 구현하지 못함.

AWS Lambda 서비스를 사용하면 구현을 할 수 있을 것 같은데 추후에 시도함.

 

2. VIP 구현 이슈로 인한 L7 로드밸런싱 기반 Failover를 적용.

AWS Route53 서비스를 기반으로 Failover를 구성하고, 문제가 생겼을 시, standby 서비스로 라우팅함.