Network/NCP

NCP DB Replication 해보기

git-sun 2023. 2. 18. 17:53

0. 선행작업

저는 윈도우, puTTY를 사용합니다

맥 유저 분들은 puTTY가 아닌 터미널로 진행하셔야합니다

 

DB Replication을 하기 전에, 선행 작업은 다음과 같습니다

 

* ACG 준비와 Master DB와 Slave DB를 위한 서버 생성

* 각 서버에 Mysql 설치

* Mysql에 Replication을 위한 계정 생성

 

 

ACG준비와 서버를 생성하는 과정은 다음 링크를 참고합시다

 

NCP 서버 전개 및 배포1

다음과 같은 환경 및 개발도구 사용하여 팀프로젝트를 NCP에 서버를 전개 및 배포했습니다 NAVER CLOUD PLATFORM(이하 NCP)에 가입하고 콘솔 -> Services -> Server에서 서버를 생성 저는 centos-7.2.-64를 선택했

develop-log-book.tistory.com

 

 

MySQL을 설치하는 과정은 다음 링크를 참고합시다

 

NCP 서버 Mysql 설치

0. 환경 윈도우와 puTTY로 진행됩니다 맥인 경우 puTTY가 아닌 터미널로 진행하셔야 합니다 puTTY와 터미널에서의 명령어는 조금 상이합니다 1. DBMS와 OS 제가 사용했던 MySQL은 8.0버전입니다 서버 생성

develop-log-book.tistory.com

 

 

 

 

Replication을 위한 서버와 ACG는 다음과 같습니다

NCP에 생성된 서버
Replication을 위한 ACG 규칙

 

공인 IP를 메모해둡시다

masterDB 서버의 공인 IP : 101.101.216.67

slaveDB 서버의 공인 IP : 101.101.218.188

 

 

주의할 점

1. master와 slave의 Mysql 버전 통일하는게 좋다는 것(버전이 다르다면, slave의 버전이 더 높아야 합니다)

2. Replication을 진행할 때, master -> slave순을 지킬 것

 

 


 

 

 

1. master 서버에서의 준비

1.1 puTTY로 master서버에 접속

 

 

1.2 root계정으로 Mysql에 접속

[root@testing-master-db ~]# mysql -u root -p

 

 

1.3 Replication을 위한 DB를 생성

mysql> CREATE DATABASE replica_db DEFAULT CHARACTER SET utf8;

 

 

1.4 user01 계정을 생성, DB에 대한 권한을 부여, Replication에 대한 권한 부여

mysql> CREATE USER user01@'%' IDENTIFIED BY 'Qwe123!!';
mysql> GRANT ALL PRIVILEGES ON replica_db.* TO user01@'%';

 

 

1.5 Replication을 위한 계정 생성 및 권한 부여

mysql> create user replica_user@'%' identified by 'Qwe456!!';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%'

 

 

1.6 Replication을 위한 my.cnf 수정

(i를 누르면 insert모드로 바뀝니다)

[root@testing-master-db ~]# vi /etc/my.cnf

 

파일의 마지막에 다음 내용을 추가합니다

(관습적으로 master DB의 server-id는 1로 합니다)

log-bin=mysql-bin
server-id=1

esc로 수정을 종료하고

:wq!를 입력하면 저장하고 나가게됩니다

 

 

 

1.7 Mysql을 재시작

[root@testing-master-db ~]# systemctl restart mysqld

 

 

1.8 mysql 접속, master 서버 정보 확인

master 서버 정보 확인

File 명과 Position 번호를 메모해둡니다

File -> mysql-bin.000001

Position -> 962

 

 

 

1.9 DB를 dump파일(sql파일)로 추출

[root@testing-master-db ~]# mysqldump -p replica_db > replica_db.sql

 


 

 

 

2. slave 서버에서의 준비

2.1 puTTY로 slave서버 접속

 

2.2 root계정의 초기 비밀번호를 확인

