MySQL 8.0.34 CentOS7.8 replication 이중화 구성

2023. 9. 14. 20:29Dev/DB

반응형

우리 회사에서는 네이버 클라우드 서버를 사용중이다.

이번에 회사 DB 서버를 이중화하면서 2일간 고생을 했는데, 잊지 않기 위하여 기록을 한다.

사실 네이버 클라우드의 Cloud for MySQL 서버를 사용하면 이중화 구성이 자동으로 되기 때문에 편하긴 하지만,

2core, 4GB 기준으로 1달 서버비용이 거의 25만원(총 2대 비용)이고, 게다가 DB서버에 접속하기 위한 서버를 1대 더 생성해야 해서, 순수 서버비용만 거의 1달에 30만원이 나가게 된다. 게다가 스토리지 비용도....

 

우리는 스타트업이므로 회사의 서버비용도 절약하고, 나도 DB 관련 지식을 얻을 겸, 이중화 구성을 직접 진행하였다.

 

[ 시스템 사양 ]

- MySQL 버전 : 8.0.34

- OS 버전 : CentOS 7.8 (64비트)

- 서버 : 네이버 클라우드 서버

 

[ 준비물 ]

- 서버 2대 (Master 서버용 / Slave 서버용)

 

[ Replication - 이중화? ]

- Master 서버에 데이터를 Slave 서버에 그대로 복제하는 개념이다.

- 보통 Master 서버는 쓰기/수정/삭제 작업을 수행하고, Slave 서버는 읽기 작업을 수행하여 DB서버의 부하를 낮추거나, DB서버에 문제 발생 시, Slave 서버로 빠르게 변경하여 서비스 지연 시간을 줄이기 위하여 사용한다.

 

[ 필수 숙지사항 ]

- Master 서버와 Slave 서버의 MySQL 버전을 동일하게 맞추거나, Slave 서버의 MySql 버전이 더 높아야 한다.

- 이중화 이전의 데이터는 동기화 되지 않으므로, 필요한 경우 기존 데이터를 덤프로 떠서 Slave서버에 밀어넣는 작업을 해야할 수도 있다.

 

