하둡 좋은약이지만 만병통치약은 아니다민철 정민철열린세미나 첫번째 발표자료
과거시스템에서의 문제점
그리고 하둡에서는 어떻게 그런문제를 해결했는설명하고
사실 몇가지 불편한점에 대한 이야기
https://www.facebook.com/groups/576473599127259
하둡 좋은약이지만 만병통치약은 아니다민철 정민철열린세미나 첫번째 발표자료
과거시스템에서의 문제점
그리고 하둡에서는 어떻게 그런문제를 해결했는설명하고
사실 몇가지 불편한점에 대한 이야기
https://www.facebook.com/groups/576473599127259
[AWS Builders] 우리 워크로드에 맞는 데이터베이스 찾기Amazon Web Services Korea급진적으로 늘어나는 데이터, 점차 다양해지는 워크로드의 특성에 적합한 데이터 관리를 위해 AWS는 광범위한 데이터베이스를 제공합니다. 이번 웨비나에서는 관계형 데이터베이스를 비롯, 인메모리, 그래프, 시계열 등 다양한 어플리케이션에 적합한 데이터베이스를 선택할 수 있도록 AWS의 각 데이터베이스의 개요를 소개합니다.
CoreDot TechSeminar 2018 - Session2 Ji DonghyunCore.Today코어닷 기술 세미나 2018
Session #2 : 지동현 (NXTechnology 개발팀장)
Node.JS를 활용하여 IoT 플랫폼 만들기
15:00 ~ 15:50
프론트엔드와 백엔드가 함께 소통하기 위해 필요한 API. 그 API를 Node.JS로 만들고, 이를 IoT에서 활용하는 우리 회사의 사례를 소개해 드립니다.
- API란?
- 왜 Node.JS가 좋은가
- IoT에 적용해 보는 Node.JS
https://coredottoday.github.io/2018/10/15/Coredot-기술-세미나/
https://www.youtube.com/watch?v=Uf8Ef_UZFYQ
The MongoDB Strikes Back / MongoDB 의 역습Hyun-woo ParkThe MongoDB Strikes Back / MongoDB 의 역습
MongoDB 1.6 에서 2.4 로 업그레이드하며 추가된 기능과 그로 인해 달라진 개발/운영 방향에 대한 내용을 정리해보았습니다.
(11th korea data_tech_seminar)using_mongo_db_4.0_and_nosql_inbum_kim(skc&c)InBum KimIt's the material announced at the "11th Korea Data Tech Seminar".
제11회 코리아 Data 테크 세미나에서 발표했던
"NoSQL시대의 MongoDB 4.0 활용" 발표 자료입니다.
[111015/아꿈사] HTML5를 여행하는 비(非) 웹 개발자를 위한 안내서 - 1부 웹소켓.sung ki choiajax 등장 이전부터, ajax, comet, 그리고 html5의 웹소켓까지 기술의 흐름을 간략하게 정리해 보았습니다.
웹 어플리케이션의 개발을 다뤄보지 않은 개발자들을 대상으로 처음부터 웹소켓을 다루기 전에,
1. 이전 세대의 통신 기법은 어떤 모양이었는지
2. 웹소켓이 왜 환영받을 만한 기술인지
... 등을 공감할 수 있기 위한 목적으로 PT를 작성 하였습니다.
100828 [visual studio camp #1] C++0x와 Windows7sung ki choi발표 날짜 : 2010. 8. 28.
발표 행사 : Visual studio camp #1
행사 주관 : 한국 Visual Studio 공식 팀블로그
발표 내용 : C++0x와 Windows7
발표 장소 : 강남구 삼성동 웹타임 학원...이었나..;;
1. 아꿈사
http://cafe.naver.com/architect1
최성기
florist.sk@gmail.com
MongoDB 완벽가이드
7장 : 고급 기능 (Advanced Topics)
2. 7장 ‘고급기능’은
아래 5가지 주제에 대해 설명한다.
1. DB 명령어
2. 제한 컬렉션
3. GridFS
4. Server-side 스크립팅
5. DBRef : 데이터베이스 참조
3. 1. DB 명령어
- db.runCommand(…).. 수행 원리와 대표 명령어들.
1. DB 명령어
2. 제한 컬렉션
3. GridFS
4. Server-side 스크립팅
5. DBRef : 데이터베이스 참조
4. db.runCommand( { 명령 문서 } )
이런 형식의 명령어를 3장에서 이미 만났던 적이 있다.
{ getLastError : 1 }
마지막 명령어로 영향받은 문서의 수를 확인
{ findAndModify : ‘…’, ... }
한 번의 연산으로 문서를 찾고 수정한다.
그 뒤로도 매 장마다 이미 신나게 사용함.
아이 씐나 ~
5. 쉘에서 함수 형태로 제공되는 다른 명령어들도
내부적으로는 db.runCommand()를 거쳐서 실행된다.
함수형 명령 runCommand 명령
db.test.drop() db.runCommand( {“drop” : “test”} )
> db.test.drop() > db.runCommand({"drop" : "test"});
true {
"nIndexesWas" : 1,
"msg" : "indexes dropped for collection",
"ns" : "test.test",
"ok" : 1 (책에는 true로 나온다)
}
6. 책이 쓰인 시점에서 명령어는 약 75개,
자료 작성시점 1.8.2 버전 기준으로 약 100여 개가 된다.
shell 명령어 확인 : db.listCommands()
관리자 웹페이지 : http://localhost:28017/_commands
너무 휙 지나감. 볼 수가 없어… 웹페이지 도움말이 펴놓고 참고하기 좋다.
7. 유용한 명령어들만 몇 개 모아보자면…
{ “collStats” : 컬렉션 이름 }
컬렉션 데이터 크기, 할당 공간 용량, 인덱스 크기 통계.
{ “ping” : 1 }
서버가 살아있는지 확인. 잠금 상태여도 바로 리턴된다.
{ “renameCollection” : 컬렉션 이름, “to” : 새 이름 }
컬력션 이름을 변경한다.
{ “repairDatabase” : 1 } { “serverStatus” : 1 }
DB 복구 명령 / 서버 모니터링 통계 수치. 8장에서 다룬다.
8. 2. 제한 컬렉션
- Capped Collections : 사이즈가 고정된 특수한 컬렉션.
1. DB 명령어
2. 제한 컬렉션
3. GridFS
4. Server-side 스크립팅
5. DBRef : 데이터베이스 참조
9. 제한 컬렉션은 circular queue처럼 동작한다.
크기 고정. 가득 찬 상태에서 문서 추가 시 가장 오래된 문서가 삭제된다.
공간이 있을 때는 입력 순서대로 들어가다가... 큐가 꽉 차면 가장 오래된 문서가 새 문서로 대체된다.
10. 제한 컬렉션의 제약
- 문서 삭제 불가능.
- 문서 수정 불가능.
- 색인 생성 불가능.
… 결국 데이터를 추가 하고 (순서대로) 읽어내는 데에만 특화.
11. 제한 컬렉션의 속성
- 입력 속도가 매우 빠르다.
추가공간 할당/관리 등이 필요 없음.
- 입력 순서대로 뽑는 쿼리가 매우 빠르다.
이미 디스크상에 입력 순서대로 존재하고 있기 때문.
- Age-Out(에이지 아웃)
오래된 데이터는 자동으로 제거.
12. 제한 컬렉션의 생성
일반 컬렉션은 자동으로 생성되기도 하지만
제한 컬렉션은 꼭 명시적으로 생성 되어야 한다.
db.createCollection(
컬렉션이름, { capped:true, size:100000 } );
db.createCollection(
컬렉션이름, { capped:true, size:100000, max:100 } );
13. 제한 컬렉션의 생성
이미 존재하는 일반 컬렉션을 제한 컬렉션으로
변환하는 것도 가능하다.
db.runCommand(
{ “convertToCapped” : 컬렉션이름, size : 10000 } )
14. 자연스럽게 정렬하기
- sorting as natural : 입력 순서나 입력 반대 순서로 매우 빨리 정렬.
> db.my_collection:find().sort( { “$natural” : 1 } );
문서 입력 순서 { “$natural” : 1 } 입력 반대 순서 { “$natural” : -1 }
15. 꼬리를 무는 커서
- Tailable Cursors
결과를 모두 꺼냈을 때도 종료되지 않는 커서.
새 데이터가 추가되면 바로 새로운 결과를 꺼낼 수 있다.
제한된 컬렉션에서만 사용 가능.
드라이버마다 사용법은 조금 다르다.
16. 3. GridFS
- 파일 시스템 : MongoDB에 대용량 이진파일 저장하기.
1. DB 명령어
2. 제한 컬렉션
3. GridFS
4. Server-side 스크립팅
5. DBRef : 데이터베이스 참조
17. GridFS의 장점
어플리케이션 구조 단순화
파일 저장을 위한 다른 아키텍쳐를 사용할 것 없이 한 저장소에 같이 저장.
복제, 자동 조각화 사용 가능
DB를 위한 복제/조각화 기능 이용 가능. 장애 복구와 분산 확장에 용이.
특정 파일시스템의 문제를 피한다.
같은 디렉터리에 대량의 파일을 저장해도 문제가 발생하지 않는다.
높은 디스크 지역성(locality)
2Gb 청크로 데이터파일을 할당.
18. mongofiles.exe GridFS 유틸리티
커맨드라인 명령으로 GridFS를 다룰 수 있다.
D:> mongofiles put foo.txt
connected to: 127.0.0.1
added file: { _id:
ObjectId('4c0d2a6c3052c25545139b88'),
filename: "foo.txt", length: 13, chunkSize: 262144,
uploadDate: new Date(1275931244818),
md5: "a7966bf58e23583c9a5a4059383ff850" }
done!
D:> mongofiles list
connected to: 127.0.0.1
foo.txt 13
D:> mongofiles get foo.txt
connected to: 127.0.0.1
done write to: foo.txt
19. 각 언어별 드라이버마다 GridFS를 다루는 인터페이스 제공.
C 인터페이스의 파일 올리기 :
gridfs_offset gridfile_write_file(gridfile* gfile, FILE* stream);
void gridfile_write_buffer( gridfile* gfile, const char* data, … );
C++ 인터페이스의 파일 올리기 :
20. GridFS 대부분의 작업은 클라이언트 드라이버가 처리한다.
서버는 거들 뿐…
fs.files 컬렉션
{ 파일 헤더 }
fs.chunks 컬렉션
{ 파일 데이터 0 }
binary
{ 파일 데이터 1 }
{ 파일 데이터 2 }
클라이언트 이진 파일 :
{ 파일 데이터 N }
21. 4. Server-side 스크립팅
- 서버에서 실행되는 자바스크립트. 저장 프로시저와 유사.
1. DB 명령어
2. 제한 컬렉션
3. GridFS
4. Server-side 스크립팅
5. DBRef : 데이터베이스 참조
22. db.eval() 스크립트를 서버에 보내고 결과를 받는다.
코드나 함수를 보내면 된다. 인자를 전달해야 할 때 함수를 넘기자.
> db.eval("return 1;")
1
> db.eval("function() { return 1; }")
1
> db.eval("function(u) { print('Hello, '+u+'!'); }", [username])
null (값을 리턴하는 함수가 아니다. 메시지는 서버 로그에 찍힌다.)
> db.eval("function(x,y,z) { return x + y + z; }", [num1, num2, num3])
...
23. system.js 자바스크립트 변수를 저장하는 특수 컬렉션
> db.system.js.insert({"_id" : "x", "value" : 1})
> db.system.js.insert({"_id" : "y", "value" : 2})
> db.system.js.insert({"_id" : "z", "value" : 3})
> db.eval("return x+y+z;")
6
> db.system.js.insert({"_id" : "log", "value" :
function(msg, level) {
var levels = ["DEBUG", "WARN", "ERROR", "FATAL"];
level = level ? level : 0; // check if level is defined
var now = new Date();
print(now + " " + levels[level] + msg);
}})
> db.eval("x = 1; log('x is '+x); x = 2; log('x is greater than 1', 1);");
24. Note: Security
클라이언트가 명령어를 보낼 때, 인젝션 공격 가능성에 주의해야 한다.
> func = "function() { print('Hello, "+username+"!'); }"
// username 변수에 “); db.dropDatabase(); print(“가 들었다면…
> func = "function() { print('Hello, '); db.dropDatabase(); print('!'); }"
> db.eval( func )
서버로그 : Hello, !
Shell : { “dropped” : my_collection, “ok” : 1 }
대부분의 드라이버는 DB에 코드를 보낼 때 특수 형태를 사용한다.
C++ 드라이버엔 없는 듯…? 아무튼 코드 작성자가 신경 써야 함.
25. 5. DBRef : 데이터베이스 참조
- 한 문서가 다른 문서를 참조하기 위한 방법 중 하나.
1. DB 명령어
2. 제한 컬렉션
3. GridFS
4. Server-side 스크립팅
5. DBRef : 데이터베이스 참조
26. DBRef MongoDB의 문서를 고유하게 식별하고 참조한다.
한 컬렉션 내에서(혹은 다른 DB에서도)
특정 문서를 참조할 수 있도록 하는 내장 문서(embedded document).
{ “$ref” : collection, “$id” : id_value }
{ “$ref” : collection, “$id” : id_value, “$db“ : database }
{"_id" : 5, "author" : "mike", "text" : "MongoDB is fun!"}
{"_id" : 20, "author" : "kristina", "text" : "... and DBRefs are easy, too",
"references": [{"$ref" : "users", "$id" : "mike"}, {"$ref" : "notes", "$id" : 5}]}
forign key등의 개념이 약한 점을 위해 뭔가 만드는 중인 듯.
개발 편의를 고려한 기능으로 보이나 아직 많이 모자라다.
책에도 굉장히 자신감 없는 어투로 설명되어있다. (본질적이지 않다. 안써도 된다… -_-;; )
27. Driver support for DBRef
서버에서는 DBRef에 대한 예외처리가 없는듯.
대부분 클라이언트의 드라이브 구현에 달려있다.
좋은 예 : DBRef로 참조한 문서에서 자동 역참조 지원.
나쁜 예 : DBRef를 내장문서가 아닌 일반 문서로 처리. 그냥 無...
결국 어느 언어로 된 드라이버를
쓰느냐가 중요하다는 건데…
28. Driver support for DBRef
http://www.mongodb.org/display/DOCS/Database+References 에서
언어별 드라이버의 지원 여부와 정보를 확인할 수 있다.
기대를 저버리지 않고
C++은 지원하지 않는다.
나쁜 예! 그냥 無!...