ݺߣ

ݺߣShare a Scribd company logo
MONGODB 도입을 위한 제언
FACEBOOK MONGODB KOREA USERS GROUP
CONTENTS
About US
Our Activities
Prologue
First Meet
Application
Impressions
Fail Case
Overcome
Difficulty
Successful Use Cases
Future Works
Suggestion
Epilogue
About US
Our Activities
PROLOGUE
ABOUT US
• 2,626 Members since 2013-07-05
김기현
Daum Kakao
박승현 강동운 김인범
SK C&C
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
• 비 정기 모임 및 기타 행사 참여
ACTIVITIES
• 개인별 MongoDB 및 관련 기술 서적 출간
First Meet
Application
IMPRESSIONS
8
FIRST
MEET
도입 계기
noSQL에 대한 궁금증
- 무엇일까?
- 타 noSQL 에 대한 실망
RDBMS 의 한계
- 속도 및 확장성
- 유연하지 못한 구조
다양한 OSS와 연계
- Hadoop, R, Spark
- Log, SNS Crawling
구현
- 짧은 개발 주기
- Prototyping
9
APPLICATION
적용
Better Than RDB
- 장점 찾기
Win Back RDB
- RDB 대체 시도
Orchestration
- RDBMS Migration
- OSS Mix Up
Best Practice
- Product Service
Fail on Site
Overcome
DIFFICULTY
FAIL ON SITE
• Two Peasants Digging, Gogh (1889)Image download from Wiki-Pedia
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
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
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();
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
OVERCOME
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
Successful Use Cases
Future Works
EPILOGUE
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
– 신분증, 영상 등을 저장
• 적용 금융사
– 광주은행
– 부산은행
– 유안타증권
비대면 서비스 구축
UX ANALYSIS
BEUSABLE
MongoDB 도입을 위한 제언
BEUSABLE – UX HEATMAP
방문별 순위 및 UX 비교1
2
4
5
6
3
1
유입 경로별 UX 현황을 제공합
니다. 경로에 따라 달라지는
사용자 행동을 비교하세요.
기기 별 접속 현황2
데스크톱, 태블릿, 스마트폰
사용자 현황을 비교할 수 있습
니다.
브라우저의 평균 FOLD3
사용자 브라우저의 평균 높이인
‘Average Fold’와 함께 히트맵 데
이터를 확인할 수 있습니다.
행동을 추적하는 히트맵4
클릭 히트맵, 무브 히트맵,
스크롤 히트맵 3가지 히트맵과
스트림(사용자 이동 경로 추적)
을 제공합니다.
신규/재방문 사용자 비교5
신규/재방문 사용자 간의
UX 히트맵을 비교할 수 있습니다.
라이브 히트맵6
마우스 클릭 등 인터랙션으로
발생하는 동적 UI의 데이터를
실제 웹 사이트 위에서 파악할
수 있습니다.
BEUSABLE – FUNNELS
1
2
3
전체, 신규, 재방문 사용자의
단계별 잔존 및 이탈 현황
2
전체 사용자, 신규 사용자, 재방문 사용자 세그먼트
에 따라 단계별 잔존 및 이탈 정도를 비교할 수 있습
니다. 기울기가 가파를수록 이탈률이 높습니다. 해당
페이지를
개선하여 잔존율을 높일 수 있습니다.
개별 사용자 탐색 현황 시뮬레이션3
개별 사용자의 페이지 탐색 순서 및 상세
탐색 행태, 콘텐츠별 체류 시간을 확인할 수 있습니
다.
사용자 행동 흐름1
방문 전/후의 랜딩 페이지 정보를
통해 사용자 행동 흐름을 분석할 수 있으며, 퍼널 단
계를 수정해가며 최적의 사용자
행동 흐름을 찾을 수 있습니다.
{
"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 )
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
26
BEUSABLE
Customer Event
Aggregation Results
• 기간 : 2018-10-15 ~ 2018-10-22 (약 1주일 간)
• 개수 : 44,501,664 건
• 속도 : 평균 2.0 초 내외
TTL INDEX
NTS CHATBOT
NTS CHATBOT
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 제공
• 고객 맞춤 서비스
제공
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);
}
}
NTS CHAT BOT - REPORTING
GRIDFS
비대면 서비스
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
CASE 3 – SERVICE DIAGRAM
영상/음성 채팅 상담
CTI/APP 연계
음성 및 영상 전환
음성 및 영상 녹화 재생
음성 및 영상 암호화
영상 캡쳐/저장
신분증서버 연계
네트워크 보안
영상통화 App
Android/iOS
비대면 영상 시스템 비대면
신분증 서버
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
FUTURE WORKS
SUGGESTION
37
FUTURE WORKS
• 공식 커뮤니티 활동
– 정기적인 Meetup 및 세미나
– 도입 기업 탐방 및 홍보
• 지원 언어별 멘토링
– Java 이외의 언어 멘토
• 다양한 커뮤니티 채널 운영
– mongodbkorea.slack.com
• MongoDB 한글화 지원
– 저자 및 실제 업무 경험 적용
계획중인 작업들
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
39
SUGGESTION
도입 제언
More than Cloud
High
Availability
Scale
Out
Workload
Isolation
AtlasA.C.I.D. Zone
Sharding

