웹의 기본 아키텍처
MySQL 맛보기 (1)
- 클라이언트
- 웹서버
- HTML,CSS,JavaScript 같은 정적인 데이터를 처리
- 웹 어플리케이션 서버
- 데이터 베이스에 저장되어있는 데이터처럼 동적으로 변하는 데이터들을 처리
- 데이터베이스
왜 데이터베이스가 병목일까?
스케일 아웃 & 스케일 업
|
스케일업 |
스케일 아웃 |
특징 |
서버 사양을 업그레이드 |
서버의 갯수를 늘림 -> 분산 |
유지보수 및 관리 |
쉬움 |
여러 노드에 적절히 부하분산 필요 |
확장성 |
제약이 있음 |
스케일업에 비해 자유로움 |
장애복구 |
서버가 1대, 다운타임이 있음 |
장애 탄력성이 있음 |
- 같은 입력에 대해서는 항상 같은 결과를 반환
- 이를 위해 서버가 여러개여도 하나의 데이터 베이스를 바라보게 만들어야함
- 데이터 베이스는 서버에 비해서 데이터라는 상태를 관리하고 있어 서버보다 스케일 아웃 비용이 훨씬 많이 듦
- 현대 서버 아키텍처는 상태관리를 데이터베이스에 위임하고, 서버는 상태관리를 하지 않는 방향으로 발전
- 또한 스케일 아웃 외에도 데이터베이스는 디스크의 접근해서 가져오기 때문에 메모리에 있는 데이터를 사용해 응답을 처리하는 서버보다 느림
- 서버와 데이터 베이스는 네트워크로 연결되어 있기 때문에 네트워크 상황에 따라서도 속도가 달라짐
대용량 시스템이 어려운 이유
- 하나의 서버로 감당하기 힘들어 대부분 여러개의 서버 또는 데이터베이스를 사용함
- 여러개의 서버에서 유입되는 데이터의 일관성을 보장할 수 있어야함
- 코드 한 줄이 데이터에 미치는 영향범위가 굉장히 큼
- 여러 서비스들이 얽혀있어, 시스템 복잡도가 상당히 높음
MySQL
- 데이터 베이스는 결국 서버다.
- 클라이언트는 json을 통해 서버에게 데이터를 달라고 요청하는 것과 같이
- 서버는 MySQL에 데이터를 요청한다
- 전달 받은 요청을 위와 같은 순서로 데이터를 탐색하고 돌려줌
- MySQL 엔진은 두뇌
- 엔진 안에서는 다음과 같은 로직으로 처리된다.
- 쿼리파서 -> 전처리기 -> 옵티마이저 -> 쿼리 실행기
- 쿼리파서
- SQL을 파싱하여 Syntax Tree 을 만듬
- 이 과정에서 문법 오류 검사가 이루어짐
- 전처리기
- 쿼리파서에서 만든 Tree를 바탕으로 전처리 시작
- 테이블이나 컬럼 존재 여부, 접근권한 등 Semantic 오류 검사
- 쿼리파서, 전처리기는 컴파일 과정과 매우 유사하다.
- 하지만 SQL은 프로그래밍 언어처럼 컴파일 타임때 검증 할 수 없어 매번 구문 평가를 진행
- 서버쪽에서 동적으로 SQL 요청문이 와서 검증이 안됨
- 옵티마이저
- 쿼리를 처리하기 위한 여러 방법들을 만들고, 각 방법들의 비용정보와 테이블의 통계정보를 이용해 비용을 산정
- 테이블 순서, 불필요한 조건 제거, 통계정보를 바탕으로 전략을 결정 (실행 계획 수립)
- 옵티마이저가 어떤 전략을 결정하느냐에 따라 성능이 많이 달라진다.
- 가끔씩 성능이 나쁜 판단을 해 개발자가 힌트를 사용해 도움을 줄 수 있다.
- 쿼리실행기
- 옵티마이저가 결정한걸 쿼리실행기가 역할을 가져감
- 이 때 Handler API를 사용해 스토리 엔진에 요청함
- 이를 핸들러 요청이라고 함
- 스토리지 엔진은 판단을 수행 동작
- 디스크에서 데이터를 가져오거나 저장하는 역할
- MySQL 스토리 엔진은 플러그인 형태로 Handler API만 맞춘다면 직접 구현해서 사용할 수 있다.
- InnoDB, Mylsam 등 여러개의 스토리 엔진이 존재
- 8.0 대 부터는 InnoDB 엔진을 디폴트로 사용
- MySQL에는 소프트 파싱이 없다.
- 하지만 5 버전까지는 쿼리캐시가 있었다.
- 쿼리캐시는 SQL에 해당하는 데이터를 저장하는 것
- 쿼리캐시는 데이터를 캐시하기 때문에 테이블의 데이터가 변경 되면 캐시의 데이터도 함께 갱신시켜줘야함
- Oracle 에는 소프트 파싱이 존재
- 실행계획까지만 캐싱
- 하지만 모든 SQL과 맵핑해 데이터까지 캐싱하지는 않음
(힌트나 설정으로 가능하긴 함)
- MySQL의 쿼리캐시, Oracle의 소프트 파싱 모두 성능 최적화를 위해 캐시라는 기술을 도입한 사례
- 그러나 캐시의 범위가 다르다.
- 캐시를 도입할 때는 항상 만료정책을 고려해야한다.
- 쿼리캐시는 소프트 파싱에 비해 조회성능은 더 높지만 캐시 데이터 관리에 더 높은 비용이 들어감
정규화 / 비정규화
- 중복을 최소화해 데이터를 구조화하는 프로세스를 정규화라고 한다.
- 테이블 설계관점에서 조회와 쓰기를 다르게 봐야한다.
정규화 |
반정규화(비) |
중복을 제거하고 한 곳에서 관리 |
중복을 허용 |
데이터 정합성 유지가 쉬움 |
데이터 정합성 유지가 어려움 |
읽기시 참조 발생 |
참조없이 읽기 가능 |
참고
최대 1 분 소요
재귀 문제
2 분 소요
탐욕법 Greedy 문제
최대 1 분 소요
둘만의 암호 문제
최대 1 분 소요
해시 문제
댓글남기기