CS/DB

[DB] 3계층 아키텍처 - 다중화 실습 (2)

셰욘 2024. 12. 4. 15:09
728x90

이번엔 아래 그림과 같은 아키텍처를 구성해보자 !

 

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를 해결하기 위해 클러스터로 구성할 수 있다,.

 

728x90