데이터베이스의 읽기/쓰기 부하 분산(Scale-out)과 고가용성을 위해 MySQL 이중화 구성을 진행한다.
1-1) MySQL 8.0 설치 및 초기 설정 (Master/Slave 공통)
가장 먼저 두 대의 EC2 서버에 MySQL을 설치하고, 운영 환경에 필수적인 설정을 진행한다.
1. 패키지 설치
sudo apt update
sudo apt install -y mysql-server
2. [중요] 대소문자 구분 무시 설정 ( lower_case_table_names )
MySQL 8.0부터는 데이터베이스 생성 후 이 설정을 바꾸려면 DB를 재설치해야 할 정도로 까다롭다. 반드시 초기 설치 직후에 설정한다.
주의: MySQL 8.0은 DB 초기화 이후 이 설정을 변경하는 것을 허용하지 않습니다. 설정 변경 후 서비스가 시작되지 않는다면 아래 **[2-1 강제 초기화 방식]**을 따라야 한다.
sudo systemctl stop mysql
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld.conf 추가 내용]
# [mysqld] 섹션에 추가
[mysqld]
lower_case_table_names = 1 # 0: 구분(기본), 1: 구분 안 함
2-1. [참고] 대소문자 구분 무시 설정 (강제 초기화 방식)
이미 DB가 생성되어 설정 변경이 먹히지 않는 경우, 기존 데이터를 삭제하고 설정을 주입하며 새로 태어나게(Initialize) 해야한다.
# 1. 기존 데이터 디렉토리 삭제 (신규 서버에서만 수행!)
sudo rm -rf /var/lib/mysql
sudo mkdir /var/lib/mysql
sudo chown mysql:mysql /var/lib/mysql
sudo chmod 700 /var/lib/mysql
# 2. 설정을 포함하여 DB 강제 초기화
sudo mysqld --defaults-file=/etc/mysql/my.cnf --initialize --lower_case_table_names=1 --user=mysql --console
# 3. 서비스 시작 및 임시 비밀번호 확인
sudo systemctl start mysql
sudo grep 'temporary password' /var/log/mysql/error.log
3. 타임존(Timezone) 설정
시스템과 DB의 시간을 한국 시간(KST)으로 맞춘다.
# 시스템 타임존 변경
sudo timedatectl set-timezone Asia/Seoul
# MySQL 설정 파일에 추가
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
# [mysqld] 섹션에 추가
default-time-zone = '+09:00'
4. 문자 집합 및 정렬 규칙 설정 (utf8mb4)
이모지 지원 및 전 세계 언어의 정교한 정렬을 위해 문자 집합을 설정한다. 데이터가 쌓인 후에는 변경이 어려우므로 초기 설정 시 반드시 포함한다.
# MySQL 설정 파일 수정 (기존에 열려있다면 바로 아래 추가)
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
# [mysqld] 섹션에 추가
character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci
5. MySQL 보안 최적화 및 Hardening ( mysql_secure_installation )
설치와 기본 설정을 마쳤다면, 이제 운영 환경에서 발생할 수 있는 보안 취약점을 제거해본다. MySQL에서 제공하는 보안 스크립트를 통해 익명 사용자 제거, root 원격 접속 제한 등을 설정한다.
sudo mysql_secure_installation
[진행 과정 및 권장 답변]
- VALIDATE PASSWORD COMPONENT?
- 답변: Y (권장)
- 이유: 비밀번호 정책(대소문자, 숫자, 특수문자 조합 등)을 강제하여 취약한 비밀번호 사용을 방지한다.
- Remove anonymous users?
- 답변: Y (필수)
- 이유: 사용자 이름 없이 로그인 가능한 '익명 사용자'를 제거하여 무단 접속을 차단한다.
- Disallow root login remotely?
- 답변: Y (운영 환경 필수)
- 이유: root 계정은 오직 localhost에서만 접속 가능하게 제한한다. 원격 접속이 필요하다면 별도의 일반 사용자 계정을 생성하는 것이 보안상 안전하다.
- Remove test database and access to it?
- 답변: Y (권장)
- 이유: 누구나 접근 가능한 기본 test 데이터베이스를 삭제한다.
- Reload privilege tables now?
- 답변: Y (필수)
- 이유: 지금까지 설정한 변경 사항을 즉시 적용한다.

6. 설정 반영 및 결과 확인
설정 파일 수정이 끝났다면, 변경된 내용을 시스템에 적용하기 위해 서비스를 재시작해야 한다.
sudo systemctl restart mysql
설정 결과 확인을 위해 MySQL 쉘에 접속하여 설정이 의도대로 반영되었는지 최종 확인한다.
sudo mysql -u root -p
-- 1. 대소문자 설정 확인 (결과값이 1이어야 성공)
SHOW VARIABLES LIKE 'lower_case_table_names';
-- 2. 타임존 설정 확인 (결과값이 +09:00 이어야 성공)
SELECT @@global.time_zone, @@session.time_zone;
-- 3. 문자 집합 및 정렬 규칙 확인 (utf8mb4 / utf8mb4_0900_ai_ci)
SHOW VARIABLES LIKE 'character_set_server';
SHOW VARIABLES LIKE 'collation_server';
'[쿠버네티스] AWS 구축 > 5. EC2에서 MySQL Master-Slave 구성' 카테고리의 다른 글
| 참고) 운영 환경을 위한 커넥션(Connection) 최적화 및 트러블슈팅 (0) | 2026.03.24 |
|---|---|
| 4. 실전 테스트: 복제 및 읽기 전용 검증 (0) | 2026.03.24 |
| 3. Slave 서버 설정 (복제본 서버) (0) | 2026.03.24 |
| 2. Master 서버 설정 (원본 데이터 서버) (0) | 2026.03.24 |