기본 콘텐츠로 건너뛰기

NoSQL은 RDBMS를 대체할 수 있는가? Hadoop, Mongodb, Couchbase 등의 사용 경험자가 말한다!

듣기 버전 : https://youtu.be/_JtfZzISH5g


역시 한국의 유투브 방송에는 NoSQL이랑 RDBMS랑 비교하면서 초심자 분들에게
NoSQL이 좋아 하는 식으로 방송하는게 많이 보이는데요,
이건 잘못하면 RDBMS는 안써도 되 라는 느낌으로 들립니다.




실제로 그런 사례도 몇 번 일어난 것을 보면 제대로 알려드려야 할 것 같아서 이 주제를 가지고 나왔습니다.

넌 뭐가 잘났는데 하시는 분들을 위해 제 자랑을 또 해드려야지요.

전 하둡으로 4000만 dau가 있는 서비스의 1.76PB 짜리를 설계 구축 해봤습니다.
카우치베이스로 32TB 데이터 올리다가 터뜨려 먹은 적도 있습니다.
몽고디비 운영중에 이건뭐지 하고 리밸런싱 커맨드 날렸다가 락걸려서 8시간 서비스 정지도 시켜봤습니다.

저를 nosql의 n자도 모른다고 하시려는 분들!
사실 전 nosql을 제대로 못써봤습니다!

Nosql의 진가는 최소 일간 10억 유니크 엑세스 부터가 아닐까요?

Nosql을 처음 봤을 때 그 구조에 대해 경악 했지요.



NoSQL이 대단한 것은 데이터 저장 구조가 아닙니다. MySQL도 SQL Server도, ORACLE도 JSON Query를 지원하기 때문에 하나의 필드에 다 때려 넣고 표준 SQL에 JSON Query구문만 추가하면 필드처럼 인식 가능합니다. 비정형 데이터를 RDBMS가 못넣는다는 것은 이미 10년 전 이야기지요..

많은 영상에서 하드웨어 구조 같은것은 설명을 하나도 못봤는데요..

NoSQL은 만약 100개의 노드에 데이터가 뿌려져 있다고 합시다.
그러면 Namenode에 검색용 쿼리를 날립니다.
그러면 Namenode는 100개의 노드에 동일 쿼리를 던집니다.
그리고 그 중에 해당 쿼리에 데이터가 있으면 그 데이터만 Name node에 가져옵니다.
그걸 머지해서 리턴을 해주지요.

어떤 내용이냐면,

만약 100GB의 하드를 가진 서버 100대에 NoSQL을 설치하고 데이터를 마구 넣었습니다.
동일하게 10TB의 하드디스크 한대에 RDBMS를 설치하고 데이터를 넣었습니다.

그러면 용량은 같겠지요..

여기에서 데이터 검색을 던집니다.

그러면 RDBMS는 1대에서 Disk IO성능만큼 읽어내려가야 합니다.
모든 하드 디스크의 100GB를 읽어내려가는 데 걸리는 시간을 1 이라고 가정하면,

RDBMS의 경우 10TB를 읽어야 하므로 100이란 시간이 걸립니다.

100개 노드를 가진 NoSQL은 디스크는 100대가 병렬로 자기가 가진 데이터만 계산하면 되므로 1 이면 전체 읽기가 끝납니다. 그걸 Namenode에 가져와서 소팅 하여 리턴하면 약 1.2 정도면 끝납니다.

이 부분이 엄청난 것입니다.

하지만, 이걸 설명하는 NoSQL강의 있었나요?

하지만 NoSQL의 eula를 보고 다시 경악 했습니다.
데이터의 무결성은 보장 안한다.

세상에 어떤 dbms가 데이터 유실해도 모르지만 너 쓸래? 라고 합니까?

그래서 생각했죠.

이넘은 데이터가 유실되도 상관없는 고속 셀렉트 용이구나.

데이터 노드가 많아질 수록 고속으로 Write, Update를 했을 때 3replica라고 해도 노드간 인서트와 업데이트가 반복되는 과정에서 어떤 노드는 인서트보다 업데이트가 먼저 되는 문제가 발생할 수 있습니다.
그러면 데이터 정합성이 깨지게 되는 것이지요. 이걸 다수결로 할거냐 먼저 넣은걸로 할거냐를 선택하는 옵션도 있습니다. 그렇다고 그게 맞다고 보장할 수는 없는 것이지요. 먼저 넣었지만 나중에 업데이트 친게 맞을 수도 있고, 틀린게 두 개 들어갈 수도 있으니까요..

만약 rdbms를 메인으로 유저의 담벼락만 nosql화 해서 수백 노드에 넣어두면 수억 리퀘스트가 와도 문제 없고 담벼락 쯤이야 작성하다 날라가도 욕은 안하겠지요..

이런 용도로 사용하는게 명확히기 때문에 페북이나 트위터에서 nosql을 채택한 것 입니다.

양쪽다 초기 과금 서비스가 없었잖아요?

