3계층 아키텍처와 분산 서버에서 세션을 관리하는 법,

rekv·2024년 12월 4일

BEYOND SW CAMP

목록 보기
13/30
일수일자교과목내용편성시간
1124/12/04기반기술Database8

3계층 아키텍처

(어제의 실습에 이어서)

nginx

html 파일 다운 및 압축 해제

cd/var/www/html
rm -rf ./*
wget http://192.0.0.100:10000/1.doc/03.%20%eb%8d%b0%ec%9d%b4%ed%84%b0%eb%b2%a0%ec%9d%b4%ec%8a%a4/html.tar.gz
tar zxvf html.tar.gz

tomcat

  1. 톰캣 실행 이후
  2. jsp 파일 다운 및 압축 해제

cd /usr/local/tomcat10/webapps/ROOT
wget http://192.0.0.100:10000/1.doc/03.%20%eb%8d%b0%ec%9d%b4%ed%84%b0%eb%b2%a0%ec%9d%b4%ec%8a%a4/jsp.tar.gz
tar zxvf jsp.tar.gz

mariadb

khj 유저에게 web 데이터베이스로 접속할 수 있는 권한 주기

mariadb -u root -p

GRANT ALL PRIVILEGES ON web.* TO 'khj'@'%';
FLUSH PRIVILEGES;

systsemctl restart mariadb # 설정이 끝나면 프로그램 재시작 잊지 않기

아직 tomcat이 두 대일 때 분산을 어떻게 시키는지는 배우지 않았으므로 톰캣 하나의 주소는 주석 처리

오류

실습 중 위와 같이 계정에 권한을 줬음에도 해당 database에 접속할 수 없다는 오류가 떴다.
이때 mariadb 서버로 가서 khj유저로 접속해 데이터베이스를 확인해보면

하나는 web database가 제대로 등록이 되어있지만

다른 하나는 web 등록이 안 된 걸 볼 수 있다.

그래서 SHOW SLAVE STATUS\G 명령어를 통해 SLAVE 설정을 확인해보니 Slave_IO_Running과 Slave_SQL_Running이 깨진 걸 확인할 수 있었다.

어제의 실습에서 데이터 백업 후 복구하는 방법을 배웠으므로 이를 이용해서 DB를 백업한 뒤 SLAVE STOP으로 SLAVE를 끄고 재설정해주었다.

다시 정상적으로 연결된 걸 확인한 후 HaProxy IP로 접속하니까 정상적으로 연결이 되었다.
아무래도 실습하는 도중에 계속 가상 머신이 다운되어서 설정값이 바뀌는 등으로 연결이 끊어진듯하다.

결과

HaProxy IP를 통해 사이트에 접속했을 때 메인 화면

가입 후 로그인을 하고 게시글을 작성하면 다음과 같이 게시판을 볼 수 있다.

MySQL Workbench에서도 데이터가 추가된 걸 확인할 수 있다.

다중 서버 환경에서 Session 저장과 관리

(추후 내용 추가)
스티키 세션

  • 갔던 곳으로 또 가게 한다.

세션 클러스터링

  • 서버들끼리
  • 메모리 낭비가 심하다

DB에 저장

  • tomcat은 메모리 저장, db는 파일(하드디스크)에 저장
  • 속도가 느리다

Redis에 저장

클라이언트한테 토큰을 저장하게 하고 서버는 토큰을 확인

nginx의 파일 수정

ip_hash; # 갔던 서버로만 가게 됨 (스티키 세션)

HTTP

스테이트풀
스테이스리스

실습할 때 nginx 서버에서 설정한 html 파일을 보면 다음과 같이 upstream을 통해 tomcat과 연결된 것을 확인할 수 있다.

tomcat이 설치된 서버에서도 jsp 파일을 통해 mariadb와의 연결을 확인할 수 있다.

haproxy를 통해서 tomcat이 mariadb와 통신

실습 내용을 정리하면 위의 그림과 같다.

실습 2

이번에는 위와 같은 서버로 만들어보자
(추후 추가)

DB 클러스터 구성

  • 서버는 홀수로 세팅

실습

DB 설치 및 초기 설정 (3대 모두 똑같이)

  1. 설치

    apt update
    apt install -y mariadb-server

  2. mariadb 바인드 주소 설정

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

    27번 라인에 있는 설정을 다음처럼 변경

    bind-address            = 0.0.0.0
  3. mariadb 실행

    systemctl restart mariadb

  4. mariadb 실행 확인

    systemctl status mariadb
    apt install -y net-tools
    netstat -anlp | grep :3306

  5. DB 서버 초기화

    mysql_secure_installation
    엔터
    엔터
    엔터
    qwer1234
    qwer1234
    엔터
    엔터
    엔터
    엔터

클러스터 설정

  1. 서버 중지

    systemctl stop mariadb

  2. 설정 추가(3대 중 1대만 먼저 설정)

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

    마지막 줄에 다음 내용 추가

    [galera]
    wsrep_on=ON
    wsrep_provider=/usr/lib/galera/libgalera_smm.so
    wsrep_cluster_address="gcomm://"
    binlog_format=row
    default_storage_engine=InnoDB
    innodb_autoinc_lock_mode=2
    bind-address=0.0.0.0
    wsrep_cluster_name="MariaDB_Cluster"	# 3대의 컴퓨터를 묶었을 때 내가 지어줄 이름
    wsrep_node_address="10.10.10.101"	# 현재 컴퓨터의 IP 주소
    systemctl restart mariadb
> systemctl restart mariadb
  1. 클러스터 구성 실행(3대 중 1대만 설정)

    galera_new_cluster

  2. 나머지 서버 설정

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

    마지막 줄에 다음 내용 추가

    [galera]
    wsrep_on=ON
    wsrep_provider=/usr/lib/galera/libgalera_smm.so
    wsrep_cluster_address="gcomm://10.10.10.101,10.10.10.102,10.10.10.103"
    binlog_format=row
    default_storage_engine=InnoDB
    innodb_autoinc_lock_mode=2
    bind-address=0.0.0.0
    wsrep_cluster_name="MariaDB_Cluster"	# 3대의 컴퓨터를 묶었을 때 내가 지어줄 이름
    wsrep_node_address="10.10.10.102"	# 현재 컴퓨터의 IP 주소
> systemctl restart mariadb
  1. 설정 변경(3번의 클러스터 구성을 등록했던 컴퓨터 수정)

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

    wsrep_cluster_address="gcomm://10.10.10.101,10.10.10.102,10.10.10.103"
> systemctl restart mariadb
  1. 최종 확인

    mariadb -u root -p

    show status like 'wsrep_cluster_status'; # 모든 노드에서 Primary
     show status like 'wsrep_cluster_size'; #모든 노드에서 클러스터의 총 노드 수(3)
    show status like 'wsrep_local_state_comment'; #모든 노드에서 Synced

추가 확인

3대 중 아무곳에서 DB 생성

방금 추가한 database를 다른 곳에서도 전부 확인 가능

3대 중 아무 서버 1대 중지

나머지 2대 중 1대에서 db 생성

중지한 서버 다시 실행 후 database 확인

+)

telnet [ip주소][포트번호]

리눅스에서 위의 명령어를 이용해 접속하려는 서버의 포트가 열려있는지 확인할 수 있다.
ping으로는 포트가 열렸는지는 확인할 수 없으므로

0개의 댓글