[root@testing-slave-db ~]# grep 'temporary password' /var/log/mysqld.log
2023-02-17T05:50:01.218006Z 6 [Note] 
[MY-10454] [Server] A temporary password is generated for root@localhost: b6f;h?0qbg(N

 

 

2.3 Mysql에 root 계정으로 접속합니다

[root@testing-slave-db ~]# mysql -u root -p
Enter password:

 

 

2.4 master서버에서 생성했던 replica_db와 동일한 이름으로 slave서버에 DB를 생성

mysql> CREATE DATABASE replica_db DEFAULT CHARACTER SET utf8;
ERROR 1820(HY000): You must reset your password using ALTER USER statement before executing this statement

 

 

2.5 (Mysql에 처음 접속하는 경우) 비밀번호 재설정

(Mysql에 처음 접속하는 경우, root계정의 비밀번호를 재설정하지 않으면 2.4와 같은 에러가 발생)

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Qwe123!!';
Query OK, 0 rows affected (0.01 sec)

 

 

2.5 비밀번호가 재설정 됐으니 DB 생성을 다시 시도

mysql> CREATE DATABASE replica_db DEFAULT CHARACTER SET utf8;
Query OK, 1 row affected, 1 warning (0.00 sec)

 

 

2.6 user01 계정 생성

root 계정은 되도록 쓰지 않는것이 좋습니다. 따라서 계정을 하나 만들어줍니다

(계정명이 masterDB와 동일할 필요는 없습니다)

mysql> CREATE USER user01@'%' IDENTIFIED BY 'Qwe123!!';
Query OK, 0 rows affected (0.01 sec)

 

 

2.7 user01 계정 권한 부여

master서버에서 slave서버로 dump파일을 전송하기 위해선

slave서버의 user01계정에 권한이 부여되어 있어야 합니다

mysql> GRANT ALL PRIVILEGES ON replica_db.* TO user01@'%';
Query OK, 0 rows affected (0.01 sec)

 

 

2.8 slave서버의 my.cnf 수정

[root@testing-slave-db ~]# vi /etc/my.cnf

 

다음 내용을 추가합니다

server-id=2
replicate-do-db='replica_db'

 

 


 

 

3. master 서버에서 slave 서버로의 dump 파일 전송

3.1 puTTY로 master서버로 접속

 

3.2 다음과 같이 dump파일을 slave서버에 전송

(22는 단일포트의 번호입니다)

(비밀번호는 NCP slave 서버의 관리자 비밀번호입니다)

[root@testing-master-db ~]# scp -P 22 replica_db.sql root@101.101.218.188:/root
root@101.101.218.188's password: 
replica_db.sql                                    100% 1924     1.9KB/s   00:00

 

 

 

 

마참내, 전송이 완료됐습니다

 


 

 

 

4. slave 서버에서의 dump파일 실행

4.1 puTTY로 slave서버로 접속

 

4.2 전송받은 dump파일을 DB에 복원

[root@testing-slave-db ~]# mysql -u user01 -p replica_db < replica_db.sql
Enter password:

 

 

4.3 slave서버의 user01 계정 접속

[root@testing-slave-db ~]# mysql -u user01 -p
Enter password:

 

 

4.5 DATABASE 정보를  확인

mysql> show databases;

+--------------------+
| Database           |
+--------------------+
| information_schema |
| performance_schema |
| replica_db         |
+--------------------+
3 rows in set (0.01 sec)

 

 

생성이 잘 됐습니다!

 


 

 

5. Replication을 위한 연결 설정

이제 master 서버로부터 Replication이 알아서 될 수 있게 설정해봅시다

 

5.1 puTTY로 slave서버 접속

 

5.2 mysql 접속 및 설정

(메모해두었던 부분이 여기서 필요합니다)

mysql> change master to
    -> master_host='101.101.216.67',
    -> master_user='replica_user',
    -> master_password='Qwe456!!',
    -> master_log_file='mysql-bin.000001',
    -> master_log_pos=962;

 

 

5.3 Mysql을 나가고 재시작

mysql> quit;
Bye
[root@testing-slave-db ~]# systemctl restart mysqld

 

 

5.3 연결이 잘 됐는지 확인

아래 내용 중 Slave_IO_Running 또는 Slave_SQL_Running이

No이거나 Connecting이 뜬다면 오류가 발생한것입니다

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 101.101.216.67
                  Master_User: replica_user
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 385
               Relay_Log_File: testing-slave-db-relay-bin.000003
                Relay_Log_Pos: 554
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: replica_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: 385
              Relay_Log_Space: 955
              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: 6830dc53-ae74-11ed-ac51-f220cd58c28b
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Replica 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:
       Master_public_key_path:
        Get_master_public_key: 0
            Network_Namespace:
1 row in set, 1 warning (0.00 sec)

 

 

 

 

여기까지 NCP에 DB Replication 해보기였습니다

 

감사합니다

 

반응형