🍓

MyRocks Engine

MyRocks engine에 대해서 짤막하게 정리해보자. MyRocks가 무엇인지 말하기 전에 RocksDB가 있다. RocksDB는 페이스북으로부터 시작한 오픈 소스 프로젝트인데 LevelDB을 기반으로해서 만들어진 스토리지 엔진이다. 이 RocksDB도 LevelDB처럼 LSM Tree 구조를 가지고 있고 키-값 데이터를 저장한다. 

업무에서 MyRocks 라는 스토리지 엔진을 들었을 때 처음에는 회사 내부에서 커스터마이징한 스토리지 엔진이겠거니 생각했다. 그러나 찾아보니 이 MyRocks도 오픈 소스 프로젝트 중 하나다. 이름으로부터 유추할 수 있듯이 MyRocks는 기존의 RocksDB 스토리지 엔진을 MySQL 전용으로 만든 새로운 스토리지 엔진이다. 많은 사람들은 대부분 MySQL은 InnoDB 엔진으로 생각하는데 사실 InnoDB 엔진만 있는 것은 아니다. MyRocks 엔진은 기본 구조는 LSM Tree 구조이기 때문에 해당 구조가 가진 장단점을 그대로 가지고 있다. 페이스북에서 InnoDB 엔진에서 MyRocks 엔진으로 전환한 이유에 대한 글이 있는데, 이 글을 참조하면 어떤 부분에서 MyRocks가 더 좋은지 알 수 있다.

간단하게 정리하자면 기존의 InnoDB 엔진에서는 write와 space amplification 문제가 있었다. InnoDB 엔진에서는 데이터를 B+ Tree 구조로 저장한다. 이 구조에서는 시스템이 모든 데이터를 중간 노드에 저장하지 않고 맨 하단의 리프 노드에만 저장한다. 만약 하나의 리프 노드가 가진 데이터가 점차 커진다면 해당 리프 노드를 나눠야 한다. 즉, 하나의 데이터 블록을 두 개의 데이터 블록으로 만들어 데이터를 나누어 저장한다. 그 결과 두 개의 데이터 블록이 가진 저장 공간에는 빈 공간이 있을 수 밖에 없다. 이를 단편화(Fragment)라고도 한다. 

또한 데이터(row)를 저장할 때, InnoDB 엔진은 고정된 크기의 페이지 단위로 데이터를 저장한다. 8KB 크기의 고정된 페이지에 데이터를 저장한다면 데이터의 실제 크기가 8KB가 아니어도 결과적으로는 8KB 크기를 차지하게 된다. 한마디로 불필요하게 저장 공간을 더 사용하게 된다. MyRocks 엔진은 이러한 문제를 해결하기 위해 좋은 대안이 될 수 있다. 자세한 내용은 위의 글을 참고하자. 

References