131, #156. 현재 rocksdb에 데이터를 저장하기 위한 rowkey는 timestamp와 salt로 구성되어 있고 client에서 생성해서 server에 보내준다. salt는 랜덤하게 생성되므로 rowkey가 중복될 가능성이 존재한다. metadata에 대한 정보는 rowkey만으로 알 수 없다. 과거의 데이터를 저장하는 warehouse가 아니라 현재 시간의 streaming 데이터를 저장하는 것이므로 timestamp를 찍고 rowkey를 생성하는 것이 client일 필요가 없다. fst와의 연동도 고려되지 않은 rowkey 구조이다.
현재는 metadata의 qualifier에 대한 exact query만 가능하다. metadata 구조와 fst와의 연동도 고려해야 할 것 같다.
124, #145. 현재 paust-db client에서의 query, fetch는 각각의 기능이 따로 분리되어서 구현되어 있다. 사실상 제대로 동작하는지 확인하는 test용에 가깝고 실제 사용자가 사용하는 시나리오에는 적절하지 않다.
134. node와 client간의 데이터 통신이 json serialization을 통해 이루어져서 데이터 타입에 대한 한계가 있고 비효율적이다.
목적, 목표
query optimization 즉, query 성능 향상을 위해 rocksdb에서 사용하는 rowkey, metadata 구조를 설계 및 성능비교 실험하는 것이 큰 목표. 또한, 새롭게 추가할 fst와 변경되는 query interface에 최적화하여 설계할 필요가 있음.
물론 블록 구조가 바뀌면서 저장 방식이 바뀌면 rowkey, metadata 설계가 달라질 수 있지만 기본적인 큰 특성은 유지될 것 같음.
Main Experiment
rowkey 구조 및 생성위치 변경
중복 방지
metadata 정보 포함
server에서 timestamp, rowkey 생성
fst와의 연동
query interface와의 연동
metadata 저장구조 변경
qualifier contain query가 용이하도록
fst와의 연동
query interface와의 연동
Sub Task
multi query-fetch에 적합한 효율적인 query interface 설계
query를 통해서는 fetch를 하기위한 iterator를 생성하고 해당 iterator를 하나씩 돌면서 실제 fetch를 통해 유저가 원하는 데이터인지 확인. 원하는 데이터면 나머지 모든 데이터를 iterating하면서 fetch. 원하는 데이터가 아니면 수정된 새로운 query를 보냄.
timeseries query에 적합한 context 필요
위의 query interface를 기반으로 한 interactive shell(REPL) 개발
현재 paust-db client CLI에서 처럼 query, fetch가 분리된 것이 아니라 interactive한 shell에서 multi query, fetch가 이루어지도록 할 필요가 있다.
node, client간 데이터 serialization 방식 변경
json 대신 protobuf serialization 도입
진행 과정 계획
우선 현재 master에 있는 tendermint, abci, rocksdb 활용 구조에서 rowkey, metadata 설계 및 실험을 진행할 생각입니다. 추후 새로운 블록 구조나 consensus가 도입된다면 거기에 맞추어서 디테일한 구현 부분이 수정될 거 같네요.
원인, 문제점
131, #156. 현재 rocksdb에 데이터를 저장하기 위한 rowkey는 timestamp와 salt로 구성되어 있고 client에서 생성해서 server에 보내준다. salt는 랜덤하게 생성되므로 rowkey가 중복될 가능성이 존재한다. metadata에 대한 정보는 rowkey만으로 알 수 없다. 과거의 데이터를 저장하는 warehouse가 아니라 현재 시간의 streaming 데이터를 저장하는 것이므로 timestamp를 찍고 rowkey를 생성하는 것이 client일 필요가 없다. fst와의 연동도 고려되지 않은 rowkey 구조이다.
124, #145. 현재 paust-db client에서의 query, fetch는 각각의 기능이 따로 분리되어서 구현되어 있다. 사실상 제대로 동작하는지 확인하는 test용에 가깝고 실제 사용자가 사용하는 시나리오에는 적절하지 않다.
134. node와 client간의 데이터 통신이 json serialization을 통해 이루어져서 데이터 타입에 대한 한계가 있고 비효율적이다.
목적, 목표
query optimization 즉, query 성능 향상을 위해 rocksdb에서 사용하는 rowkey, metadata 구조를 설계 및 성능비교 실험하는 것이 큰 목표. 또한, 새롭게 추가할 fst와 변경되는 query interface에 최적화하여 설계할 필요가 있음. 물론 블록 구조가 바뀌면서 저장 방식이 바뀌면 rowkey, metadata 설계가 달라질 수 있지만 기본적인 큰 특성은 유지될 것 같음.
Main Experiment
Sub Task
진행 과정 계획
우선 현재 master에 있는 tendermint, abci, rocksdb 활용 구조에서 rowkey, metadata 설계 및 실험을 진행할 생각입니다. 추후 새로운 블록 구조나 consensus가 도입된다면 거기에 맞추어서 디테일한 구현 부분이 수정될 거 같네요.
Sub Task
하나씩 완료되는대로 paust-db에 적용하면서 성능 테스트 필요