그들이 광고 시스템 내의 결제 및 정산도 nosql을 쓸거라 보나요?

전체를 보지 않고 극히 일부 도입해도 전체가 그런양 선동하는 영상이 많은데요,

초심자를 상대로 잘못된 정보를 주입하시면,
그들이 cto가 되서 제 고객이 되었을 때 고스란히 제가 피해를 봅니다.
이 무지를 어디서 주워들은 정보 하나로 진실이라 여기는데 절대 안바뀌거든요...

Nosql이 좋다고 교육 영상 올리시는 분들, 성능 비교 같은 것은 하나도 못봤는데요..

입출력 교육 조금 하고 최고네 하는 것보다,

실제로 써보시는 분들을 위한 실전 정보가 더 중요하지 않나요?

최소 몇 노드부터 해야 하는지,
리밸런싱 이슈라던가,

도쿄 본사가 지원해 준다고 mongodb쓰라고 해놓고 6노드로 시작 했는데 서비스가 3000명에서 터진 적이 있습니다.

도쿄 본사에서도 매출은 한국돈으로 매달 수십억을 벌지만 단일 서비스당 동접 3000을 경험하지 못랬거든요.. 그래서 도쿄에서도 첮고 난리 났는데 못찾고 있어서 제가 그 미팅에 들어가서 보자마자 뭔가 이상해서 질문을 했습니다.

레플리카는 6개인데 왜 하나만 쓰시나요?

그 질문을 하자 도쿄에선 당연히 6개 써야 하는거 아니냐고 하네요..
그니까 니네들이 지원해 준대매..
후쿠오카 지사는 이번에 처음 쓴느거니 3년이나 썼던 너네들이 그런거 봐줬어야 하는거 아냐?

그래서 또 모른척 하고 래플리카는 읽기만 할탠데 어떻게 쓰면되죠?
하니까, 각 노드의 ip를 넣어줘야 한다더랍니다.
그러니까 지금 개발포함 오픈까지 거의 1년이 다 되었는데 구축부터 봐줬다던 사람들이 지금까지 이야기 안해줬냐구?

혹시 이렇게 생각하신분들은 nosql이 뭔지 모르는 분입니다.

Nosql은 name node와 data node가 있고 name node는 어디서 써도 상관 없으므로 dns rr이면 됩니다.

왜 elb같은거 안쓰냐구요?

이 질문 하신분!

Nosql로 깔짝 대려고 하시는 겁니까?

엄청난 데이터를 처리하려고 nosql쓰는거 아닌가요?

거기서 무슨 병목을 유발시키려고 elb를 붙이나요?

문재 없었다규요?

그러니까 천만단위 유저를 nosql로 받아보시고 하는 말이냐구요..

이미 동접 100만을 넘어가면 1GB짜리 L4/L7으론 터집니다.
그럼 10GB짜리 쓰면 되잖아요?
그게 얼마나 비싼지는 알고 하시는 말씀인가요?
자기 돈 아니라고 인프라에 얼마나 쳐바를 생각이신가요?
왜 1/10 비용으로 커버 가능한 시스템을 굳이 비싼 돈을 들이려고 하는 건가요?

그리고, Nosql조차 namenode 병목을 막고자 안간힘인데..
그래서 couchbase가 무한히 namenode를 만들 수 있어 병목 현상이 없다고 광고 하잖아요..
엄청난 규모가 되면 이런 고민을 하게 되고 이런 고민할 정도가 아니면 그냥 rdbms로도 충분하단 말입니다.

누군가의 영상에 혹해서 rdbms때려치고 nosql을 배우시려는 분들!
그 강사한테 얼마나 먾은 유저를 커버 해봤냐고 물어봐 주세요. 페북이나 트위터 말고 그 강사 본인 경험 말입니다.

실제로 몽고db로 100노드 1PB를 리밸런싱 돌려서 얼마나 오랫동안 락 걸려서 서비스 정지 되었는지 경험을 해보시면 nosql은 아무나 쓰는게 아니란 것을 알겁니다.

그리고 전통 rdbms의 위대함도 새삼 느끼게 되겠지요.

조금 열냈지만,

전 NoSQL의 N자도 모르는 그냥 IT컨설턴트 였습니다.


giip :: Control all Robots and Devices! Free inter-RPA orchestration tool! https://giipasp.azurewebsites.net/

댓글

이 블로그의 인기 게시물

Alter table 에서 modify 와 change 의 차이 :: SQL Server

두 개의 차이를 모르는 경우가 많아서 정리합니다.  modify는 필드의 속성값을 바꿀때 사용하구요.. change는 필드명을 바꿀떄 사용합니다.  alter table tbbs modify bNote varchar(2000) NULL; alter table tbbs change bNoteOrg bNoteNew varchar(2000) NULL; change에는 원래 필드와 바꾸고 싶은 필드명을 넣어서 필드명을 바꾸는 것이죠~ 더 많은 SQL Server 팁을 보려면  https://github.com/LowyShin/KnowledgeBase/tree/master/wiki/SQL-Server giip :: Control all Robots and Devices! Free inter-RPA orchestration tool! https://giipasp.azurewebsites.net/

