DB/WAS_Detachment

장준영·2024년 5월 3일

개요

기존의 코인은 T3a.small에 Database와 WebApplicationServer를 동시에 두고 있다.
이러한 방식은 서버비를 줄일 수 있다는 장점이 존재하며, 서버내의 통신으로 데이터 교환이 빠를수도 있다는 장점또한 있기는 하지만 서버의 활용성이 준다는 단점이 있다.

또한 현재 서버의 용량이 거의 다 사용했기에 아키텍쳐의 변화를 줄 필요가 있다고 생각한다.

WAS와 DB서버를 언제 분리해야 할까?

DB서버를 분리하는 가장 큰 이유는 WAS에서 처리할 부분이 DB서버에 비해 상대적으로 많은경우 분리하여 사용하게 된다.
메모리에 대한 의존도만 생각해보더라도 WAS보다는 데이터베이스가 월등히 높다. WAS와 달리 Database는 다른 하드웨어보다 메모리에 영향을 많이 받기 때문이다. 즉 성능을 높이기 위한 기술적인 방법이 각기 다르게 적용되어야 하는데, 하나의 단일 서버 구현은 한계가 있으므로 분리하는 방법이 필요하다.

DB서버 분리시 장점

  1. 확장성 -> 여러대의 db나 web서버를 둘 수 있다.
  2. 보안성 -> 만약 서버의 부하가 많이받아 서버가 행이 걸릴 경우 DB의 정합성이 깨지게 된다.
  3. 백업->로드밸런싱에 이점을 둘 수 있다.CloudWatch+AutoScaling 의 인프라 구축 가능
  4. 완전한 무중단 배포가 가능해진다. Koin_Renewal_Deploy

KOIN의 운영관점에서 서버를 분리해야 하는 이유

도커대신 사용중인 AMI의 경우 snapshot을 찍을때 무중단 snapshot의 경우 무결성을 보장할수 없는데, 이는 운용중인 DB의 변화가 있을때 운용에 복잡함이 존재한다.
(t2->t3a로 마이그레이션 당시 회원가입을 하는 사람이 있었다면 무결성 문제 발생, 프로덕션 배포시, db문제로 인한 완전한 무중단 배포 불가능)
최근 PL의 글을 봐도 코인의 고도화가 목적인것 같은데 분리하는 것이 좋을 것 같다.
서버의 안정적인 배포(Blue/Green 배포등), 확장성을 위해 서버를 분리하는 것이 좋다고 생각한다.(ELB의 결정적인 역할을 수행하고 있지 못함.)
당장은 RDS를 이용한 비용이 나갈수도 있지만 적절한 트래픽을 찾아 스케일링을 한다면 비용의 최적점을 찾아나갈수 있다고 생각한다.

일단 RDS 서버를(db.t4g.micro) 예약 인스턴스로

  • 1년 선결제 했을 경우 연간 162$
  • 1년 비선결제 했을 경우 월간 14.45$(연간 173.4달러)
    의 비용이 나간다.

RDS가 아닌 ec2onDB로 설정해도 무방하다.
하지만 이렇게 구성을 할경우 DB관리를 한명의 담당자가 해야한다는 불편함이 있다.(물론 튜닝 할 부분이 있다면 나쁘지 않다고 생각한다.)

ec2서버를(t3.micro) 예약 인스턴스로

  • 1년 선결제 했을 경우 : 연간 71$

  • 1년 비선결제 했을 경우 : 연간74.16$

위와 같이 비용이 나간다.

트랙장(최준호BE)과의 협의를 한 결과 Ec2에 Docker를 이용하여 Mysql을 적용하기로 하였다. SavingPlans를 활용하여 1년 선결제를 진행할 경우 71$의 비용이 나간다.

비용은 여기 RDS비용 EC2비용을 참고하자.

WAS/DB의 분리 시나리오

기본적으로 신버전의 데이터베이스를 생성 및 이관후 구버전의 데이터베이스를 삭제하는 Blue/Green배포를 진행하였다.

