본문 바로가기

Database

(5)
Redis Session 병목 해결 및 최적화하기 https://liasn.tistory.com/7 nGrinder로 성능 테스트 과정에서 발견한 Redis Session 병목 애플리케이션 서버를 개발하고 '나의 서버는 어느 정도의 트래픽을 처리할 수 있을까?'라는 고민을 할 수 있습니다. 하지만 여러 개의 브라우저를 띄워 동시에 요청을 보내는 방법은 한계가 있 liasn.tistory.com 이전 글에서 'TPS 수치가 0이 되는 시점에 CPU 사용량의 대부분을 차지하는 스레드가 모두 위의 스택 정보를 가진다면 병목 현상은 WAS에서 Redis Session을 만료 처리하는 과정에서 발생한다.'라는 가설을 세웠는데 이번 글에서는 가설 입증을 위해 병목이 왜 발생했고, 해결 방법은 무엇이고, 해결하면 병목이 사라지는지를 확인해 보도록 하겠습니다. 발생 ..
MySQL 실행 계획 분석으로 성능 개선한 이야기 MySQL을 DB로 사용하여 개발할 때 내가 작성한 쿼리가 실제 어떻게 수행이 되고 성능은 어느 정도인지 확인이 필요할 때가 있습니다. 성능이 느리다면 쿼리를 개선하거나 구조를 다시 짜는 리팩터링을 통해 성능을 끌어올릴 수도 있구요. 제가 프로젝트를 진행하면서 만든 쿼리의 실행 계획을 분석하고 성능 개선을 한 사례를 말씀드리겠습니다. 간단한 사례 제가 진행한 프로젝트에는 캠핑용품 유형 데이터가 존재합니다. 캠핑용품 유형이란? 캠핑용품에는 텐트, 코펠, 버너, 테이블, 의자와 같이 여러 가지 유형이 존재하는 데 그 유형을 나타내는 데이터입니다. 그래서 실제 테이블은 id와 name 칼럼으로 구성되어 있고 id를 통해 유형 데이터의 유일함을 표현할 수 있도록 Primary Key 제약 조건을 걸고 사용 중이..
로컬 캐싱에서 글로벌 캐싱으로 변경한 이유 애플리케이션 서버의 조회 성능을 끌어올리기 위한 방법 중 캐싱이 있습니다. 제가 스프링 기반 프로젝트를 진행하면서 왜 로컬 캐싱을 적용했고 글로벌 캐싱으로 변경했는지 알아보겠습니다. 캐싱이란? 캐싱은 어떤 요청에 대한 결과를 임시적으로 저장하는 행위를 말합니다. 예를 들어, A라는 매개 변수로 메소드를 호출했을 때 그 결과를 임의의 공간에 임시 저장하고 똑같은 A라는 매개 변수로 메소드 호출이 들어왔을 때 실제 작업이 수행되지 않고 임시 저장 중인 결과를 반환하는 형태입니다. 주목적은 성능 향상과 동시에 부하 방지라고 말씀드릴 수 있습니다. 나의 프로젝트에 캐싱이 필요한 이유는? 저의 프로젝트에는 캠핑용품 유형 데이터가 존재합니다. 유형에는 텐트, 의자, 코펠, 버너와 같은 여러 가지가 될 수 있는데요...
나는 왜 MySQL Replication을 적용했을까? 많은 트래픽이 흐르는 상황에서 서버의 성능을 올리기 위해 애플리케이션 서버를 늘리는 방법을 선택할 수 있습니다. 하지만 서비스를 운영하기 위해선 애플리케이션 서버뿐만 아니라 데이터를 저장하는 역할인 DB 서버 또한 필요로 합니다. 애플리케이션 서버의 부하는 위와 같은 방법으로 해소가 가능하지만 DB 서버는 어떨까요? 실제로 DB 서버는 데이터를 Disk에 직접 쓰고, 읽는 I/O 작업이 일어나기 때문에 애플리케이션 서버보다 훨씬 큰 병목 지점이 될 수 있습니다. 애플리케이션 서버를 아무리 늘려도 데이터에 직접 액세스 하는 부분에서 똑같이 병목이 발생하면 서비스 전체의 병목은 그대로이기 때문에 DB 서버도 부하를 분산하여 큰 트래픽에 대응하는 것이 좋습니다. MySQL Replication MySQL은 R..
Scale out 확장 구조에서 Session 불일치 문제와 해결 방법 저번 글에서 서버의 확장은 어떤 것들이 있는지 알아봤습니다. 서버의 확장? Scale up과 Scale out이란? 웹 서버 애플리케이션을 개발하고 운영하다 보면 여러 가지 상황을 마주하게 됩니다. 그중 하나는 서버의 처리 능력보다 많은 양의 트래픽이 들어오는 상황 서버를 배포하고 운영 중인데 서버 liasn.tistory.com Scale out 확장을 선택하면 데이터 정합성 문제를 반드시 해결해야 합니다. 그렇다면 실제 프로젝트에선 어떤 식으로 발생할까요? 저의 웹 서버 애플리케이션은 로그인에 대한 인증 기능을 세션 기반으로 구현했습니다. 이때, Scale out을 통해 여러 대의 서버로 요청을 처리하도록 분산 서버 환경을 만들면 각 서버 별로 로그인 세션 정보가 다른 세션 불일치 문제가 발생합니다...