1.InnoDB 스토리지 엔진
- 멀티스레드 기반의 언두 퍼지(Multi threaded purge)
- InnoDB는 MVCC와 롤백을 위해서 언두 영역(언두 스페이스,롤백 세그먼트)를 별도로 관리 한다.
1.1 언두퍼지(Undo purge)
- 많은 클라이언트 커넥션에서 데이터를 변경하게 되면 언두 로그 영역에 수많은 변경 전 정보들이 쌓이게 되는데,이렇게 쌓인 언두 로그를 언젠가는 삭제를 하고 빈 공간을 마련해야 이후의 변경 이력을 저장 할 수 있게 한다. InnoDB에서는 언두퍼지를 전담하는 별도의 스레디가 존재하며, Innodb_purge_threads 시스템 설정 변수로 언두 퍼지 개수 설정 가능.값이 0이면 마스터 스레드 사용(5.5 이전 메커니즘), 1이면 1개의 언두 퍼지 , 2이상이면 다수의 언두 퍼지 사용 한다.
1.2 독립된 플러시 스레드
- 사용자가 DML문장을 실행하면 변경된 데이터는 먼저 리두 로그에 기록되면서 디스크에 영구적으로 기록
- InnoDB 스토리지 엔진은 실제 테이블의 데이터를 메모리(버퍼풀) 상에서만 변경 à 사용자에게 쿼리가 실행 완료 보고
- InnoDB는 메모리상에만 변경되어 있는 데이터(dirty)를 언제가 디스크에 영구적으로 기록해야 하는데 이 작업을 플러시(Flush)
1.3 가변 페이지 사이즈
- InnoDB에서는 데이터나 인덱스 페이지의 크기를 기존 16kb에서 4kb 또는 4kb로 조정 할 수 있게 되었다.
- 권장 방법 : 프라이머리 키나 인덱스를 통해서 1~2건의 레코드를 읽는 단순한 형태의 쿼리들이 빈번이 일어나는 서버는 4KB
1.4 데이블스페이스 복사 및 이관 작업
[SQL]
1.4.1 테이블 스페이스 익스포트 과정
- FLUSH TABLES 테이블명 FOR EXPORT(테이블에 명시적인 잠금이 걸리게 됨(TX락 개념)
-cp 경로/명.ibd 경로/a명.cfg /복사 폴더
- UNLOCK TABLES;
1.4.2 테이블 스페이스 임포트 과정
- ALTER TABLE 테이블 명 DISCARD TABLESPACE;
- cp 경로/명.ibd 경로/a명.cfg /복사 폴더
- ALTER TABLE 테이블명 IMPORT TABLESPACE;
- SELECT * FROM 테이블명
제약 사항 : 테이블 스페이스를 익스포트해서 임포트 할 때 테이블의 이름은 달라도 되지만 반드시 동일한 테이블 구조와 스토리지 엔진인 경우에만 가능 !!!
1.5 독립된 언두 스페이스
- 5.5 이전버전까지는 언두 영역이 시스템 테이블 스페이스의 일부 영역 사용하였으나, 5.6 이상에서는 별도의 공간에 저장 할 수 있도록 시스템 설정 변수 도입됨.
- Innodb_undo_directory : 언두 영역이 저장 될 디렉터리를 설정( 기본 값 "."이며 이것은 시스템 테이블 스페이스를 사용 하겠다는 것을 의미)
- Innodb_undo_tablespaces : 일반 테이블의 레코드를 파티션 하듯 언두 영역도 여러 개의 테이블 스페이스로 분리 생성 가능. 126개까지 생성 가능 .
1.6 읽기 전용 트랜잭션 최적화
- START TRANSACTION READ ONLY로 시작된 트랜잭션. AutoCommit이 활성화된 상태에서 SELECT 쿼리만 실행 된 트렌잭션(FOR UPDATE 제외)
위의 두 조건을 만족하는 트랜잭션에 대해서는 읽기 전용 트랜잭션이라는 것을 알아채고 트랜젝션 ID를 발급하지 않고, 메모리 구조체들을 할당 받지 않게 됨으로 빠른 성능
- 정보 확인 : information_schema 데이터베이스의 INNODB_TRX테이블의 trx_is_read_only 컬럼에서 구분 할 수 있다.
1.7 버퍼 풀 덤프 & 로드
- InnoDB에서는 버퍼풀의 모든 내용이 텅 비어 있는 상태로 시작. 서버가 재시작되면 메모리에는 아무런 데이터가 없기 때문에 모든 쿼리가 디스크에서 읽어야 한다.
- Innodb_buffer_pool_dump_now : 값은 항상 OFF로 설정, 값을 ON으로 설정하면 즉시 InnoDB 버퍼 풀의 내용을 덤프 한다. 버퍼 풀의 덤프가 완료 - 되면 이 변수 값은 다시 자동으로 OFF로 재설정
- Innodb_buffer_pool_load_now: 값은 항상 OFF로 설정, 값을 ON으로 설정하면 Innodb_buffer_pool_filename시스템 설정 변수에 저장된 파일을 읽어서 데이터와 인덱스 페이지들을 InnoDB 버퍼 풀에 적재. 완료 되면 OFF
- Innodb-buffer_pool_dump_at_shutdown : 이 변수가 ON으로 설정 되어 있다면, 서버가 셧다운될 때 InnoDB 버퍼 풀의 내용을 파일로 덤프 한다
- Innodb_buffer_pool_load_at_startup : 이 변수가 ON으로 설정 되어 있다면, 서버가 시작 될 때 innodb_buffer_pool_filename 시스템 설정 변수에 지정된 파일을 읽어서 데이터와 인덱스 페이지들을 innodb 버퍼 풀에 적재
- 사용 방법 : SET GLOBAL innodb_buffer_pool_dump_now =ON; //버퍼 풀의 내용을 덤프
- Innodb_buffer_pool_dump_status, Innodb_buffer_pool_load_status 두 개의 상태 변수를 이용하면 버퍼 풀 덤프나 적재가 얼마나 진행되었는지 확인 가능.
1.8 리두 로그 사이즈
- 리두 로그 처리 메커니즘 : 커밋 된 트랜잭션 내용을 먼저 로그 파일로 기록하고 실제 데이터 파일의 변경은 나중에 모아서 배치 형태로 처리(WAL).InnoDB의 로그는 여러 개의 파일이 하나의 논리적 저장소처럼 순환되면서 사용.
- Innodb_log_file_size : 로그 파일 사이즈 설정 , 서버가 처음 시작되면서 지정된 사이즈로 생성하기 때문에 가변적으로 크기가 바뀌지 않는다. 서버를 클린 셧다운 후에만 사이즈 조정 가능
- Innodb_log_files_in_group : 로그 파일의 개수를 몇 개로 생성할지를 결정하는 시스템 변수. Innodb_log_file_size * innodb_log_files_in_group만큼 생성
- My.cnf파일에서 innodb_log_file_size를 100mà 512m
- 서버 재시작
- 에러 로그 파일과 리두 로그 디렉터리의 파일 사이즈 확인
1.9 더티 페이지 플러시
- 디스크로 기록되지 않는 페이지(블록)를 더티 페이지이며 이를 디스크로 기록하는 것이 플러시이다.
- 플러시 종류 : LRU_LIST – 버퍼 풀에서 자주 사용되지 않는 페이지들의 목록을 관리 하기 위한 것
Flush_list는 버퍼 풀에서 변경된 페이지들의 목록을 시간 순서대로 관리 하기 위한 것
2.1 InnoDB의 더티 플러시
- 더티 페이지 플러시만 전담하는 페이지 클러너(Page Cleaner) 스레드 도입
- 엑세스 패턴(Access Pattern) : 버퍼 풀에 빈 공간이 없을 때, 최근에 자주 사용되지 않은 페이지가 LRU리스트 플러시에 의해서 디스크로 플러시 된다. LRU리스트의 페이지를 한두 개만 플러시하는 것이 아니라 배치 형식으로 많은 페이지들을 플러시해 버리게 된다는 점이 가장 큰 문제
- 위와 같은 문제를 없애기 위해서 innodb_lru_scan_depth 도입 : 페이지 클리너 스래드가 플러시 할 더티 페이지를 찾기 위해서 LRU리스트에서 얼마나 많은 페이지를 스캔할지를 결정 한다.
2.2 체크포인트 에이지
- Flush_list에 남아 있을 수 있는 페이지의 전체 양은 InnoDB의 전체 리두 로그 사이즈의 합에 의해서 결정 된다.
- innodb_io_capacity : 백그라운드 스레드가 디스크 쓰기를 수행 할 때 허용되는 최대 디스크 쓰기 횟수 제한 변수. 기본 값 200이며 동적 변수
- innodb_io_capacity_max : IO 버스터(Burst)가 발생하더라도 디스크 IO가 시스템의 모든 자원을 소모하지 못하도록 제한하는 것.
'MariaDB > Admin' 카테고리의 다른 글
레플리케이션 (0) | 2015.10.27 |
---|---|
기타 기능2 (0) | 2015.10.26 |
스토리지 엔진 2 (0) | 2015.10.20 |
MariaDB 최적화 1 (0) | 2015.10.14 |
MariaDB 옵티마이저 힌트 및 실행 계획 분석 시 주의사항 (0) | 2015.10.12 |