-
PostgreSQL과 mongoDB를 쓰면서 드는 고민DB 2022. 7. 31. 17:50
고민 되는 부분
현재 메인으로는 postgreSQL을 사용하고 sub로 monboDB를 사용하고 있으며 대부분의 data는 postgreSQL에 저장하고 log data나 사용자 action에 관한 data는 mongoDB에 저장해서 사용하고 있다. 여태까지 다 명확히 schema를 정의할 수 있고 수정여지가 적은 data에 대해서만 처리를 하고 있었는데 최근에 변경 될 가능성이 많고 명확하게 schema를 정의하기 힘든 data를 관리해야 할 필요가 생겨서 고민이 된다.
data 조회 시 mongo와 SQL DB를 서버 단에서 혼합해서 사용해도 문제가 되지 않는가?
사실 mongo도 indexing을 잘 활용하면 조회가 빠르고 거의 read만 진행할 것이기 때문에 성능 상 문제는 없을 것이라고 생각된다. 하지만 이 때 하나의 DB 서버에 문제가 생겨서 data의 부분만 가져올 때 어떤 식으로 처리를 해야할 지에 대한 생각이 필요할 것 같다.
지금은 좀 늦었지만 애초에 모든 db를 mongoDB로 관리를 할 걸 이라는 후회가 좀 들긴 한다. mongo도 atomic하게 동작하도록 option을 설정할 수 있고 SQL처럼 사용해야 하는 부분만 따로 collection 정책을 바꾸면 될 것 같은데 공부를 미루다가 SQL을 사용한 것 같다.
Data저장 시 sync 문제를 어떻게 해결 할 것인가?
처음 저장할 때 postgresql에서 생성한 뒤 mongoDB로 생성을 확인하고 그 id에 대해 reference를 달아야 하는데 이 과정을 atomic하게 보장하기 위해서 서버 단에서 로직이 들어가야 할 것 같다. 이를 처리하는게 많은 생각이 필요하고 SPO 상황에서도 제대로 동작할 수 있는가에 대한 고민이 든다.
우선은 아래와 같은 과정으로 하면 문제가 없을 것 같긴 하다.
- postgresql에서 껍데기 data생성 이 때 valid라는 column을 사용하여 false로 셋팅
- mongoDB로 data set 생성
- postgresql의 껍데기 data에 mongo data id에 대해 reference update후 valid를 true로 변경
만일의 상황에서 server 혹은 DB에 SPO가 발생한다 해도 valid가 true가 아니기 때문에 잘못된 부분 정보가 보이는 현상은 없을 것이라고 생각된다.
Data의 삭제가 발생할 경우 어떻게 해결할 것인가?
사실 삭제의 경우도 sync를 맞춰줘야 하지만 "삭제" == "더 이상 사용하지 않음" 이라고 정의하고 expired: boolean column을 하나 둬서 postgresql만 expired 표시를 해서 보이지 않도록 하면 될 것 같다.
mongo에서는 postgresqldptj expired가 되었을 때 특정 field를 이용해 db expired 시간을 정할 수 있는 기능이 있는지 확인하고 만약 있다면 정책을 정해 얼마나 data를 유지할 지 생각하면 될 것 같다.