책에서는 안 알려주는 대규모 트래픽을 위한 설계

음성 버전 :  https://www.youtube.com/watch?v=ZZlW6diG_XM 대규모 트래픽을 커버하는 첫 페이지 만드는 법..  보통 DB를 연결할 때 대규모 설계는 어떻게 하시나요?  잘 만들었다는 전제 하에 동접 3000명 이하는  어떤 DBMS를 사용해도 문제 없이 돌아갑니다.  여기서 이미 터졌다면 이 콘텐츠를 보기 전에 DB의 기초부터 보셔야 합니다.  아.. 개발 코드가 터졌다구요? 그럼 개발자를 때리셔야지요..  만약 3000명을 넘겼다면? 이제 Write/Read를 분리해서  1 CRUD + n개의 READ Replica를 만들겠죠?  보통 Read Replica는 5개가 최대라고 보시면 됩니다.  누가 연구한 자료가 있었는데...  6번째 레플리카를 만든느 순간 마스터가 되는 서버의 효율 저하 때문에  5번째에서 6번쨰로 올릴때의 성능이 급격히 줄어든다는 연구 결과가 있습니다.  때문에 Azure에서도 replica설정할 때 5대까지 밖에 설정 못하게 되어 있지요.  유저의 행동 패턴에 따라 다르긴 하지만,  1 CRUD + 5 Read Replica의 경우 동접 15000명 정도는 커버 합니다.  즉, 동접 15000명 에서 다시 터져서 저를 부르는 경우가 많지요..  이 때부터는  회원 DB, 게시판DB, 서비스DB, 과금 DB 등등 으로 성격, 서로의 연관도에 따라 나누기 시작합니다.  물리적으로 DB가 나눠지면 Join을 못하거나 Linked Table또는 LinkDB등의 연결자를 이용해서 JOIN이 되기도 합니다.  그에 따라 성능 차이가 생기지만 가장 중요한 포인트는  서로 다른 물리적 테이블의 JOIN은 인덱스를 타지 않는다!  라는 것입니다. 즉, JOIN할 테이블들을 최소한으로 만든 뒤에 JOIN을 걸지 않으면 NoSQL처럼 느려터져 죽습니다.  양이 많은 DB에서 양이 적은 테이블을 가져와서 JOIN을 해야겠지요..  이렇게 해서 동접 10만명까지 커버를 했다 칩시다.  여기서 일반적인 동접의 기준도 서비스마

BI의 궁극판! Apache Drill을 써보자!

사실 Apache Drill 은 BI(Business Intelligence)라고 부르는 것 보다는 단순 데이터 연결 엔진이다. https://drill.apache.org/ 하지만 내가 왜 극찬을 하느냐면.. DBA로서 항상 문제가 되어왔던게, 이기종 데이터의 변환이나 처리였다. 포맷을 맞추는데 엄청난 시간이 걸리고, 데이터 임포트 실패가 무수하게 나고.. 한 번 잘못 데이터를 추출하면 다시 조정, 변환, 추출하는데 시간이 많이 걸린다. 그런데! Apache Drill은 그냥 RDB를 CSV랑 연결해서 조인해서 통계를 낼 수 있다. 그것도 표준 SQL을 사용하여! 예를 들어, CSV의 세 번째 컬럼이 price 이고, 물건의 판매이력을 PG사에서 CSV로 출력 받았다. 우리 DB와의 검증을 위해서는 수동으로 Import를 한 뒤에 포맷이 안맞아 잘리는 데이터가 있다면 다시 맞춰주고, 재 임포트를 수십 번, 그리고 나서 겨우 들어간 데이터를 조인하여 빠진 데이터를 분간한다. 숫자가 적다면 개발자가 개발로 처리할 수도 있지만, 건수가 하루에 300만건 짜리라면.. 한 달 온 파일은 9천만 건이다. 프로그램으로 고작 처리하는 것이 초당 500건. 거의 20만초, 에러 없이 약 56시간.. 에러가 생기면 다시 56시간.. ㅠㅡㅠ 이런게 현실이기 때문에 쿼리 말고는 방법이 없다. apache drill 의 진면목을 보자! 이번에는 좀 범용 적인 MySQL DB와 붙여 보자. . 난 이번에는 Mac에서 작업을 했기 때문에 그냥 다운 받아서 풀었음.. https://drill.apache.org/download/ 여기서 자기 OS에 맞는 버전을 받아서 설치하시길.. 압축을 풀고 나면 MySQL 커넥터를 붙여야 한다. https://dev.mysql.com/downloads/connector/j/5.1.html 여기서 다운로드 이런 커넥터 들을 붙일 때마다 콘피그를 수정해 줘야 하지만, 몇 번만