이번엔 아래 그림과 같은 아키텍처를 구성해보자 !
HAProxy로 웹 서버를 부하분산 시키고
웹 서버(nginx) 2대, WAS 서버(톰캣) 2대, DB 서버(mariadb) 2대를 구성할 것이다.
여기서 DB는 핫 사이트(Master - Slave)를 구성해서 Master에서만 저장 및 수정이 될 수 있게 하고,
keepalived를 통해 Acitve와 Standby 상태로 만들 예정이다.
1. HAProxy
1) HAProxy 설정
설정 파일에서 부하 분산시킬 서버 IP 주소를 입력 후 저장해준다.
vi /etc/haproxy/haproxy.cfg
frontend webserver
bind *:80
mode http
default_backend nginx-server
backend nginx-server
mode http
balance roundrobin
option httpchk GET /
server nginx1 10.10.10.10:80 check
server nginx2 10.10.10.20:80 check
2) HAProxy 실행
그 다음에 haproxy를 실행시켜 준다.
systemctl restart haproxy
위에 webserver 바인드 주소를 80 번으로 했기 때문에
haproxy 서버에 nginx가 실행되고 있으면
systemctl stop nginx => 로 nginx 끈 상태에서 haproxy를 실행시켜야 한다.
2. nginx
1) nginx 설정 (톰캣 주소 연결)
nginx 설정 파일에서 WAS 서버(톰캣) 주소를 연결해줘야 한다.
vi /etc/nginx/sites-enabled/default
안에 내용을 다 지우고 아래 코드와 같이 내용을 바꿔줘야 한다.
업스트림에 톰캣 서버로 쓸 두 개의 컴퓨터 IP 주소를 넣어준다.
ip_hash?
스티키 세션
- 갔던 곳으로 또 가게 한다.
- 사용자 1은 서버 1만 사용, 사용자 2는 서버 2만 사용, 사용자 1은 서버 1만 사용,, 이렇게 클라이언트마다 사용할 서버를 지정해둬서 갔던 서버에 또 가게 하는 것
- 단점 : 한 서버는 놀고, 한 서버만 부하될 수 있음
- ip_hash 를 통해 설정한다.
upstream tomcat_backend {
ip_hash;
server 10.10.10.40:8080;
server 10.10.10.50: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;
}
}
2) nginx 실행
설정 해놨으면 nginx 재시작
systemctl restart nginx
3. tomcat
1) 톰캣 설정 (DB 서버 주소 연결)
db.jsp (DB와 연결하는 코드)에서 가상으로 설정할 IP 주소와 id, password 를 입력해준다.
vi /usr/local/tomcat10/webapps/ROOT/db.jsp
<%@ page import="java.sql.*" %>
<%
String dbURL = "jdbc:mariadb://[DB 서버 가상 IP 주소]:3306/web";
String dbUser = "[계정 ID]";
String dbPassword = "[계정 비밀번호]";
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!");
}
%>
2) 톰캣 실행
설정 후 톰캣 실행
/usr/local/tomcat10/bin/startup.sh
4. mariadb
1) keepalived 설정 (가상 IP 설정)
keepalived 설정 파일에서 가상으로 사용할 IP 주소를 설정해준다.
vi /etc/keepalived/keepalived.conf
global_defs {
router_id node01
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
advert_int 1
virtual_ipaddress {
[가상 IP 주소]/24
}
track_script {
track_mariadb
}
}
2) 마스터 DB 서버에 설정 추가
마스터로 사용힐 DB 서버에 설정을 추가한다.
vi /etc/mysql/mariadb.conf.d/50-server.cnf
[mariadb]
log-bin
server_id=1
log-basename=master1
binlog-format=mixed
3) 마스터 서버 mariadb 재시작
설정 후 재시작해준다.
systemctl restart mariadb
4) 마스터 서버에서 사용자 추가 및 권한 설정
slave에서 접속할 수 있는 사용자를 추가해준다.
mariadb -u root -p
CREATE USER 'slave_user'@'%' IDENTIFIED BY 'qwer1234';
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%';
FLUSH PRIVILEGES;
5) 슬레이브 서버에 설정 추가
슬레이브 서버에 server id 설정을 추가해준다.
vi /etc/mysql/mariadb.conf.d/50-server.cnf
6) 슬레이브 서버 mariadb 재시작
7) 슬레이브 서버에서 마스터 지정
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;
8) 슬레이브 서버에서 슬레이브 확인
SHOW SLAVE STATUS\G
잘 연결된 것을 확인할 수 있다
9) DB 생성 후 권한 설정 (마스터에서)
이후에 DB를 생성해주고, DB에 대한 권한을 설정해준다.
CREATE DATABASE web;
GRANT ALL PRIVILEGES ON web.* TO '[계정 ID]'@'%';
FLUSH PRIVILEGES;
10) 테이블 생성 (마스터에서)
테이블도 만들어준다.
use web;
-- 사용자 테이블
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)
);
이렇게 하면 모든 구성이 완료가 되고 실행이 잘 된다 !
SPOF
SPOF(Single Point of Failure) = 단일 실패 지점
: 서버 한 대가 뻗어서 전체가 못 쓰게 되는 경우
위의 경우처럼 DB 서버를 Replication 으로 설정하면 Master 서버가 다운됐을 때 Slave에서는 조회밖에 못 한다.
(Slave에서는 데이터를 수정, 삭제하면 안 되기 때문에!)
=> SPOF를 해결하기 위해 클러스터로 구성할 수 있다,.
'CS > DB' 카테고리의 다른 글
[DB] DB 클러스터 설정 (0) | 2024.12.04 |
---|---|
[DB] 3계층 아키텍처 - 다중화 실습 (1) (0) | 2024.12.03 |
[DB] DB 서버 핫 사이트 구성 실습 (Active - Standby) (0) | 2024.12.03 |
[DB] DB 서버 부하 분산 (HAProxy) (0) | 2024.12.03 |
[DB] 재해 복구(DR) / DB 서버 Replication 설정 / 미러 사이트 구성 실습 (0) | 2024.12.03 |