재해 복구와 데이터베이스 동기화(master-slave) 및 3계층 아키텍처 + 다중화

rekv·2024년 12월 3일

BEYOND SW CAMP

목록 보기
12/30

재해 복구(DR)

  1. Mirro Sit(미러 사이트)
    주 센터와 동일한 수준의 데이터와 시스템을 원격지에 구축하고 Active 상태로 실시간 동시 서비스를 제공하는 방식

  2. Hot Sit (핫 사이트)
    주 센터와 동일한 수준의 데이터와 시스템을 원격지에 구축하여 Stand-by 상태로 유지하며 재난 발생시 Active 상태로 전환하여 서비스 제공

  3. Warm Site (웜 사이트)
    데이터만 원격지에 보관하고 서비스를 위한 시스템은 확보하지 않거나 최소한으로만 구성하고 재난 발생시에 필요한 시스템을 구성하여 복구

  4. Cold site(콜드 사이트)
    최소한의 준비만 해두는 것

실습

실습을 들어가기 전에

스냅샷

VMware에서 VM -> Snapshot -> Take Snapshot을 통해 현재의 상태를 저장할 수 있다.
* 컴퓨터를 켜둔 상태에서 해도 되지만 그러면 데이터를 많이 먹으므로 끄고 하는 걸 추천

방향 재지정

DB 1에서 DB 2로 파일을 복제하는 방법
: DB 데이터를 백업 후, 이를 옮긴 다음 DB 데이터를 복구한다.

이때, 방향 재지정 > 을 이용할 수 있다.


다음과 같이 사용할 경우 실행 결과가 지정한 이름의 파일로 저장된 걸 볼 수 있다.

윈도우의 MySQL Workbench에서도 동일하게 작용하는 걸 확인할 수 있다. (어제 했던 실습에서 Database에 데이터 impot 할 때)

파일 전송

scp [내 컴퓨터의 파일][다른사람의컴퓨터계정]@[다른사람의컴퓨터ip]:[파일위치 및 이름]

ex) scp ./backup.sql test@192.168.145.113:/home/test/!

파일 받기

cp [다른사람의컴퓨터계정]@[다른사람의컴퓨터ip]:[파일위치 및 이름][내 컴퓨터의 지정된위치]

ex) scp test@192.168.145.113:/home/test/backup.sql ./

*SSH 서버가 설치되어 있어야 보내고 받을 수 있음

데이터 백업

mysqldump -u root -p --all-databases > backup.sql

DB 데이터 복구

mysql -u root -p < backup.sql

DB 서버 동기화 설정

DB 서버 replication 설정(Master, Slave)

  • Master에만 데이터를 작성하고, Slave는 Master의 데이터를 복사해간다.

Master

  1. master 설정

    vi /etc/mysql/mariadb.conf.d/50-server.cnf

[mariadb]	<- 이거는 추가하는거 아님 (109번 라인에 있음)
log-bin
server_id=1 #마스터와 슬레이브의 숫자가 달라야함
log-basename=master1
binlog-format=mixed

  1. master 확인

    mysql

    show master status;

  1. master 서버에 사용자 추가 및 권한 설정
CREATE USER 'slave_user'@'%' IDENTIFIED BY 'qwer1234';
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%';
FLUSH PRIVILEGES;

Slave

  1. DB 서버 설정

    vi /etc/my.cnf.d/mariadb-server.cnf

[mariadb]	<- 이거는 추가하는거 아님
server_id=2

systemctl restart mariadb

  1. Master 지정

    mariadb -u root -p

    CHANGE MASTER TO
    MASTER_HOST='[Master 서버 IP]',
    MASTER_USER='slave_user',
    MASTER_PASSWORD='qwer1234',
    MASTER_PORT=3306,
    MASTER_LOG_FILE='[마스터에서 show master status 했을 때 File 이름]',
    MASTER_LOG_POS=[마스터에서 show master status 했을 때 position 번호],
    MASTER_CONNECT_RETRY=10;
> START SLAVE;

