커넥션과 격리 수준
동시에 몇 개의 커넥션을 받고, 트랜잭션이 서로의 변경을 어디까지 보게 할지 정하는 절이다. 커넥션 한도는 OS 파일 디스크립터 한도와 함께 올려야 실제로 적용된다. 격리 수준은 기동 옵션 --transaction-isolation 이나 SET TRANSACTION 으로 정한다.
커넥션
max_connections 의 기본값은 공식 문서 안에서도 표기가 엇갈린다. 숫자를 외워 두는 대신 운영할 서버에서 직접 조회한다.
SELECT @@GLOBAL.max_connections;
- 서버는 실제로
max_connections + 1개의 클라이언트 커넥션을 허용한다. 여분 한 자리는CONNECTION_ADMIN권한(또는 deprecated 된SUPER)을 가진 계정 몫이다. 커넥션이 포화된 상태에서 관리자가 접속할 때 이 자리를 쓴다. max_connections를 올리면mysqld가 필요한 파일 디스크립터 수도 늘어난다. 필요한 개수를 확보하지 못하면 서버가max_connections값을 낮춘다. OS 한도와open_files_limit을 함께 올려야 설정한 값이 실제로 적용된다.- 한계를 정하는 요소는 스레드 라이브러리 품질, 전체 RAM, 커넥션당 RAM, 워크로드, 목표 응답시간, 파일 디스크립터 수다. 문서는 Linux 나 Solaris 가 통상 500~1000 개의 동시 접속을, RAM 이 넉넉하고(문서 표현은 “many gigabytes of RAM”) 커넥션당 부하가 낮으면 10,000 개까지 감당한다고 적는다.
- 한도를 넘기면
Connection_errors_max_connections상태 변수가 늘고Too many connections에러가 난다. thread_cache_size는 기동 시 서버가 값을 자동 산정하며, 명시 설정으로 덮어쓸 수 있다.0은 캐싱을 비활성화한다. 관측은Threads_cached와Threads_created로 한다.wait_timeout은28800(8시간)이다. 아무 일도 없으면 서버가 8시간 후 커넥션을 닫고, 그 뒤 클라이언트는MySQL server has gone away를 본다.interactive_timeout은 대화형 세션에 같은 역할을 한다. 두 값은SHOW VARIABLES LIKE '%timeout%';로 확인한다.- 문서가 제시하는 대응은 두 가지다. 마지막 쿼리 후 오래 지났으면
mysql_ping()으로 확인하거나,wait_timeout을 실질적으로 만료되지 않을 값으로 두는 것이다. 커넥션 풀 크기 산정에 대한 공식 권고는 문서에 없다. max_allowed_packet기본값은 64MB 다.
격리 수준
- InnoDB 의 기본 격리 수준은
REPEATABLE READ다. 기동 옵션--transaction-isolation이나SET TRANSACTION으로 바꾼다. 현재 값은SELECT @@GLOBAL.transaction_isolation;으로 확인한다. REPEATABLE READ— 같은 트랜잭션 안의 일관된 읽기는 첫 읽기가 만든 스냅샷을 본다. 락킹 읽기와UPDATE·DELETE는 유니크 인덱스에 유니크 검색 조건일 때 찾은 인덱스 레코드만 잠그고 그 앞의 갭은 잠그지 않는다. 그 밖의 조건일 때는 스캔한 인덱스 범위를 갭 락이나 넥스트키 락으로 잠근다.READ COMMITTED— 같은 트랜잭션 안에서도 각 일관된 읽기가 자기만의 새 스냅샷을 만든다. 인덱스 레코드만 잠그고 앞의 갭은 잠그지 않으며, 갭 락은 외래 키 제약 검사와 중복 키 검사에만 쓰인다. 갭 락이 없으므로 팬텀 행 문제가 생길 수 있다. 조건에 맞지 않는 행의 락을 바로 풀어 데드락 확률을 크게 낮추지만 없어지지는 않는다.UPDATE는 semi-consistent read 를 쓴다.- 복제 제약이 있다.
READ COMMITTED에서는 행 기반 바이너리 로깅만 지원된다.binlog_format=MIXED와 함께 쓰면 서버가 자동으로 행 기반 로깅을 쓴다. - 문서가 적는 선택 기준은 ACID 준수가 중요한 핵심 데이터 작업에는 기본값
REPEATABLE READ로 높은 일관성을 강제하고, 대량 리포팅 같은 상황에서는READ COMMITTED로 일관성 규칙을 완화하는 것이다. “READ COMMITTED를 권장한다”는 문장은 공식 문서에 없다. - 하나의
REPEATABLE READ트랜잭션에서 락킹 문장과 비락킹 문장을 섞지 않는다. 그런 경우에는 보통SERIALIZABLE이 필요하다.
Advertisement