데이터베이스를 지탱하는 기술
1. 데이터베이스의 필요성
1) 대량의 데이터에서 빠른 검색.
2) 대량의 데이터를 메모리 내에서 관리하기 어렵다
3) 장애 복구
4) 병렬성 제어(동시 작업)
5) 데이터 무결성 보장
2. 인덱스
- <id, 주소> 형태
원하는 정보가 어느 주소에 위치하는지 빠르게 찾기 위함.
레코드가 고정 길이인 경우, 고정길이 * id를 하면 주소를 알 수 있지만, 버려지는 정보가 많을 수 있다.
인덱스를 이용하면 가변 길이를 이용하면서도 주소를 빨리 구할 수 있다.
- B+ tree : root/branch.leaf 블록이 존재.
리프 블록만 데이터를 가짐.
리프 블록에서 리프 블록으로 이동 가능. -> 등호, 전방일치 등 범위 검색 가능
branch 노드도 데이터를 갖는 경우: B- tree
-인덱스 병합: 여러 개의 인덱스를 사용하는 경우, 각 인덱스로 검색 -> AND/OR
- 업데이트 속도를 향상시키기 위해: 데이터가 추가될때마다 업데이트(ranom write) 하지 않고, 메모리나 파일에 모아두었다가 한번에 업데이트한다.(sequential write.) 예: MySQL innoDB
- B+ 트리의 인덱스 값이 변경된 경우, 리프 블록의 내용도 변경해야하는 경우가 존재한다 : 리프 분할
동시에 여러 클라이언트에서 하는 경우 문제가 생길 수 있음. -> LOCK 사용
파티션 테이블 : 사용자에게는 테이블이 하나지만 내부로는 복수의 테이블로 관리, 인덱스도 복수로 구분 -> 병렬 갱신 가능.
3. 테이블과 릴레이션
◆ - 참조 무결성:
정규화 이론
1) 제1 정규화: 테이블 구성에서 중복/반복/복합값을 포함한 구조 제거
2) 제2 정규화: 일부 열에 의해 결정되는 열 제거
3) 제3 정규화: 모든 열은 기본키에 의해 값이 하나로 결정되어야한다.
4. 장애와 대응
1) RAID
하나의 서버를 여러 개의 HDD에 탑재하고 동일한 데이터를 두 개 이상의 HDD에 분산하는 기술
RAID 0: 복수의 HDD에 데이터 기록, 읽고 쓰기. 이용 가능 용량 - 디스크 개수
RAID 1: 두 대의 HDD에 동일한 데이터 작성. 이용 가능 용량 - 디스크 수의 반절
RAID 5: 오류 정정 부호인 패리티 데이터와 함께 분산하는 방식. 이용가능 용량 - 디스크 수-1개
2) 복제
-1) 단방향
마스터 -> 슬레이브 : 바이너리 로그 전송.
슬레이브는 바이너리 로그를 실행함으로써 마스터와 동일한 상태가 됨.
- 단방향/비동기(MySQL 채택)
슬레이브가 바이너리 로그를 받아서 실행을 완료하기 전까지는 동일하지 않음.
- 단방향/준동기화
슬레이브에 바이너리 로그가 도착할 때까지 마스터가 기다린 뒤 다시 실행 시작.
시간이 조금 더 걸림.
- 단방향/동기화
슬레이브에서 처리를 마칠때 까지 마스터가 기다림.
-2) 양방향
MySQL cluster : 데이터 노드라는 특수 서버에서 데이터를 가지고 있음.
여러 데이터 노드가 동일한 데이터 가짐.
한 데이터 노드 업데이트 -> 다른 데이터 노드에 동기화
3) 장애 대처: 현재는 슬레이브가 다운되면 새로 만들어 전체 복구하는 방법 채택
데이터양이 많을 수록 부하 증가.
5. 트랜잭션
1) 처리 중간에 멈춘 상태에서 데이터 복구
2) 무정지성 : 장애 발생 뒤에도 다시 정상가동을 도움(백업 이후의 처리에 대한 기록이 남음)
LSN(Log Sequence Number)가 증가하고 REDO 로그 생성.
commit마다 데이터를 변경하는 것이 아니라 redo 로그를 생성한뒤 한 번에 처리
sequential write은 처리가 빠르므로 부하 작음.
◆
샤딩:
같은 테이블 스키마를 가진 데이터를 다수의 데이터베이스에 분산하여 저장하는 방법
무결성
1. 영역 무결성
- 한 컬럼에 대해 NULL의 허용 여부와 타당한 데이터 값들을 지정합니다.
- 자료형(Data type), 규칙과 제약(Rules), 값 범위 등을 제한합니다.
2. 참조 무결성
- 기본 키와 참조 키 간의 관계가 항상 유지됨을 보장합니다.
- 참조되는 테이블의 행을 이를 참조하는 참조키가 존재하는 한 삭제될 수 없고, 기본키도 변경될 수 없습니다.
3. 개체 무결성
- 테이블에 있는 모든 행들이 유일한 식별자를 가질 것을 요구합니다.
출처: https://jwprogramming.tistory.com/53 [개발자를 꿈꾸는 프로그래머]