MySQL | Ubuntu(우분투), MySQL 8.0↑ Replication 설정
🌈 구성 환경 Master / Slave
Ubuntu 22.04 LTS, MySQL 8.0.31 Community
1. Master 설정
1-1. Replication용 계정 생성 및 replication 권한 부여
[mysql]
특정 아이피를 설정할 경우 % 대신 ip를 입력한다.
create user 유저명@'%' identified by '비밀번호';
grant replication slave on *.* to 유저명@'%';
1-2. Mysql Replication 설정 - mysqld.cnf
[터미널]
vi 명령어로 mysqld.cnf 수정한다.
vi /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld] 바로 아래 부분에 2줄을 추가한다.
server-id: 서버 아이디로 고유 값 설정
log-bin: 바이너리 로그 파일이 생성될 path/이름 설정, path를 지정하지 않을 경우 /var/lib/mysql에 생성된다.
[mysqld]
server-id = 1
log-bin = mysql-bin
1-3. MySQL 재시작
[터미널]
sudo systemctl restart mysql
1-4. Master 상태 확인
[mysql]
show master status;
*Slave 설정에서 사용될 File명과 Position 번호
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 157 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
2. Slave 설정
2-1. Master에서 복제 할 데이터베이스 Dump하여 Slave에 복원한다.
[Linux] SCP 명령어로 서버 간 파일 복사, 가져오기
2-2. Mysql Replication 설정 - mysqld.cnf
[터미널]
vi /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld] 아래 부분에 2줄을 추가한다.
server-id: 서버 아이디로 고유 값 설정
log-bin: 바이너리 로그 파일이 생성 될 path/이름 설정, path를 지정하지 않을 경우 default path(/var/lib/mysql)에 해당 이름으로 로그 파일이 생성된다.
[mysqld]
server-id = 2
log-bin = mysql-bin
read-only = 1
2-3. MySQL 재시작
[터미널]
sudo systemctl restart mysql
2-4. Slave - Master 연결
[mysql]
reset slave;
Master 서버로 연결하기 위한 설정을 한다.
change master to
master_host='Master DB IP',
master_user='1-1에서 생성한 replication용 계정',
master_password='계정 비밀번호',
master_log_file='1-4의 File명',
master_log_pos=1-4의 Position 번호;
2-5. Replication 명령어
시작
[mysql]
start replica;
중지
[mysql]
stop replica;
2-6. Slave 상태 확인
[mysql]
show slave status\G;
❗ 상태에서 필수로 확인
1. Master 관련 설정들
2. Slave_IO_Running: Connection or YES
3. Slave_SQL_Running: YES
[mysql] 프로세스 상태 확인
show processlist\G;
no query specified
Slave 서버에 Error 가 발생하면 발생하였던 시점으로부터 Master 서버로부터 갱신된 쿼리를 실행하지 않는다. 이런 경우 Error를 넘겨야 다음 쿼리를 실행하기 때문에 Slave 서버에 다음과 같이 넣고 restart 해준다.
vi /etc/mysql/mysql.conf.d/mysqld.cnf
→ slave-skip-errors=all 추가
[mysqld]
...
slave-skip-errors=all
Replication 테스트
문제 없이 Replication 설정이 완료되었다면, 실제 잘 동작하는지 확인해본다.
master DB에서 데이터를 생성하고, slave DB에 복제되어 데이터가 조회되는지 확인한다.