Mirro Sit(미러 사이트)
주 센터와 동일한 수준의 데이터와 시스템을 원격지에 구축하고 Active 상태로 실시간 동시 서비스를 제공하는 방식
Hot Sit (핫 사이트)
주 센터와 동일한 수준의 데이터와 시스템을 원격지에 구축하여 Stand-by 상태로 유지하며 재난 발생시 Active 상태로 전환하여 서비스 제공
Warm Site (웜 사이트)
데이터만 원격지에 보관하고 서비스를 위한 시스템은 확보하지 않거나 최소한으로만 구성하고 재난 발생시에 필요한 시스템을 구성하여 복구
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
mysql -u root -p < backup.sql
DB 서버 replication 설정(Master, Slave)
vi /etc/mysql/mariadb.conf.d/50-server.cnf
[mariadb] <- 이거는 추가하는거 아님 (109번 라인에 있음)
log-bin
server_id=1 #마스터와 슬레이브의 숫자가 달라야함
log-basename=master1
binlog-format=mixed

master 확인
mysql
show master status;

CREATE USER 'slave_user'@'%' IDENTIFIED BY 'qwer1234';
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%';
FLUSH PRIVILEGES;
vi /etc/my.cnf.d/mariadb-server.cnf
[mariadb] <- 이거는 추가하는거 아님
server_id=2
systemctl restart mariadb

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; 했을 때 나온 File과 Posion의 값을 Slave에 입력해주어야 한다.
Slave 확인
SHOW SLAVE STATUS\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes


master에서 show databaase;했을 때

slave에서 show databases;했을 때

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

slave에 따로 추가하지 않아도 생성된 것을 확인할 수 있다.
슬레이브 중지
STOP SLAVE;
RESET SLAVE;
데이터 백업 및 복구
HAProxy DB1(Mater, Slave, Active), DB2(Slave, Master, Active)
vi /etc/my.cnf.d/mariadb-server.cnf

log-basename을 기존 MASTER에서 지정한 이름과 다르게 설정해야한다.
mariadb -u root -p
CREATE USER 'slave_user'@'%' IDENTIFIED BY 'qwer1234';
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%';
FLUSH PRIVILEGES;

master로 등록된 정보 확인
/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)
keepalived 설치
apt install -y keepalived
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가 생긴 걸 확인할 수 있다.

keepalived 설치
apt install -y keepalived
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에서도 확인 가능
목표
다음과 같은 서버를 구상하는 것

앞에까지의 실습은 haproxy와 mariaDB를 연결하는 것이어으므로 이번에는 nginx 1개와 tomcat서버 2개를 만들어 연결
설치
apt update
apt install -y nginx
설정
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;
}
}
자바 설치
apt update
apt install -y openjdk-17-jdk
톰캣 다운로드
wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.33/bin/apache-tomcat-10.1.33.tar.gz
톰캣 압축 해제
tar zxvf apache-tomcat-10.1.33.tar.gz
폴더 이동
mv apache-tomcat-10.1.33 /usr/local/tomcat10
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!");
}
%>
라이브러리 다운
cd /usr/local/tomcat10/lib
wget http://192.0.0.100:10000/mariadb%2djava%2dclient%2d3.3.3.jar
톰캣 실행
/usr/local/tomcat10/bin/shutdown.sh
만약 톰캣이 실행되고 있으면 꺼주기
/usr/local/tomcat10/bin/startup.sh
톰캣은 apt 명령어로 다운받은 프로그램이 아니므로 systemctl이 아닌 startup.sh파일을 통해 실행할 수 있다.
톰캣 실행 확인
ps -ef | grep /usr/bin/java
netstat -anlp | grep :8080
netstat은 net-tools를 설치해야 사용 가능

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)
);