More Related Content

MongoDB 도입을 위한 제언

  • 1. MONGODB 도입을 위한 제언 FACEBOOK MONGODB KOREA USERS GROUP
  • 2. CONTENTS About US Our Activities Prologue First Meet Application Impressions Fail Case Overcome Difficulty Successful Use Cases Future Works Suggestion Epilogue
  • 4. ABOUT US • 2,626 Members since 2013-07-05 김기현 Daum Kakao 박승현 강동운 김인범 SK C&C
  • 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. ACTIVITIES • 개인별 MongoDB 및 관련 기술 서적 출간
  • 8. 8 FIRST MEET 도입 계기 noSQL에 대한 궁금증 - 무엇일까? - 타 noSQL 에 대한 실망 RDBMS 의 한계 - 속도 및 확장성 - 유연하지 못한 구조 다양한 OSS와 연계 - Hadoop, R, Spark - Log, SNS Crawling 구현 - 짧은 개발 주기 - Prototyping
  • 9. 9 APPLICATION 적용 Better Than RDB - 장점 찾기 Win Back RDB - RDB 대체 시도 Orchestration - RDBMS Migration - OSS Mix Up Best Practice - Product Service
  • 11. FAIL ON SITE • Two Peasants Digging, Gogh (1889)Image download from Wiki-Pedia
  • 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 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 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. 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
  • 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. Successful Use Cases Future Works EPILOGUE
  • 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 – 신분증, 영상 등을 저장 • 적용 금융사 – 광주은행 – 부산은행 – 유안타증권 비대면 서비스 구축
  • 22. BEUSABLE – UX HEATMAP 방문별 순위 및 UX 비교1 2 4 5 6 3 1 유입 경로별 UX 현황을 제공합 니다. 경로에 따라 달라지는 사용자 행동을 비교하세요. 기기 별 접속 현황2 데스크톱, 태블릿, 스마트폰 사용자 현황을 비교할 수 있습 니다. 브라우저의 평균 FOLD3 사용자 브라우저의 평균 높이인 ‘Average Fold’와 함께 히트맵 데 이터를 확인할 수 있습니다. 행동을 추적하는 히트맵4 클릭 히트맵, 무브 히트맵, 스크롤 히트맵 3가지 히트맵과 스트림(사용자 이동 경로 추적) 을 제공합니다. 신규/재방문 사용자 비교5 신규/재방문 사용자 간의 UX 히트맵을 비교할 수 있습니다. 라이브 히트맵6 마우스 클릭 등 인터랙션으로 발생하는 동적 UI의 데이터를 실제 웹 사이트 위에서 파악할 수 있습니다.
  • 23. BEUSABLE – FUNNELS 1 2 3 전체, 신규, 재방문 사용자의 단계별 잔존 및 이탈 현황 2 전체 사용자, 신규 사용자, 재방문 사용자 세그먼트 에 따라 단계별 잔존 및 이탈 정도를 비교할 수 있습 니다. 기울기가 가파를수록 이탈률이 높습니다. 해당 페이지를 개선하여 잔존율을 높일 수 있습니다. 개별 사용자 탐색 현황 시뮬레이션3 개별 사용자의 페이지 탐색 순서 및 상세 탐색 행태, 콘텐츠별 체류 시간을 확인할 수 있습니 다. 사용자 행동 흐름1 방문 전/후의 랜딩 페이지 정보를 통해 사용자 행동 흐름을 분석할 수 있으며, 퍼널 단 계를 수정해가며 최적의 사용자 행동 흐름을 찾을 수 있습니다.
  • 24. { "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 )
  • 25. 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
  • 26. 26 BEUSABLE Customer Event Aggregation Results • 기간 : 2018-10-15 ~ 2018-10-22 (약 1주일 간) • 개수 : 44,501,664 건 • 속도 : 평균 2.0 초 내외
  • 29. 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 제공 • 고객 맞춤 서비스 제공
  • 30. 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); } }
  • 31. NTS CHAT BOT - REPORTING
  • 33. 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
  • 34. CASE 3 – SERVICE DIAGRAM 영상/음성 채팅 상담 CTI/APP 연계 음성 및 영상 전환 음성 및 영상 녹화 재생 음성 및 영상 암호화 영상 캡쳐/저장 신분증서버 연계 네트워크 보안 영상통화 App Android/iOS 비대면 영상 시스템 비대면 신분증 서버
  • 35. 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
  • 37. 37 FUTURE WORKS • 공식 커뮤니티 활동 – 정기적인 Meetup 및 세미나 – 도입 기업 탐방 및 홍보 • 지원 언어별 멘토링 – Java 이외의 언어 멘토 • 다양한 커뮤니티 채널 운영 – mongodbkorea.slack.com • MongoDB 한글화 지원 – 저자 및 실제 업무 경험 적용 계획중인 작업들
  • 38. 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
  • 39. 39 SUGGESTION 도입 제언 More than Cloud High Availability Scale Out Workload Isolation AtlasA.C.I.D. Zone Sharding