InnoDB의 기본 잠금 방식 InnoDB에서는 각 쿼리의 패턴별로 사용하는 잠금이 다르다. 먼저 기본적으로 각 쿼리가 어떤 잠금 방식을 사용하는지 알아보자. SELECT REPEATABLE-READ 이하의 트랜잭션 격리 수준에서 InnoDB 테이블에 대한 SELECT 쿼리는 기본적으로 아무런 잠금도 사용하지 않는다. 또한 이미 잠긴 레코드를 읽는 것도 아무런 제약이 없다. SELECT 쿼리로 읽은 레코드를 잠그는 방법은 읽기 모드와 쓰기 모드 잠금으로 두 가지가 있다. SELECT * FROM sample_tbl WHERE col1 = 10001 LOCK IN SHARE MODE; SELECT * FROM sample_tbl WHERE col1 = 10001 FOR UPDATE; LOCK IN SHAR..
사용자 정의 변수 소개 변수의 종류 MySQL의 변수는 누가 생성하는지에 따라 시스템 변수와 사용자 변수로 구분된다. 변수의 적용 범위가 MySQL 전체인지 아니면 커넥션 범위인지에 따라서 글로벌 변수와 세션 변수로 나뉘기도 한다. 또한 동적으로 서버의 중단 없이 변수를 변경할 수 있는지에 따라 동적 변수와 정적 변수로 구분되기도 한다. 사용자 정의 변수는 말그대로 사용자 변수이면서, 해당 커넥션에서만 유효한 세션 변수이고, 언제든지 값을 변경할 수 있기 때문에 동적 변수로 볼 수 있다. 사용자 정의 변수의 사용 하나의 커넥션에서 정의된 사용자 변수는 다른 커넥션과 공유되지 못하고 해당 커넥션에서만 사용할 수 있다. MySQL의 사용자 변수 이름은 @로 시작한다. 사용자 정의 변수에 할당할 수 있는 값의..
MySQL의 파티션 파티션이란 MySQL 서버의 입장에서는 데이터를 별도의 테이블로 분리해서 저장하지만 사용자 입장에서는 논리적인 하나의 테이블로 사용할 수 있게 하는 기능을 의미한다. 파티션을 사용하는 이유 하나의 테이블이 너무 커서 인덱스의 크기가 물리적인 메모리보다 훨씬 큰 경우 단일 INSERT나 SELECT를 빠르게 처리할 수 있다. 파티션을 나누면 인덱스도 각각 생성되기 때문에 작은 인덱스 크기로 인해 메모리에서 빠르게 쿼리 작업을 진행할 수 있다. 데이터 특성 상 주기적인 삭제 작업이 필요한 경우 효율적으로 관리할 수 있다. 로그 데이터가 대표적인 예시다. 파티션의 INSERT, UPDATE INSERT INSERT 되는 칼럼 중 파티션 키인 칼럼을 이용해 파티션 표현식을 평가하고, 해당 파..
Nginx 소개 Nginx는 널리 쓰이는 웹 서버 중 하나입니다. 동적 처리를 주로 담당하는 WAS(Web Application Server)와는 다르게 웹 서버(Web Server)는 정적 자원에 대한 응답을 내려주는 역할을 가지고 있는데요. Nginx는 정적 자원의 처리 외에도 proxy 서버의 역할이나, reverse proxy 서버의 역할 등 여러방면에서 높은 활용도를 보여줍니다. 여기서는 Nginx가 CodeDeploy Agent에 의해 두 WAS간의 스위칭 역할을 담당하도록 구성해 보겠습니다. Nginx 설치와 설정 먼저 Nginx를 설치하겠습니다. EC2에 ssh로 접속하여 다음 커맨드를 수행합니다. sudo yum install nginx 그럼 설치가 되는 듯 하였으나, 다음과 같이 Ama..
CodeDeploy 소개 전 시간에 이어 다음으로는 Github Actions 에서 CodeDeploy 에게 S3에 있는 jar 파일을 가져가서 담당한 배포 그룹의 EC2에 배포해 줘! 라는 명령을 내릴 수 있도록 구성해 보겠습니다. 먼저 CodeDeploy에 대해 간단하게 소개하자면, 애플리케이션 배포를 자동화하는 AWS 의 배포 서비스입니다. EC2, AWS Lambda 와 같은 서비스에 배포를 할 수 있고, 현재위치 배포나 블루/그린 배포와 같은 무중단 배포를 지원합니다. 한 번 구축해 놓으면 이후로는 배포가 매우 간편하고 AWS 콘솔을 통해 제어하면서 배포 과정을 확인할 수 있기 때문에 많은 분들이 이 서비스를 이용하여 배포 플로우를 구축합니다. 조금 더 자세한 설명은 CodeDeploy 레퍼런스..
개요 안녕하세요! 이번 시리즈에서는 제목에서와 같이 Github Actions 와 CodeDeploy, 그리고 Nginx 를 사용하여 하나의 서버에서 최소 규모의 무중단 배포를 진행하는 방법에 대해 정리해보려고 합니다. 관련 코드는 Github 저장소 에서 확인하실 수 있습니다. 전체 흐름도 CI/CD 와 같이 인프라, 배포 환경을 구축하기 위해서는 내가 만들고자 하는 전체 그림을 숙지하는 것이 가장 중요하다고 생각합니다. 그래야 진행삽질 중에 막혔을 때 어느 부분이 문제일지 빠르게 유추해 볼 수 있기 때문입니다. 이 그림이 지금부터 하나씩 만들어 볼 배포 플로우입니다. Github Actions에서 프로젝트 빌드 후, jar 파일을 압축해서 S3에 업로드합니다. 이어서 CodeDeploy에게 S3에 있..
트랜잭션 트랜잭션이란, 논리적인 작업 셋(Set)을 완벽하게 처리하거나 반대로 실패할 경우 원 상태로 전부 복구하는 기능이다. 그래서 작업의 일부만 적용되는 Partial Update 가 일어나지 않도록 한다. MySQL 에서의 트랜잭션 스토리지 엔진 중 MyISAM 이나 MEMORY 같은 스토리지 엔진은 트랜잭션을 지원하지 않는다. 트랜잭션이 없어서 사용하기 단순할 것 같지만, 오히려 더 많은 문제를 만들어낸다. 일부 과정이 실패했을 때 생기는 Partial Update 같은 문제는 더 복잡한 후속조치 과정을 양산할 뿐이다. InnoDB 스토리지 엔진은 트랜잭션을 지원하기 때문에 논리적인 작업들의 단위가 전부 반영되거나, 전부 반영되지 않는 것을 보장한다. 트랜잭션 적용 시 주의사항 트랜잭션은 트랜잭션..
CodeDeploy 배포 실패 error log 가 없는 경우 CodeDeploy 로 배포 플로우를 구축하다보면 배포가 실패하는 경우가 있습니다. 보통은 에러 로그를 확인하기 위해서 아래와 같이 View events 로 접근하여 확인합니다. 하지만 다음과 같이 아무런 에러 로그가 남지 않는 경우가 있습니다. instance 에서 확인하기 이럴 때는 보통 deploy 를 시작하기도 전에 실패한 경우라서, Agent log 를 확인해보면 됩니다. 해당 EC2 인스턴스의 다음 경로에서 에러 로그를 확인할 수 있습니다. /var/log/aws/codedeploy-agent/codedeploy-agent.log 제 경우는 다음과 같은 에러 로그가 있었는데요. InstanceAgent::Plugins::CodeDe..