1. MySQL 설치 : 2대의 서버에 모두 설치한다. ( 참고 :  https://engineeringcode.tistory.com/269 )

 

[CentOS 7] MySQL 8.0 설치하는 방법

CentOS 7.8에 MySQL 8.0.30을 설치해야하는 일이 생겨서 하는 김에 정리하였다. 설치가능한 MySQL 8.0 저장소 확인 CentOS 7.8의 기본 YUM 저장소에는 MySQL 8.0이 없다. 그러므로 MySQL 공식 홈페이지에서 제공하

engineeringcode.tistory.com

 

MySQL ( Master 서버 )

-- 1. DB 생성
-- CREATE DATABASE 데이터베이스명 DEFAULT CHARACTER SET utf8;
mysql> CREATE DATABASE testdb DEFAULT CHARACTER SET utf8;

-- 2. DB 생성 결과를 확인한다.
mysql> SHOW databases;

-- 3. Slave 서버에서 접속할 유저 계정 생성 
-- MySQL 8.0 미만
mysql> GRANT REPLICATION slave ON *.* TO 'test_slave'@'%' IDENTIFIED BY '비밀번호';
-- MySQL 8.0 이상 (두 번에 나눠서 실행)
-- %는 모든 IP 접근을 허용하는 것이므로, Slave 서버 IP를 넣어도 됨.
mysql> CREATE USER 'test_slave'@'%' IDENTIFIED BY '비밀번호';
mysql> GRANT REPLICATION slave ON *.* TO 'test_slave'@'%' WITH GRANT OPTION;

-- 4. DB 선택
-- USE DB이름
mysql> USE testdb;


-- 5. 테스트용 Table 생성
mysql> CREATE TABLE t_member (
  id INT AUTO_INCREMENT Primary key,
  name VARCHAR(10)
);

-- 6. MySQL 나가기
mysql> exit

-- 7. MySQL 설정파일 수정 (vi편집기로 수정한 후, 꼭 저장하고 나가자!)
$> vi /etc/my.cnf

-- [mysqld]영역에 아래 내용 추가
log-bin=mysql=bin
server-id=1

-- 8. MySQL 재실행
$> systemctl restart mysql

 

Master 서버 상태 확인

mysql> show master status\G;

위에서 보이는 File 부분과 Position 부분을 확인해둔다.

Slave 서버에서 Master 서버의 저 로그파일의 157번째 라인부터 읽어서 데이터를 복제하도록 설정을 할 예정이다.

 

  MySQL ( Slave 서버 )

-- vi 편집기로 설정파일 열기 (수정 후, 반드시 저장하고 나가자!)
$> vi /etc/my.cnf

-- [mysqld]에 아래 내용을 추가한다.
log-bin=mysql-bin
server-id=2

-- MySQL 재실행
$> systemctl restart mysqld

-- MySQL 접속
$> mysql -u root -p

# DB를 생성한다.
# CREATE DATABASE 테이터베이스명 DEFAULT CHARACTER SET utf8;
mysql> CREATE DATABASE testdb DEFAULT CHARACTER SET utf8;

-- 사용할 DB를 선택한다.
# USE DB이름
mysql> USE testdb;

-- Table 생성
CREATE TABLE t_member(
  id INT AUTO_INCREMENT Primary key,
  name VARCHAR(10)
);

-------- 여기서 중요 !!!!!!! -------------
-- Master 서버의 연동 설정
-- mySQL 8.0.23 버전부터는 "CHANGE MASTER TO" 명령어 대신 "CHANGE REPLICATION SOURCE TO" 명령어 사용
mysql> CHANGE REPLICATION SOURCE TO
MASTER_HOST='마스터서버의 IP(네이버 클라우드 서버이므로 사설IP로 써도 됨)',
MASTER_PORT=3306,
MASTER_USER='test_slave',
MASTER_PASSWORD='비밀번호',
MASTER_LOG_FILE='mysql-bin.000004',
MASTER_LOG_POS=157,
GET_SOURCE_PUBLIC_KEY=1
;

-- ★★ 위 옵션 중에 GET_SOURCE_PUBLIC_KEY=1  이 부분을 넣지 않으면, 아래와 같은 "caching_sha2_password" 오류가 발생함.
Last_IO_Errno: 2061
Last_IO_Error: error connecting to master - retry-time: 1 retries: 2 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.

!! 중요포인트

Master 서버 연동 설정 항목 중에서 "GET_SOURCE_PUBLIC_KEY=1"  이 부분을 넣지 않으면, 아래와 같은 "caching_sha2_password" 오류가 발생한다.
Last_IO_Errno: 2061
Last_IO_Error: error connecting to master - retry-time: 1 retries: 2 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.

 

처음에 저 오류를 어떻게 해결해야 몰라서 구글링을 하다보면, 이중화를 위한 계정을 생성할 때, 아래와 같이 명령어를 입력하여 이전 버전의 암호 체계대로 생성하라고 하는 글이 많이 보인다.

(ex)

mysql> ALTER USER 'test_slave'@'%' IDENFITIFED WITH mysql_native_password BY '비밀번호'

 

그러나, MySQL 8.0.34 버전에서는 'mysql_native_password' 옵션이 deprecated가 되어 저 명령어를 실행할 수 없다.

그러다가 또 구글링을 하다보면, Master <--> Slave 서버간의 SSL 연결이 되도록 이런저런 설정을 하라고 하는데....

이것저것 하다가 잘 안 되었다...ㅜ_ㅜ

 

그러다가 저 옵션을 넣었더니, 잘 됨!!!!!!!!!!!!!!!!!!!!!!!!!

 

 

아래 명령어를 실행하여, 복제를 실행한다.

mysql> start replica; (Mysql 8버전 이하 : start slave;)

 

그리고 Master 서버에서  데이터를 저장하고, Slave 서버에서 데이터를 조회하면, 복제가 잘 되는 것을 확인할 수 있다.

 

 

 

 

 

 

 

 

반응형