GFS를 공부하다보면 ‘원자성’이라는 다소 낯선 단어가 등장하는데, 이 원자성을 이해하기 위해선 먼저 트랜잭션(Transaction)을 알아야합니다.
1. 트랜잭션(Transaction)
트랜잭션은 데이터베이스 시스템이나 그와 유사한 시스템에서 등장하는 용어로서 쿼리가 실행 중에 중단될 경우, 처음부터 다시 실행하는 롤백을 수행하고, 오류없이 실행을 마치면 커밋하는 실행단위입니다. 좀 더 쉽게 풀어서 말하자면 한번 쿼리가 실행되면 그 쿼리가 모두 수행되거나 모두 수행되지 않는 작업수행의 논리적 단위입니다.
가령 내가 친구에게 만원을 송금했으면, 내 통장에는 출금이 표시되고 친구 통장에 만원이 입금되었음이 표시되어야 하는 것과 같은 맥락입니다. 내 계좌에서는 만원이 나갔는데 친구의 계좌에서는 아무런 변화가 없다면 롤백되어 송금부터 다시 시작하고 성공하면 그때서야 커밋하는 체계인 것이죠. 이와같은 송금 과정을 하나의 트랜잭션이라고 이해하면 편할 것 입니다.
2. 트랜잭션 사용이유
트랜잭션은 DB서버에 여러 클라이언트가 동시에 접속하거나 어플리케이션이 갱신을 처리하는 과정에서 중단하는 경우 등에서 발생가능한 데이터 부정합 문제를 방지하기 위해 사용됩니다. 사실 이러한 데이터 부정합을 원천 차단하기 위해선 싱글 프로세스로 처리하도록하면 되지만, 이는 효율이 너무 떨어집니다. 그래서 병렬로 작업을 처리해야하는 현실적인 상황 속에서 부정합 문제를 방지하고자 트랜잭션을 이용하는 것 입니다.
3. ACID
트랜잭션은 4가지의 특징을 갖는데 이를 ACID라고 부릅니다. 그리고 우리가 알고싶어하는 원자성이 그 중 하나입니다.
1) 원자성
원자성은 트랜잭션 작업이 부분적으로 실행되거나 중단되지 않는 것을 보장하는 것을 의미합니다. 소위 Everything or Nothing인거죠. 트랜잭션이라는 개념에서는 데이터베이스와 같은 시스템의 일부만 업데이트가 발생하는 것이 전체 작업을 거부하는 것보다 더 큰 문제를 일으킬 수 있다고 생각하기 때문에 원자성을 보장합니다.
이 원자성을 보장하는건 GFS와 같은 분산 파일 시스템(DFS)에서도 중요합니다. 우선 여러 대의 서버에 파일을 분산 저장하기 위해서는 병렬처리가 필요합니다. 만약 이 파일을 병렬처리하는 과정에서 일부 파일만 업데이트되고 일부 파일은 업데이트가 되지않는다면, 각 분산 저장된 데이터들은 부정합하기 때문에 복제본으로서 가치가 떨어지게 됩니다. 그 결과 DFS의 데이터 무결성이 훼손되어 DFS의 신뢰성에 손상으로 이어지게되죠. 그래서 GFS는 설계과정에서부터 원자성을 보장하기 위한 여러 노력을 한 것입니다.
이 포스팅의 메인 주제는 원자성이기때문에 나머지 세 개의 요소는 가볍게 적고 넘어가겠습니다.
2) 일관성
트랜잭션이 성공했다면, 데이터베이스는 그 일관성을 유지해야합니다. 여기서 말하는 일관성은 가령 트랜잭션이 성공한 이후, 데이터 타입이 정수형에서 문자열로 바뀌 않는다는 것을 말합니다.
3) 독립성
트랜잭션을 수행하는 도중에 다른 연산작업이 끼어들어선 안됩니다. 즉, 트랜잭션끼리는 간섭할 수 없습니다.
4) 지속성
성공적으로 수행된 트랙잭션은 영원히 반영이 되는 것을 의미합니다. 커밋하면 업데이트가 없는 이상 영원히 보장됩니다.