Day_07-2 (MySQL Replication)

HD.Y·2023년 11월 7일
0

한화시스템 BEYOND SW

목록 보기
7/58
post-thumbnail

기본 이론 ✍

  • 데이터베이스 설계 순서는
    1. 요구사항 분석
    2. 개념적 설계 ( ERD )
    3. 논리적 설계 ( Mapping )
    4. 물리적 설계
    5. 구현
  • 위 처럼 진행되는데 MySQL Replication은 물리적 설계 단계에서 이루어진다.
  • Replication을 한국말로 번역하면 "복제" 라는 뜻인데, 말 그대로 Master 서버에 저장되는 데이터들을 Slave 서버에 자동적으로 복제되도록 만드는 것이다.
  • 그 이유로, 많은 트래픽이 흐르면 DB 서버에 부하가 발생하게 되는데 Replication 을 사용하면 발생하는 부하를 분산시킴으로써 보다 안정적으로 서버를 운영할 수 있도록 해주는 장점이 있다.
  • Master 서버에서는 INSERT, UPDATE, DELETE 만 사용을 하고, Slave 서버에서는 Master 서버에 데이터가 저장 시 남기게 되는 로그(log)를 복사해와서 SELECT 만 사용하게되는 원리이다.

실습 하기❗

  • 사전 준비사항 : 가상머신에 리눅스 컴퓨터 2대를 준비한다.
              ( IP 설정 및 mysql-server 설치 및 초기 설정 / 이전 글 참고)

  • Master 서버 IP : 77.77.77.121 / Slave 서버 IP : 77.77.77.122 로 설정하였다.

  • Master 서버 ( IP : 77.77.77.121 ) 설정

    1. mysql 서버 설정 파일 mysql-server.cnf 을 아래와 같이 수정한다.
      파일 경로 : /etc/my.cnf.d/mysql-server.cnf
    • server-id = 1 : 서버를 여러대 써야하기 때문에 서버마다 id 번호를 부여
    • log-bin=mysql-bin : mysql-bin 이라는 곳에 로그(log)를 binary 형태로 기록

    1. 설정 파일이 바뀌었으므로 서버를 재시작 하고, 설정이 적용됬는지 확인하기 위해 Master 서버의 상태를 확인한다.
    • 서버 재시작 : systemctl restart mysqld
    • Master 서버 상태 확인 : root 계정 (mysql -u root -p) -> show master status;
    • 위 처럼 mysql-bin.000001(숫자는 다를 수 있음) 파일이 생성되면 된다.

    1. 다음으로 Replication 할 때 사용할 Slave 계정을 생성하고 권한을 부여해준다.
    • 계정 생성 : CREATE USER '[Slave 계정명]'@'[Slave 서버 IP]'
            IDENTIFIED BY '[패스워드]';

    • 권한 부여 : GRANT REPLICATION SLAVE ON *.*
            TO '[Slave 계정명]'@'[Slave 서버 IP]';


    1. 정상적으로 Slave 계정 생성 및 권한 부여가 되었는지 확인해준다.
    • 정상적으로 됬다면 위처럼 Repl_slave_priv: Y 가 된 것을 확인할 수 있다.
      ( 제대로 되지 않았다면 N 으로 되어 있을 것이다. )

  • Slave 서버( IP : 77.77.77.122 ) 설정

    1. Master 서버 설정시 했던 것과 동일하게 mysql 서버 설정 파일을 수정해준다.
    • Slave 서버의 경우 server-id 만 부여해주면 된다.

    1. 설정 파일을 수정했으므로 서버를 재시작 해준다 : systemctl restart mysqld
    2. Master를 지정한다 : root 계정으로 접속한 뒤 아래와 같이 입력한다.
      change master to master_host = '[Master 서버 IP]',
      master_user = 'Slave 계정명', master_password = 'Slave 계정 패스워드',
      master_log_file = 'mysql-bin.[Master 로그번호/show master status로 확인]',
      master_log_pos = [Master 포지션 번호/show master status로 확인];
    3. 동기화를 시작한 뒤 Slave 서버의 상태를 확인한다.
    • 동기화 시작 : start slave;
    • Slave 서버 상태 확인 : show slave status\G;
    • 정상적으로 동기화가 됬다면 Slave_IO_Running: YES
      Slave_SQL_Running: YES 를 확인할 수 있다.

  • 설정을 마치고 동작하는것을 확인해 본다.
    1. Master 서버 및 Slave 서버에서 현재 DB를 확인한다. ( 명령어 : show databases; )
    2. Master 서버에서 새로운 DB( Master_Slave )를 생성한다.
      ( 명령어 : CREATE DATABASE Master_Slave; )
    3. Master 서버 및 Slave 서버에서 현재 DB를 재확인한다.
    • 왼쪽이 Master 서버에서 입력한 결과이고 / 오른쪽이 Slave 서버에서 입력한 결과다.
    • Master 서버에서 DB를 새로 생성했을때, Slave 서버에서 별도로 입력하지 않아도 자동으로 동기화되어 Master 서버에서 생성한 DB가 생성된 것을 볼 수 있다.

오늘의 느낀점 👀

  • 오늘 배운 뷰(View) 와 인덱스(Index)를 사용하여 RDBMS에서 데이터를 검색하는 것보다 실제로는 NoSQL(Elastic Search, Redis, Mongo 등) 을 사용하는 곳이 많다는 것을 알았다.

  • 개인 또는 팀프로젝트 시에 "Elastic Search" 구현을 해보는 것도 목표 중 하나로 추가해야겠다는 생각이 들었다.✊✊

  • 또한, SQL 쿼리문에서 DCL 명령어와 Replication 설정하는 방법에 대해서 알아본 시간이었는데 다른 무엇보다 Replication 설정은 새로운 개념이라 그런지 신기했다.🧐

  • master - slave 라는 단어를 CS 공부하면서 글자로만 봤었는데, 실제로 구현해보니 점점 더 개발자로 향해 나아가고 있다는 것을 실감하게 된다.

  • 남은 DB 수업도 열심히 듣고, 자바 수업 전에 자바 프로그래밍 기초를 다시 한번 돌려봐야겠다는 다짐을 해본다.❗
profile
Backend Developer

0개의 댓글