Master에서 show master status; 했을 때 나온 FilePosion의 값을 Slave에 입력해주어야 한다.

  1. Slave 확인

    SHOW SLAVE STATUS\G

    Slave_IO_Running: Yes	
    Slave_SQL_Running: Yes

master에서 show databaase;했을 때

slave에서 show databases;했을 때

master에 test라는 데이터베이스를 추가하고 확인

slave에 따로 추가하지 않아도 생성된 것을 확인할 수 있다.


설정이 잘못됐을 때

  1. 슬레이브 중지

    STOP SLAVE;
    RESET SLAVE;

  2. 데이터 백업 및 복구

미러 사이트 구성하기

HAProxy DB1(Mater, Slave, Active), DB2(Slave, Master, Active)

SLAVE

  1. 위의 실습에서 SLAVE로 설정했던 서버에도 MASTER 값을 추가

    vi /etc/my.cnf.d/mariadb-server.cnf

log-basename을 기존 MASTER에서 지정한 이름과 다르게 설정해야한다.

  1. MASTER 설정

    mariadb -u root -p

CREATE USER 'slave_user'@'%' IDENTIFIED BY 'qwer1234';
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%';
FLUSH PRIVILEGES;

master로 등록된 정보 확인

MASTER

  1. 위의 실습에서 master로 설정했던 서버에 slave 설정을 추가
    /etc/my.cnf.d/mariadb-server.cnf은 따로 변경할 필요 없으므로 mariadb -u root -p를 통해 바로 mariadb로 들어간다.

    CHANGE MASTER TO
    MASTER_HOST='[Master 서버 IP]',
    MASTER_USER='slave_user',
    MASTER_PASSWORD='qwer1234',
    MASTER_PORT=3306,
    MASTER_LOG_FILE='[마스터에서 show master status 했을 때 File 이름]',
    MASTER_LOG_POS=[마스터에서 show master status 했을 때 position 번호],
    MASTER_CONNECT_RETRY=10;
    START SLAVE;

Master 서버에서 기존 SLAVE였던 서버를 master로 지정

slave확인했을 때 앞서 master 값을 추가한 서버(기존의 slave)가 master가 된 것을 확인할 수 있다.

기존 slave였던 서버에 test1 데이터베이스를 추가 후 확인

기존 master였던 서버이자 이번에 slave가 된 db에도 test1이 추가된 걸 확인할 수 있다.

핫 사이트 구성하기

keepalived DB1(Master, Active), DB2(Slave, Standby)

  • 한 대의 컴퓨터는 여러 개의 IP를 사용 할 수 있음을 이용
  • DB서버가 되는 컴퓨터에 가상의 IP를 만들어, 한쪽이 다운되면 다른 쪽의 가상 IP로 보내는 실습 (VRRP)
  • 두 DB 서버의 가상IP는 똑같이 설정

Master

  1. keepalived 설치

    apt install -y keepalived

  2. keepalived 설정파일 생성

    vi /etc/keepalived/keepalived.conf

    global_defs {
    	router_id node01 #router_id는 서로 다르게
    	enable_script_security
    	script_user root
    }
    vrrp_script track_mariadb {
    	script "systemctl is-active mariadb"
    	interval 5
    	fall 4
    	rise 2
    }
    vrrp_instance VRRP1 {
    	state MASTER
    	interface ens33
    	virtual_router_id 101
    	priority 200 # master 서버의 우선순위가 standby 서버의 우선순위보다 높아야한다.
    	advert_int 1
    	virtual_ipaddress {
        	10.10.10.200/24
    	}
    	track_script {
        	track_mariadb 
    	}
    }

설정을 바꾼 후 keepalived와 mariadb를 재시작하면 가상의 ip가 생긴 걸 확인할 수 있다.

Standby

  1. keepalived 설치

    apt install -y keepalived

  2. keepalived 설정파일 생성

    vi /etc/keepalived/keepalived.conf

    global_defs {
    	router_id node02 #router_id는 서로 다르게
    	enable_script_security
    	script_user root
    }
    vrrp_script track_mariadb {
    	script "systemctl is-active mariadb"
    	interval 5
    	fall 4
    	rise 2
    }
    vrrp_instance VRRP1 {
    	state BACKUP
    	interface ens33
    	virtual_router_id 101
    	priority 100
    	advert_int 1
    	virtual_ipaddress {
        	10.10.10.200/24
    	}
    	track_script {
        	track_mariadb 
    	}
    }

