Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

MongoDB 도입을 위한 제언 @krmug

MongoDB 도입을 위한 제언_MongoDB Forum Seoul 2018 session 4 - krmug - donghan kim

Related Books

Free with a 30 day trial from Scribd

See all
  • Be the first to comment

MongoDB 도입을 위한 제언 @krmug

  1. 1. MONGODB 도입을 위한 제언 FACEBOOK MONGODB KOREA USERS GROUP
  2. 2. CONTENTS About US Our Activities Prologue First Meet Application Impressions Fail Case Overcome Difficulty Successful Use Cases Future Works Suggestion Epilogue
  3. 3. About US Our Activities PROLOGUE
  4. 4. ABOUT US • 2,626 Members since 2013-07-05 김기현 Daum Kakao 박승현 강동운 김인범 SK C&C
  5. 5. 5 ACTIVITIES 2014 데이터야 놀자 MongoDB Monitoring 2016 KCD 4th Korea Community Day MongoDB Modeling In Production 2017 KCD 5th MongoDB 3.4 New Features 2018 MongoDB Forum MongoDB Suggestions2018 KCD 6th MongoDB In Chat Bot • 비 정기 모임 및 기타 행사 참여
  6. 6. ACTIVITIES • 개인별 MongoDB 및 관련 기술 서적 출간
  7. 7. First Meet Application IMPRESSIONS
  8. 8. 8 FIRST MEET 도입 계기 noSQL에 대한 궁금증 - 무엇일까? - 타 noSQL 에 대한 실망 RDBMS 의 한계 - 속도 및 확장성 - 유연하지 못한 구조 다양한 OSS와 연계 - Hadoop, R, Spark - Log, SNS Crawling 구현 - 짧은 개발 주기 - Prototyping
  9. 9. 9 APPLICATION 적용 Better Than RDB - 장점 찾기 Win Back RDB - RDB 대체 시도 Orchestration - RDBMS Migration - OSS Mix Up Best Practice - Product Service
  10. 10. Fail on Site Overcome DIFFICULTY
  11. 11. FAIL ON SITE • Two Peasants Digging, Gogh (1889)Image download from Wiki-Pedia
  12. 12. 12 샘플 사이트의 실명이나 사례 회원 공개는 불가합니다. FAIL ON SITE 실패 했던 사례 • Target – PC / Mobile Specification – 2억건 Data in One Table (Oracle) • Fail – 1 Dimension Modeling – Collection Locking (~v2.6) – Save Delay 5000msec (Peak Time) • Result – Oracle / MongoDB 병행 사용 Site A • Target – Log & Data Collector – 약 2,000 여개의 데이터 형태 • Fail – Shard & Replication 구성 못함 – 병목 현상 발생 – Move Chunk 도 듣지 않음 • Result – 분산 안된 상태에서 사용 Site B • P.O.C. Level – 도입을 주도하던 팀장 퇴사 – 한국 공식 지사/총판 부재 • MongoDB Ransom – 인증 사용 안함 (Port 27017) – Collection Data 암호화 – 복호화 비트 코인 요구 Etc.
  13. 13. 13 SITE A 샘플 사이트의 실명이나 사례 회원 공개는 불가합니다. Details • Developer – Junior level 90% • DBA – Oracle / no-SQL Modeling • On Site Development – Prototype 없음 • Reference – 적용 사례 없음 Human Resource • 3 Tier in One Box – WEB/WAS/ORACLE + MongoDB • RedHat Cluster – Active / Stand By • Domains – Top Legacy Solution • 개발기간 – 3 개월 – RTS Engine / Front End / Back End / Batch Restrictions
  14. 14. 14 SITE A 샘플 사이트의 실명이나 사례 회원 공개는 불가합니다. Main Collection & Aggregation { "ACCT_INF": "a8f1-26ff9664542", "I_DATETIME": "20181217T2345.000", "ADD_VER": "2", "AX_CONN_FLAG": "0", "AX_VER": "0", "BANK_ACCOUNT": "0", "BANK_AMOUNT":"0", "BANK_CODE": "3745426519", "BMTID": "", "BR_KIND": "0", "BR_LONG_NAME": "0", "BR_PROXY_IP": "null", "BR_VER": "570556416", "CARD_NO": "0", "VPN_VIP": "4.1.3.4", "XFOR":"ORGCD" } BasicDBObject whereQuery = new BasicDBObject(); BasicDBObject columnQuery = new BasicDBObject(); whereQuery.append("$gte", dayValueFrom) .append("$lte", dayValueTo); columnQuery.put("I_DATETIME",whereQuery); DBObject match = new BasicDBObject("$match", columnQuery); DBObject project = new BasicDBObject("$project", fields ); DBObject sort = new BasicDBObject("$sort", new BasicDBObject("I_DATETIME", 1)); List<DBObject> pipeline = Arrays.asList(match, project, group, sort); AggregationOptions aggregationOptions = AggregationOptions.builder() .batchSize(0) .outputMode(AggregationOptions.OutputMode.CURSOR) .allowDiskUse(false) .build();
  15. 15. db.rank_d01.runCommand( { mapreduce: "rank_d01" , map:function() { emit( {key:this.key,value:this.value},{cnt:this.cnt,tot:this.tot,per:this.per});}, //reduce function count reduce:function(key,values) { var result={cnt:0,tot:0,per:0}; values.forEach(function(value)) { result.cnt += values[i].cnt; result.tot += values[i].tot; }); result.per = (result.cnt / result.tot) * 100; return result; }, query : {"pf_dt" : {$gte:20141001,$lte:20141031} },limit : 3, out : { inline : 1 } }); SITE A – MAP REDUCE
  16. 16. OVERCOME
  17. 17. 17 OVERCOME 샘플 사이트의 실명이나 사례 회원 공개는 불가합니다. Site A • Hot & Cold Area – Cold Data to Oracle with Table Partition – Hot Data to MongoDB with Column Index • Upgrade MongoDB Engine – 2.6.x to 3.0.x Upgrade – Data Dump & Import • Add Solid State Disks – SSD Volume for MongoDB W.T. – Primary + 2 Replica with 3 Shards Solutions • MongoDB – YAML Config – Custom Start & Stop BASH Shell • Language – MongoDB Admin Command – MongoDB Aggregate & Map Reduce • Modeling – Array Embedding – Join 을 위한 2 Way 참조 Refactoring
  18. 18. Successful Use Cases Future Works EPILOGUE
  19. 19. 19 SUCCESSFUL USE CASES 성공적인 도입 사례 • UX 데이터 분석 – All In One Tool – SaaS & On-premise • 데이터 기반 사용자 행태 분석 – 마우스 클릭, 움직임, 스크롤링 – 기타 사용자 정량 지표 수집 • 사용자 경험 분석 – 사용자의 행태를 세그멘트로 표현 – 행태결과를 시각화 Beusable by 4Grit • 연말정산 안내 – 국세상담센터 챗봇 • Kakao Talk Smart Chat – IBM Watson을 Kakao Talk 에 적용 – RULE 과 NLP 기반의 챗봇 서비스 • 납세자 질의 수집 – 미 응답된 질의를 바탕으로 차년도 서비스 기획 NTS Chat-Bot by Uplus-IT • GridFS 를 적용 – 분산 파일 시스템적용이 어려운 곳에 CDN 대신 MongoDB GridFS 사용 • Binary Repository – 신분증, 영상 등을 저장 • 적용 금융사 – 광주은행 – 부산은행 – 유안타증권 비대면 서비스 구축
  20. 20. UX ANALYSIS BEUSABLE
  21. 21. BEUSABLE – UX HEATMAP 방문별 순위 및 UX 비교1 2 4 5 6 3 1 유입 경로별 UX 현황을 제공합 니다. 경로에 따라 달라지는 사용자 행동을 비교하세요. 기기 별 접속 현황2 데스크톱, 태블릿, 스마트폰 사용자 현황을 비교할 수 있습 니다. 브라우저의 평균 FOLD3 사용자 브라우저의 평균 높이인 ‘Average Fold’와 함께 히트맵 데 이터를 확인할 수 있습니다. 행동을 추적하는 히트맵4 클릭 히트맵, 무브 히트맵, 스크롤 히트맵 3가지 히트맵과 스트림(사용자 이동 경로 추적) 을 제공합니다. 신규/재방문 사용자 비교5 신규/재방문 사용자 간의 UX 히트맵을 비교할 수 있습니다. 라이브 히트맵6 마우스 클릭 등 인터랙션으로 발생하는 동적 UI의 데이터를 실제 웹 사이트 위에서 파악할 수 있습니다.
  22. 22. BEUSABLE – FUNNELS 1 2 3 전체, 신규, 재방문 사용자의 단계별 잔존 및 이탈 현황 2 전체 사용자, 신규 사용자, 재방문 사용자 세그먼트 에 따라 단계별 잔존 및 이탈 정도를 비교할 수 있습 니다. 기울기가 가파를수록 이탈률이 높습니다. 해당 페이지를 개선하여 잔존율을 높일 수 있습니다. 개별 사용자 탐색 현황 시뮬레이션3 개별 사용자의 페이지 탐색 순서 및 상세 탐색 행태, 콘텐츠별 체류 시간을 확인할 수 있습니 다. 사용자 행동 흐름1 방문 전/후의 랜딩 페이지 정보를 통해 사용자 행동 흐름을 분석할 수 있으며, 퍼널 단 계를 수정해가며 최적의 사용자 행동 흐름을 찾을 수 있습니다.
  23. 23. { "count" : 1,886,229,734 # 18억건 (1일 천만건) "avgObjSize" : 2218.0, "storageSize" : 1,303,611,408,384 (bytes: 1.3TB), # single node size "totalSize": 4,1182,258,956,420 ( bytes: 4.2TB ), # replication + index "wiredTiger" : {"metadata" : {"formatVersion" : 1.0}}, "totalIndexSize" : total 5 indices --> 447,385,640,960 (bytes: 450GB) } BEUSABLE – CUSTOMER EVENT DATA ( 6 MONTH )
  24. 24. userVisits.aggregate([ {$match: query}, { $group: { _id: {'aid': '$aid'},seq: {$first: '$seq’}, aid: {$first: '$aid'},inflow: {"$sum": 1}, dropped: {"$sum": {"$cond": [{"$eq": ["$dropped", true]}, 1, 0]}}, inflow_new: {"$sum": {"$cond": [{"$eq": ["$existing", false]}, 1, 0]}}, dropped_new: {"$sum": {"$cond": [{$and: [{$eq: ["$dropped", true]}, {$eq: ["$existing", false]}]}, 1, 0]}}, inflow_exist: {"$sum": {"$cond": [{"$eq": ["$existing", true]}, 1, 0]}}, dropped_exist: {"$sum": {"$cond": [{$and: [{$eq: ["$dropped", true]}, {$eq: ["$existing", true]}]}, 1, 0]}}} }, {$sort: {seq: 1}} ]) BEUSABLE – CUSTOMER EVENT AGGREGATION
  25. 25. 26 BEUSABLE Customer Event Aggregation Results • 기간 : 2018-10-15 ~ 2018-10-22 (약 1주일 간) • 개수 : 44,501,664 건 • 속도 : 평균 2.0 초 내외
  26. 26. TTL INDEX NTS CHATBOT
  27. 27. NTS CHATBOT
  28. 28. NTS CHAT BOT – SOFTWARE DIAGRAM Spring • Http Parser • Context Manager • Servlet Manager • Service Logger Watson API • Conversation • Translation • NLC/NLP ORM • Hibernate • Spring Data • Spring MongoDB Apache Common • Connection Pool • HTTP API Twitter • Korean Tokenizer • Korean Pos Watson Service • Conversation • Translation • NLC/NLP Gensim • Doc2Vec • Numpy • Pandas • Tensorflow mariadb • Galera Cluster • Master/Slave Replicatrion mongodb • Sharded Cluster • Cache Service • Logging Service SNS • Kakaotalk • Line • Facebook Messenger Proxy cluster Legacy DB In -App • 다이나믹 UI 제공 • 고객 맞춤 서비스 제공
  29. 29. 30 NTS CHAT-BOT Main Collection & TTL Sample User Message History { "_id" : ObjectId("5b3b5353a7b8d475bed"), "user_key" : "someUserKey", "message_date" : "20180103", "type" : "text", "content" : [ "연말 정산 기간이 언제에요?", "연말정산 기간은 언제까지 인가요?", "연말정산 기간이 언젠가요?", "연말정산 기간이?", "연말정산 대상이 궁급합니다.", "연말정산 서비스가 뭔가요?", "연말정산은 어떻게 하나요?", "연말정산은 어떻게 하는건가요?" ], "date" : ISODate("2018-01-04T00:36:36") } Expire Data from Collections by Setting TTL - Create TTL Index db.user_kakao_cache.createIndex( { "lastEventDate": 1 }, { expireAfterSeconds: 60000 } ) - Java Code public void pushContextPath(String user_key,String content) { if(!content.equals("")){ mongoTemplate.upsert( new Query(Criteria.where("user_key").is(user_key)), new Update(). push("contextPath", content), UserKakaoCache.class); } }
  30. 30. NTS CHAT BOT - REPORTING
  31. 31. GRIDFS 비대면 서비스
  32. 32. CASE 3 – GRIDFS { "filename": "test.txt", "chunkSize": NumberInt(261120), "uploadDate": ISODate("2014-04-13T11:32:33.557Z"), "md5": "7b762939321e146569b07f72c62cca4f", "length": NumberInt(646) } There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable. If you are going to use a passage of Lorem Ipsum, you need to be sure there isn't anything embarrassing hidden in the middle of text. All the Lorem Ipsum generators on the Internet tend to repeat predefined chunks as necessary, making this the first true generator on the Internet. It uses a dictionary of over 200 Latin words, combined with a handful of model sentence structures, to generate Lorem Ipsum which looks reasonable. The generated Lorem Ipsum is therefore always free from repetition, injected humour, or non-characteristic words etc. Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" { "files_id": ObjectId("534a75d19f54bfec8a2fe44b"), "n": NumberInt(0), "data": "Mongo Binary Data" } { "files_id": ObjectId("534a75d19f54bfec8a2fe44b"), "n": NumberInt(0), "data": "Mongo Binary Data" } { "files_id": ObjectId("534a75d19f54bfec8a2fe44b"), "n": NumberInt(0), "data": "Mongo Binary Data" } fs.files fs.chunks files MongoDB Sharded Cluster
  33. 33. CASE 3 – SERVICE DIAGRAM 영상/음성 채팅 상담 CTI/APP 연계 음성 및 영상 전환 음성 및 영상 녹화 재생 음성 및 영상 암호화 영상 캡쳐/저장 신분증서버 연계 네트워크 보안 영상통화 App Android/iOS 비대면 영상 시스템 비대면 신분증 서버
  34. 34. CASE 3 – SYSTEM DIAGRAM AP #02 MongoDB #02 L4 #01 AP #01 MongoDB #01 Client A A A S 영상통화 중계 + WEB 영상통화 중계 + WEB A A S A L4 #02 Storage A S ACTIVE STAND BY
  35. 35. FUTURE WORKS SUGGESTION
  36. 36. 37 FUTURE WORKS • 공식 커뮤니티 활동 – 정기적인 Meetup 및 세미나 – 도입 기업 탐방 및 홍보 • 지원 언어별 멘토링 – Java 이외의 언어 멘토 • 다양한 커뮤니티 채널 운영 – mongodbkorea.slack.com • MongoDB 한글화 지원 – 저자 및 실제 업무 경험 적용 계획중인 작업들
  37. 37. 38 SUGGESTION 도입 제언 • 하나의 언어는 완전히 깨우친 개발자 – Java / Java Script – Python – Go • RDBMS 의 경험이 많은 DBA/Modeler • System Engineer @Serverless – MSA 와 컨테이너는 어렵습니다. • MongoDB University Human Resource • Open Compute Project – Data Center Facility – 싸고 많은 수량의 서버 배치 • 10GB Ethernet • On-premise 보단 Atlas Infrastructure
  38. 38. 39 SUGGESTION 도입 제언 More than Cloud High Availability Scale Out Workload Isolation AtlasA.C.I.D. Zone Sharding

×