IAM20 / gg-juck

끄적이는 곳
0 stars 0 forks source link

4.2.8~4.2.13 #1

Open IAM20 opened 2 years ago

IAM20 commented 2 years ago

4.2.8 Double write buffer

Partial-page, Ton-page

Double write

image

  1. A~D 를 한 번에 디스크에 기록한다.
  2. 진짜 쓰기를 실행한다.
  3. 시스템 재시작시 DoubleWrite 버퍼의 내용과 실제 내용을 비교하여 복구한다.

    • HDD 에서는 순차디스크쓰기를 하기 때문에 부담스럽지 않은 비용
    • SSD 에서는 랜덤IO 여서 조금 부담스럽긴함 (그냥 2배)
    • 근데 무결성 중요하면 하라고 함.
    • 리두 로그 동기화가 꺼져있으면 DoubleWrite 도 꺼야한다.
      • 리두 로그의 Partial-page 현상 때문에 있는거라..

4.2.9 언두 로그

InnoDB 는 DML 로 변경되기 전의 데이터를 별도로 백업한다. 이를 언두로그라 한다. 좋은 역할을 하지만, 관리비용이 만만치않은 친구다.

언두로그는 DML 시에 항상 생성된다. DML 이 실행되면 실제 파일에 변화를 기록하고 이전 데이터는 언두로그에 쓰는 방식이다.

4.2.9.1 언두 로그 모니터링

다행히 8.0 부터는 자동으로 언두 로그를 줄여주고 한다. (GC ...?) 언두 로그 레코드의 수를 모니터링 하는 것이 좋다.

SELECT count
FROM information_schema.innodb_metrics
WHERE SUBSYSTEM='transaction' and NAME='trx_rseg_history_len';

4.2.9.2 언두 테이블스페이스 관리

언두 로그가 저장되는 곳을 언두 테이블스페이스라고 한다.

언두 테이블스페이스

역사

ALTER UNDO TABLESPACE :tablespace_name SET INACTIVE;
DROP UNDO TABLESPACE :tablespace_name;

구성 image

Undo tablespace truncate

4.2.10 체인지 버퍼

INSERTUPDATE 시 데이터 파일 변경 뿐 아니라 인덱스 업데이트도 있다. 이 때 디스크 Random access 가 있기 때문에 조금 부담스러운데, 이를 버퍼에 작업해두고 사용자에게 바로 결과를 뱉는다. 이 때 사용하는 버퍼가 체인지 버퍼.

체인지 버퍼의 모니터링

아래 쿼리를 실행하여 사용중인 메모리를 확인할 수 있다.

SELECT EVENT_NAME, CURRENT_NUMBER_OF_BYTES_USED
FROM performance_schema.memory_summary_global_by_event_name
WHERE EVENT_NAME='/memory/innodb/ibuf0ibuf';

오퍼레이션 처리 횟수는 아래 명령어로 알 수 있다.

SHOW ENGINE INNODB STATUS \G

4.2.11 리두 로그 및 로그 버퍼

리두 로그는 ACID 의 D 와 연관이 깊다. 서버가 비정상적으로 종료되었을 때 데이터 파일에 기록되지 못한 데이터를 잃지 않게 해주는 안전장치다.

비정상 종료를 복구시키는 방법

  1. 커밋되었지만 데이터 파일에 기록되지 않은 데이터
    • 이 경우에는 리두 로그의 데이터를 복사하기만 하면 된다.
  2. 롤백되었지만 데이터 파일에 기록된 데이터
    • 이 경우에는 언두 로그의 데이터를 복사한다.
    • 리두 로그에서는 해당 TX 가 어떤 상태였는지 확인하기 위하여 조회하게된다.

4.2.11.1 리두 로그 아카이빙

리두 로그는 데이터 변경이 너무 많아서 다른 툴이 리두 로그를 사용하기도 전에 덮어 쓰일 수 있다. 이는 아카이빙으로 해결 가능하다.

