[JDBC] MySQL(docker) DB replication 적용

2021. 3. 18. 20:53실천해본것들

DB 이중화

version

  • mysql : 5.7

설정파일 준비(local)

  • config_file.cnf
[mysqld]
log-bin=mysql-bin  
server-id=1  
  • 마스터 만들때 참조하는 경로에 담을 파일이다.
  • config_file.cnf
[mysqld]
server-id=2
  • 슬레이브 만들때 참조하는 경로에 담을 파일이다.

이것을 만들기 싫으면 해당 인스턴스의 my.cnf 에서 직접 수정할 수도 있다.

언어 설정

set names = utf8mb4;

MASTER

image1

docker instance를 만들어준다.

  • --volume : config file이 담긴 폴더(로컬)를 지정한다. :(colon) 오른쪽에는 복사될 위치(linux)를 지정한다.

image2

docker 실행 및 설정파일을 확인한다.

마지막 chmod 는 권한 때문에 생기는 문제를 방지한다.

image3

Master의 상태를 확인한다.

file 과 position을 따로 기록해둔다. 나중에 slave 쪽에서 master에 연결할 때 필요하다.

image4

slave 쪽에서 연결하기 위한 용도의 계정을 만든다.

SLAVE

image5

)

image6

)

image7

)

image8

master와 비슷하게 설정하되 port option(-p) 과 volume option(-v)는 달리 해준다.

image9

이전에 기록해둔 log file, position 정보와 master의 docker instance, 계정 정보 를 이용해서 연결하고 slaveDB를 시작한다.

image10

Slave_IO_Running 과 Slave_SQL_Running Option에서 Yes가 떴는지 확인한다.

JDBC 통한 연동

image11

dbName에 따라 DB를 달리 연결하도록 설정하였다.

image12

SELECT는 SLAVE에서, INSERT, UPDATE, DELETE는 MASTER에서 수행해서 부하를 분산시킨다.

이중화 확인 테스트

image13

form에서 회원가입을 수행했다.

image14

Master에 연결하고 insert 문을 실행했지만 결과는 Slave 에도 동일하게 적용된다.

image15

)

image16

board table에도 insert, select 정상수행되는 것을 확인했다.

command log

db 복제 command
// master 생성 
docker run --name mysql-master -p 3307:3306 -v C:\Users\UserName\Desktop\db_replication\master:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=masterpw -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

확인
docker ps -a 
docker exec -it mysql-master bash

ls /etc/mysql/conf.d/
cat /etc/mysql/conf.d/config_file.cnf
chmod 644 /etc/mysql/conf.d/config_file.cnf

mysql -uroot -p


// slave 생성 

docker run --name mysql-slave -p 3308:3306 -v C:\Users\UserName\Desktop\db_replication\slave:/etc/mysql/conf.d -—link mysql-master -e MYSQL_ROOT_PASSWORD=slavepw -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

docker exec -it mysql-slave bash


ls /etc/mysql/conf.d/
cat /etc/mysql/conf.d/config_file.cnf
chmod 644 /etc/mysql/conf.d/config_file.cnf


// master 에서 계정 생성 및 상태 확인

 SHOW MASTER STATUS\G
*************************** 1. row ***************************
             File: mysql-bin.000003
         Position: 154
     Binlog_Do_DB:
 Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)

CREATE USER 'repluser'@'%' IDENTIFIED BY 'replpw';
GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'%';  

// slave 복제 수행 
CHANGE MASTER TO MASTER_HOST='mysql-master', MASTER_USER='repluser', MASTER_PASSWORD='replpw', MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=154;

START SLAVE;

show slave status\G



mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: mysql-master
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 603
               Relay_Log_File: 9bc9673a3d5d-relay-bin.000002
                Relay_Log_Pos: 769
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 603
              Relay_Log_Space: 983
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
                  Master_UUID: cf74abc8-8323-12ec-1d32-0241b31c0002
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set:
                Auto_Position: 0
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
1 row in set (0.00 sec)

Link

'실천해본것들' 카테고리의 다른 글

monday.com 탈퇴하기  (0) 2021.04.21
[MongoDB] Java driver 연동 & quickstart  (0) 2021.03.27
AWS - 1 - EC2 instance 생성  (0) 2020.08.23
install PyQt designer  (0) 2020.07.24
GCP - Kubernetes 예시 사용해보기(GKE)  (0) 2020.07.17