master 서버에서 mariadb가 실행되고 있으므로 standby 서버에는 가상 ip가 나오지 않는다.

master 서버의 mariadb를 끄고 잠시 기다렸다가 다시 ip를 확인하면 standby 서버로 가상의 ip가 옮겨간 것을 확인할 수 있다.

MySQL Workbench에서도 확인 가능

3계층 아키텍처 + 다중화

목표
다음과 같은 서버를 구상하는 것

앞에까지의 실습은 haproxy와 mariaDB를 연결하는 것이어으므로 이번에는 nginx 1개와 tomcat서버 2개를 만들어 연결

nginx

  1. 설치

    apt update
    apt install -y nginx

  2. 설정

    vi /etc/nginx/sites-enabled/default

    upstream tomcat_backend {
        server 10.10.10.20:8080; #tomcat 서버의 ip를 적어준다.
        server 10.10.10.30:8080;
    }
    server {
        listen 80 default_server;
        listen [::]:80 default_server;
    
    	root /var/www/html;
    
    	index index.html index.htm index.nginx-debian.html;
    	server_name _;
    	location / {
                try_files $uri $uri/ =404;
        }
    	location /api {
    		rewrite ^/api(/.*)$ $1 break;
        	proxy_pass http://tomcat_backend;  # 업스트림 그룹으로 프록시
        	proxy_set_header Host $host;
        	proxy_set_header X-Real-IP $remote_addr;
        	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        	proxy_set_header X-Forwarded-Proto $scheme;
        }
    }

tomcat

  1. 자바 설치

    apt update
    apt install -y openjdk-17-jdk

  2. 톰캣 다운로드

    wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.33/bin/apache-tomcat-10.1.33.tar.gz

  3. 톰캣 압축 해제

    tar zxvf apache-tomcat-10.1.33.tar.gz

  4. 폴더 이동

    mv apache-tomcat-10.1.33 /usr/local/tomcat10

  5. JSP 코드 파일 생성

    rm -rf /usr/local/tomcat10/webapps/ROOT/*

    vi /usr/local/tomcat10/webapps/ROOT/db.jsp

    <%@ page import="java.sql.*" %>
     <%
    	String dbURL = "jdbc:mariadb://10.10.10.11:3306/web";
    	String dbUser = "sjb";
    	String dbPassword = "qwer1234";
    	Connection conn = null;
    	try {
        	Class.forName("org.mariadb.jdbc.Driver");
        	conn = DriverManager.getConnection(dbURL, dbUser, dbPassword);
        	System.out.println("DB success!");
    	} catch (Exception e) {
        	e.printStackTrace();
        	response.setContentType("text/html;charset=UTF-8");
            out.println("DB failed!");
    	}
     %>
  1. 라이브러리 다운

    cd /usr/local/tomcat10/lib
    wget http://192.0.0.100:10000/mariadb%2djava%2dclient%2d3.3.3.jar

  2. 톰캣 실행

    /usr/local/tomcat10/bin/shutdown.sh

    만약 톰캣이 실행되고 있으면 꺼주기

    /usr/local/tomcat10/bin/startup.sh

    톰캣은 apt 명령어로 다운받은 프로그램이 아니므로 systemctl이 아닌 startup.sh파일을 통해 실행할 수 있다.

  3. 톰캣 실행 확인

    ps -ef | grep /usr/bin/java

    netstat -anlp | grep :8080

    netstat은 net-tools를 설치해야 사용 가능

haproxy

mariadb

web 이름의 DB 생성

테이블 생성
-- 사용자 테이블

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL
);

-- 게시판 테이블

CREATE TABLE posts (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(100) NOT NULL,
    content TEXT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    user_id INT,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

0개의 댓글