사용 절차

  1. 리두 로그가 저장될 디렉터리를 시스템 변수로 설정
    • SET GLOBAL innodb_redo_log_archive_dirs='backup:/var/log/mysql_redo_archive';
  2. 리두 로그 아카이빙 함수 실행.
    • DO innodb_redo_log_archive_start('backup', '20200722');
  3. 아카이빙을 종료하고 싶을 때는

    • DO innodb_redo_log_archive_stop(); 실행
    • 아카이빙된 리두 로그는 비활성화해도 삭제되지 않기 때문에, 필요없다면 사용자가 삭제하여야한다.
    • 아카이빙을 시작한 세션이 끊어지면 아카이브도 자동적으로 삭제되기 때문에 정상적으로 사용하려면 꼭 아카이빙 종료 함수를 실행하자.

4.2.11.2 리두 로그 활성화 및 비활성화

보통의 경우 리두 로그를 비활성화 하는 것을 추천하지 않는다. 다만 초기 데이터 세팅이라던가, 데이터 복구, 또는 대용량 데이터 삭제등의 큰 정지작업의 경우엔 비활성화하면 성능상에 이점을 볼 수 있다.

리두로그가 비활성화된 채로 MySQL 이 비정상 종료가 되면, 데이터는 그야말로 대혼돈이기 때문에 (10시의 버전과 10시 1분 버전의 혼재) 꼭 다시 활성화 해주자.

4.2.12 어댑티브 해시 인덱스

B-Tree index 의 자주 읽히는 페이지 인덱스의 해시 인덱스를 만들어 필요할 때 마다 사용하는 방식

장점

단점

이처럼 trade-off 가 극명하기 때문에 써야할 때와 쓰지 말아야할 때를 가려야 합니다.

써야할 때

  1. 동등조건으로 조회하는 경우가 많은 경우
  2. 쿼리가 일부 데이터에 집중되는 경우
  3. 디스크의 데이터가 InnoDB 의 버퍼 풀 크기와 비슷한 경우

안써도 되는 때

  1. 디스크 읽기가 많은 경우
  2. LIKE, JOIN 이 많은 경우
  3. 매우 큰 데이터를 가진 테이블의 레코드를 폭넓게 읽는 경우

해시 인덱스가 사용하고 있는 메모리에 비해 히트율이 굉장히 낮다면, 비활성화를 고려해보아야 합니다. (이거 완전 캐시..)

어댑티브 해시 인덱스의 메모리 사용량은 아래 쿼리로 확인 가능하다

SELECT EVENT_NAME, CURRENT_NUMBER_OF_BYTES_USED
FROM performance_schema.memory_summary_global_by_event_name
WHERE EVENT_NAME='memory/innodb/adaptive hash index';

4.2.13 InnoDB와 MyISAM, MEMORY 스토리지 엔진 비교

IAM20 commented 2 years ago

4.3 MyISAM 스토리지 엔진 아키텍처

4.2.13 에 설명했듯이 거의 Deprecated 급의 엔진인듯. 가볍게 넘어갑시당.

image

4.3.1 키 캐시

사용자 키 캐시 추가하기

  1. 먼저 시스템 파라미터를 추가하고

    key_buffer_size = 4GB
    kbuf_board.key_buffer_size = 2GB
    kbuf_comment.key_buffer_size = 2GB
  2. 각 테이블 인덱스가 사용할 캐시를 생성한다.

    CACHE INDEX db1.board, db2.board IN kbuf_board;
    CACHE INDEX db1.comment, db2.comment IN kbuf_comment;

4.3.2 운영체제의 캐시 및 버퍼

왜 있는지 모르겠는 장.

앞서 버퍼가 없다고 했는데, 없어서 DISK I/O 는 항상 운영체제의 캐시와 버퍼를 사용한다. 운영체제의 디스크 캐시는 보통 남는 메모리를 사용한다. 따라서 운영체제의 디스크 캐시를 사용할 수 있도록 키 캐시는 최대 물리 메모리의 40% 이하로 설정하자.

4.3.3 데이터 파일과 PK 구조

고정길이 ROWID

가변길이 ROWID