코인 마이그레이션을 진행하면서 기존Spring3가 참조하는 데이터베이스는 5.7버전을 활용하고 있지만 새로운 springBoot의 flyway는 활용이 불가하여 두가지 버젼의 데이터베이스를 활용할 필요가 생겼다. 여러가지의 고민을 하다, 도커를 활용하여 두가지 버전의 Mysql을 띄우게 되었다.
DBUpgrade, Dockerize
두가지 문서를 참고하자!!

1. 새로운 EC2생성(t3a.small로 설정), saving plans 설정

2. Docker설치

sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

Docker의 공식 GPG키를 추가

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Docker의 공식 apt저장소를 추가

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

시스템 패키지 업데이트

sudo apt-get update

Docker 설치

sudo apt-get install docker-ce docker-ce-cli containerd.io

만약 Permission에러 발생시(sudo만 작동할때)

sudo usermod -aG docker $USER

후 터미널 나갔다오기.

3. Mysql설치

Docker를 이용해서 mysql 이미지 다운로드

docker pull mysql:5.7.31

->현재 코인의 버젼이 5.7.31.이기에 버전을 지정해줌

Mysql Docker 컨테이너 생성 및 실행

docker run --name mysql-현재서버별칭-container -e MYSQL_ROOT_PASSWORD=<password> -d -p 지정포트번호:3306 mysql:5.7.31

Docker bash 접속

docker exec -it mysql-서버버젼-container bash

mysql 접속

mysql -u root -p

->아까 설정했던 비밀번호로 접속

koin 데이터베이스 생성

create database koin;

koin 사용자 생성

create user 'koin'@'%' identified by 'Confidential에 있는 비번';

DB제어 권한 부여

grant all on koin.*to 'koin'@'%' with grant option;

변경사항 반영

flush privileges;

컨테이너 재시작

docker restart mysql-버젼-container

exit을 하여 mysql, bash나오기

4. Stage,Internal,Production순서로 DUMP파일을 이용하여 Migration진행

DUMP파일 따기(기존의 서버에 접속)

mysqldump -u koin -p koin > /home/ubuntu/백업파일이름.sql

dump파일을 DB서버에 이관시키기(mobaxterm기준 드래그&드랍)

mysql docker안으로 Dump파일 복사

docker cp PC의 파일경로(디폴트/home/ubuntu) mysql-서버버젼-container:/tmp

Docker안으로 sh접속

docker exec -it mysql-서버버전-container sh

Mysql 안으로 DataImport실행

mysql - koin -p koin </tmp/백업파일이름.sql

-> 문제는 KOIN의 DB Dump파일이 너무 커서 메모리 부족으로 에러가 나타난다.
그럴 경우는 DBMigrationGuide 를 참조하면 된다.

mysql포트 인바운드 설정(aws보안그룹)

위와같이 인바운드 포트를 개방해준다.

5. 기존 파일들의 application.properties, flyway.properties 경로 수정

위와 같은 경우 ip,port,user,pw등을 고려해봐야 한다.

build서버의 /var/lib/jenkins/deploy에서 수정이 가능하다.
수정후에 jenkins를 이용한 빌드를 진행하자.

6. 기존의 Koin Database 삭제

sudo apt-get remove --purge mysql*

7. 안정화된 DB서버 EC2OnDB로 비용절감

이용중인 t3a.micro에 대한 1년 예약 인스턴스 적용으로 비용 절감을 하였다.

8. DB백업&복원
DB_BackUp

후기

그동안의 배포의 유연함을 위해 DB분리를 원했는데, 드디어 분리가 되어 기쁘다.

출처:
단일서버와 데이터베이스 분리
RDS vs EC2OnDB
스프링-EC2OnDB
Ubuntu Docker설치
Ubuntu Docker적용
Docker를 이용한 Mysql설치
Docker를 이용한 Mysql 백업&복원
kubernetes를 활용한 백업
docker에서의 sql dump적용
Docker안에서 Dump import
DB메모리 대역 설정
apt not found 해결방안
우분투 mysql완전삭제

0개의 댓글