기본 콘텐츠로 건너뛰기

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/

댓글

이 블로그의 인기 게시물

일본 두바퀴 여행(바이크 편)

영상버전 : https://youtu.be/P3vC17iVu1I 이번에는 일본으로 넘어와서 일본 종주하시는 바이커들을 위한 정보입니다.  일본에서의 2륜의 정의가 면허와 도로교통법이 조금씩 다르다고 합니다.  그래도 그렇게 크게 신경쓸 건 없으니 딱 세 종류로 말씀 드릴께요.  50cc는 원동기 1종이라고 하여 3차선 이상 교차로에서 우회전, 한국에선 좌회전 같이 크게 도는 것이지요..  이게 불가능합니다.  직진 신호로 넘어간 뒤에 방향을 틀고 다시 직진으로 두번 꺾어 가야 하구요,  두 명이 타면 안됩니다.  그리고 맨 가장자리 길로만 가야해서 애매하게 끝에서 두 번째 차선만 직진인 곳들이 있어서 난감할 때가 있지요. 그런데에 직진하면 걸리는 곳이 있다고 합니다. 어느 정도까지 걸리고 안걸리고는 정확히는 모르지만,  직좌 마크가 아닌 좌회전 마크만 있는 곳이 은근히 많으니 조심해야 하겠더라구요.  최고 시속도 30km를 넘기면 안되어 천천히 달려야 합니다.  아뭏든 제약이 엄청나게 많으므로 60cc이상을 가져오시거나 렌트 하시는 것을 추천하구요,  125cc미만은 겐츠키 2종이라고 하여 두 명이 타도 되고, 3차선 이상에서 우회전이 가능합니다.  상당히 제약이 풀리는 대신 고속도로를 탈 수가 없지요.  만약 국도로 천천히 올라오신다면 125cc미만으로도 충분합니다.  실제로 일본인 바이커들 중에서도 국도 종주하는 모습을 많이 볼 수 있구요,  도심에 가면 125cc미만까지만 주차 가능한 바이크 주차장도 꽤 많기 때문에 도심용으로는 메리트가 큰 것 같습니다.  뭐, 125cc대는 곳에 큰 바이크를 대는 경우도 자주 보는데, 아무도 뭐라 안하긴 합니다.  그도 그럴 것이, 일본의 바이크 등록대수는 1031만대 인데도 바이크 전용 주차장은 턱없이 부족하다고 합니다. 바이크 주차장이 저렴하기 때문에 웬만한 ...

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 여기서 다운로드 이런 커넥터 들을 붙일 때마다 콘피그를 수정해 줘야 하지만, 몇 번만...

PHP SLIM Framework 의 간단한 사용방법

난 개발을 잘 못한다.  언어도 딱히 정해놓은 것도 없다.. 이번에는 누군가 SLIM Framework를 깔았다고 쓰랜다..  이건 또 머지.. 하고 그냥 써보았다.. 아마도 이게 전부가 아니고, 극히 일부중에 걍 쓰는것만 쓰는 것일지도 모르지만,  편리한 부분이 있다. $app->get('/member/emailauth', function () use ($app,$conn,$sqlmgr,$ssp) {     //--Request processing begins here...---------------------------- $email = $app->request()->get('email'); $ref = $app->request()->get('ref'); $authid = $app->request()->get('authid'); $callback = $app->request()->get('callback');     //--Control Process---------------------------------------------- try { $getMemberInfo = $ssp->getMemberInfo($conn, $sqlmgr, $email, $authid, $ref); $idx=$getMemberInfo['idx']; if($idx==""){ $postMemberInfo = $ssp->postMemberInfo($conn, $sqlmgr, $email, $authid, $ref); $data = array('result' => '0', 'message' => 'yes', ...