책/real mysql
mysql 아키텍처
ballde
2021. 12. 21. 17:48
mysql 서버는 크게 mysql 엔진과 스토리지 엔진으로 구분
mysql 엔진
- 클라이언트로부터 접속 및 쿼리 요청을 처리하는 커넥션 핸들러와 sql파서 및 전처리기, 쿼리의 최적화된 실행을 위한 옵티마이저가 중심
- sql 문장을 분석, 최적화
스토리지 엔진
- 디스크 스토리지에 저장하거나 디스크 스토리지로부터 데이터를 읽어오는 부분은 스토리지 엔진이 전담
- 쓰기 또는 읽기를 요청 → handler 요청 , 여기서 사용하는 api → handler api
mysql서버는 프로세스 기반이 아니라 스레드 기반
포그라운드 스레드
- 서버에 접속된 클라이언트 수 만큼 존재
백그라운드 스레드
innoDB
- 쓰기 작업은 지연 가능
- 읽기 작업은 지연 불가능!!
- 대부분 DBMS는 쓰기 작업을 버퍼링해서 일괄 처리하는 기능이 탑재돼 있음
쿼리 실행 구조
파서
- 파서는 사용자 요청으로 들어온 쿼리 문장을 토큰(MySQL이 인식할 수 있는 최소 단위의 어휘나 기호)으로 분리해 트리 형태의 구조로 만들어 내는 작업을 의미합니다.
- 쿼리 문장의 문법 오류는 이 과정에서 발견되어 사용자에게 오류 메시지를 전달하게 됩니다.
전처리기
- 파서 과정에서 만들어진 파서 트리를 기반으로 쿼리 문장에 구조적인 문제점이 있는지 확인합니다.
- 각 토큰을 테이블 이름이나 컬럼 이름 또는 내장 함수와 같은 개체를 매핑해 해당 객체의 존재 여부와 객체의 접근 권한 등을 확인하는 과정을 이 단계에서 수행합니다.
- 실제 존재하지 않거나 권한상 사용할 수 없는 개체의 토큰은 이 단계에서 걸러집니다.
옵티마이저
- 옵티마이저란 사용자의 요청으로 들어온 쿼리 문장을 저렴한 비용으로 가장 빠르게 처리할지 결정하는 역할을 담당하는데, DBMS의 두뇌에 해당한다고 볼 수 있습니다.
- 어떻게 하면 옵티마이저가 더 나은 선택을 할 수 있게 유도하는 과정 자체가 바로 MySQL 성능 최적화와 관계있다고 볼 수 있습니다.
실행 엔진
실행 엔진은 만들어진 계획대로 각 핸들러에게 요청해서 받은 결과를 또 다른 핸들러 요청의 입력으로 연결하는 역할을 수행하게 됩니다.
핸들러(스토리지 엔진)
위에서 잠깐 언급한 것처럼 핸들러는 MySQL 서버의 가장 밑단에서 MySQL 실행 엔진의 요청에 따라 데이터를 디스크로 저장하고 디스크로부터 읽어오는 역할을 담당하게 됩니다.
복제
- 복제는 2대 이상의 MySQL 서버가 동일한 데이터를 담도록 실시간으로 동기화하는 기술
- 일반적으로 MySQL 서버의 복제에서는 마스터는 반드시 1개이며 슬레이브는 1개 이상으로 구성
마스터
- 마스터 서버에서 실행되는 DML, DDL 가운데 데이터의 구조나 내용을 변경하는 모든 쿼리 문장은 바이너리 로그에 기록
- 슬레이브 서버에서 변경 내역을 요청하면 마스터 장비는 그 바이너리 로그를 읽어 슬레이브로 넘기게 됨
슬래이브
- 데이터(바이너리 로그)를 받아 올 마스터 장비의 정보(IP주소와 포트 정보 및 접속 계정)를 가지고 있는 경우 슬레이브가 됩니다(마스터나 슬레이브라고 해서 별도의 빌드 옵션이 필요하거나 프로그램을 별도로 설치해야 하는 것은 아닙니다).
- 마스터 서버가 바이너리 로그를 가지고 있다면 슬레이브 서버는 릴레이 로그를 가지고 있습니다.
- 슬레이브 서버의 I/O 스레드는 마스터 서버에 접속해 변경 내역을 요청하고, 받아온 변경 내역을 릴레이 로그에 기록하게 됩니다.
복제 사용시 주의점
- 슬레이브는 하나의 마스터만 설정 가능
- 마스터 슬레이브의 데이터 동기화를 위해 슬레이브는 읽기 전용으로 설정
- 슬레이브 서버용 장비는 마스터와 동일한 사양이 적합
- 복제가 불필요한 경우에는 바이너리 로그 중지
- 바이너리 로그와 트랜잭션 격리 수준(Isolation level)
1. InnoDB이 유리한 경우
- 대용량의 데이터를 컨트롤 하는 경우
- 트랜잭션 관리가 필요한 경우
- 복구가 필요할 경우
- 정렬등의 구문이 들어가는 경우
- IUD 등이 빈번하게 발생하는 경우(Row-Level locking 때문에)
2. MyISAM이 유리한 경우
- 읽기 위주의 작업만 필요할 경우
- 전문 검색이 필요할 경우
- 트랜잭션이나 복구등이 필요 없을 경우
- 한번에 대량의 데이터를 입력하는 배치성 테이블
기본 엔진으로 InnoDB를 선택하고, 추가처리만 하는 경우에는 MyISAM을 사용하는 식으로 구분해서 사용하기도 합니다
sql log
- undo log - 트랜잭션의 롤백 대비용
- redo log - 즉시 변경된 데이터의 내용을 데이터 파일로 기록
- mysql log 파일 - 부하를 일으키는 원인을 찾아서 해결 가능
- 애러 로그 파일
- 슬로우 쿼리 로그
- 바이너리 로그, 릴레이 로그
- 바이너리 로그 파일은 마스터 mysql 서버에 생성되고 릴레이 로그는 슬레이브 서버에 생성
- 바이너리 로그는 select 는 기록 X