Outsider's Dev Story: Database/NoSQL 카테고리 글 목록https://blog.outsider.ne.kr/Stay Hungry. Stay Foolish. Don't Be Satisfied.2024-03-15T10:10:49+09:00Textcube 1.10.7 : Tempo primo[Book] NoSQL: 빅 데이터 세상으로 떠나는 간결한 안내서Outsiderhttps://blog.outsider.ne.kr/9872013-10-04T23:42:02+09:002013-10-04T23:42:02+09:00<div class="ttbReview">
<fieldset style="PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 10px; WIDTH: 90%; PADDING-TOP: 5px"><legend><a href="http://www.aladin.co.kr/shop/wproduct.aspx?ISBN=8966260705&ttbkey=ttboutsideris1727002&COPYPaper=1" target="_blank" class="aladdin_title">NoSQL: 빅 데이터 세상으로 떠나는 간결한 안내서</a></legend>
<p>
</p><table>
<tbody>
<tr>
<td><a href="http://www.aladin.co.kr/shop/wproduct.aspx?ISBN=8966260705&ttbkey=ttboutsideris1727002&COPYPaper=1" target="_blank"><img src="http://image.aladin.co.kr/product/2413/30/cover/8966260705_1.jpg" alt="" border="0"/></a></td><td align="left" style="vertical-align:top;"><a href="http://www.aladin.co.kr/shop/wproduct.aspx?ISBN=8966260705&ttbkey=ttboutsideris1727002&COPYPaper=1" target="_blank" class="aladdin_title">NoSQL: 빅 데이터 세상으로 떠나는 간결한 안내서</a> - <img src="http://image.aladin.co.kr/img/common/star_s8.gif" border="0" alt="8점" /><br/>프라모드 사달게이 & 마틴 파울러 지음<br>윤성준 옮김<br>인사이트</td></tr></tbody></table></fieldset><br><br></div>
<p>이 책의 작년에 아마존에서 SQL쪽 베스트셀러 중 하나였던 <a href="http://www.amazon.com/NoSQL-Distilled-Emerging-Polyglot-Persistence/dp/0321826620">NoSQL Distilled: A Brief Guide to the Emerging World of Polyglot Persistence</a>의 번역서로 이름도 유명한 <a href="http://martinfowler.com/">마틴 파울러</a>가 프라모드 사달게이와 공저로 쓴 책이다.</p>
<p>이 책은 200페이지 정도로 데이터베이스 책 치고는 별로 두껍지 않은 분량을 가지고 있는데 책의 초반에 저자들이 언급했듯이 <strong>NoSQL을 사용할 지 고민할 때 판단의 근거가 될 수 있는 개념을 최대한 간결하게 제공하는데 그 목적이 있다.</strong> 그래서 NoSQL이 가진 개념들이나 고려사항들을 설명하고 있고 각 NoSQL 데이터베이스의 자세한 사용방법등은 별로 다루고 있지 않다. 물론 <strong>각 종류별 특성을 설명하면서 간략히 사용방법을 소개하기는 하지만 이는 NoSQL의 데이터베이스 종류별(키-밸류, 그래프, 도큐먼트 등)로 개념을 설명하기 위한 것일 뿐이므로 실제로 사용하려면 관련 책을 다시 보아야 할 것이다.</strong>(아마 각각의 데이터베이스에 대한 책이 이 책의 분량을 뛰어넘을 것이다.)</p>
<p>즉, <code>이 책은 NoSQL에 대해서 아직 잘 몰라서 어떤 NoSQL을 선택해야 할지 모르거나 NoSQL에 대해서 공부해 보고 싶을 때 처음 보기에 딱 좋은 책이다.</code> NoSQL은 RDBMS와 대비되는 개념으로 하나의 이름으로 묶어서 사용하고는 있지만 사실 이 안에는 전혀 다른 특성을 가진 키-밸류 스토어, 그래프, 도큐먼트 디비등이 모두 포함되어 있으므로 하나의 NoSQL을 사용해 봤다고 다른 종류의 NoSQL을 쉽게 사용할 수 있는 것이 아니다. 그래서 처음 NoSQL을 공부하려면 기존에 RDBMS를 공부했을 때와는 많이 다른 새로운 개념들로 혼란을 겪게 되는게 그런 혼란을 줄여주고 NoSQL에 대한 전체적인 그림을 이해하는데 상당히 도움이 되는 책이고 설명도 상당히 잘 되어 있고 번역품질도 좋은 편이다. 이미 NoSQL을 어느 정도 사용하고 있다면 <strong>이 책이 별로 도움이 될지는 모르겠지만 NoSQL 중 하나정도만 다뤄보고 다른 NoSQL에 대해서는 거의 모르거나 NoSQL을 처음 공부하기에는 개념잡기가 아주 좋은 책이다. 개념의 설명도 잘 되어 있고 고민해 보아야 할 부분에 대한 힌트도 많이 주는 편이다.</strong> 이 책에도 나와있듯이 NoSQL은 아직 역사가 짧기 때문에 많은 유즈케이스가 존재하지 않고 RDBMS에서의 경험만으로는 적용하기 어려운 많은 개념이 포함되어 있는데 이런 부분에 대한 자료도 많지 않고 공부하려고 해도 너무 많은 내용을 보아야 하는데 이 책이 그런 부분에 대한 길잡이를 해줄만 하다. NoSQL에 대해서는 예전에 정리했던 <a href="http://blog.outsider.ne.kr/519">NoSQL에 대해서</a>라는 글도 참고할만 하다.(어느새 저 정리를 한지가 3년이나...)<br />
<br></p>
<h1>책의 내용</h1>
<p>1부 "기본 개념"에서는 NoSQL에 공통적으로 적용될 만한 기본적인 개념들을 설명하고 있다. 기존의 RDBMS 구조에서 왜 NoSQL이 필요했고 그래서 NoSQL은 어떤 기능에 초점을 맞추고 있는지를 쉽고 명확하게 설명한다. 이 책에서는 NoSQL을 특정 기술이 아니라 하나의 동향으로 보고 있고 NoSQL이 필요한 가장 큰 이유를 <strong>클러스터가 필요한 규모의 데이터 크기와 성능 요건하에서의 데이터 접근 처리</strong>와 <strong>좀 더 편리한 데이터 조작 방식을 통한 애플리케이션 개발 생산성 향샹</strong>으로 보고 있다.</p>
<blockquote>
<p>NoSQL 데이터베이스에 대한 흔한 이야기 중 하나는 NoSQL 데이터베이스에는 스키마가 없기 때문에 애플리케이션 운영 중에도 데이터 구조를 바꾸기 쉽다는 것이다. 우리는 동의하지 않는다. 무스키마 데이터베이스 역시 암묵적 스키마를 가지고 있으며 데이터 구조를 바꿀 때 이 규칙을 수정해야 한다.</p>
</blockquote>
<p>처음에는 NoSQL의 데이터 모델이 가지는 기본적인 개념을 설명하면서 관계형 데이터베이스가 튜플 중심인데 반해 집합지향이라는 개념을 설명한다.(모든 NoSQL이 집합지향인 것은 아니다.) 집합 지향은 어플리케이션 데이터 모델을 개발할 때 데이터를 어떻게 접근할 지를 고민해 보아야 하고 관계형 데이터베이스도 복잡한 관계를 처리하는데 아주 뛰어난 것은 아니라는 것을 유념하라고 하고 있다. 그리고 스키마가 없기 때문에 균일하지 않은 데이터를 처리하기 쉽지만 데이터를 확인하려면 어플리케이션 코드를 봐야한다는 문제도 있다.</p>
<p>이어서 NoSQL의 특징인 클러스터링을 설명하고 있다. 샤딩으로 수평적 확장을 할때의 장점과 발상할 수 있는 문제 및 해결방법등을 제시하고 샤딩에 비해서 마스터-슬레이브 복제를 할 때는 또 어떤 다른 점이 있는지를 설명하고 있다.</p>
<blockquote>
<p>흔히 듣는 주장중 하나가 NoSQL 데이터베이스는 트랜잭션을 지원하지 않으므로 일관성도 지원하지 않는다는 것이다. 이런 주장은 일반적으로 틀렸다고 할 수 있는데 많은 중요사항을 얼버무려 넘겼기 때문이다. 이에 대한 첫재 해명은 트랜잭션이 없다는 것은 보통 일부 NoSL 데이터베시으 특히 집합 지향 데이터베이스에만 해당하는 것이다. 둘째, 집합 지향 데이터베이스는 원자적 업데이트를 지원하지만 한 집합에 대해서만 지원한다.</p>
</blockquote>
<p>클러스터를 이용할 때는 일관성이 항상 문제되는데 이를 어떻게 해결하고 접근해야 하는지에 대한 범용적인 개념을 설명하는데 어려운 개념이지만 이해하기가 참 좋다. 그리고 중요한 개념중 하나인 <strong>결과적 일관성(eventual consistency)</strong> 즉, 특정 시점에는 노드에 복제 일관성 불일치가 있을 수 있지만 결국에는 모든 노드가 같은 값으로 업데이트 된다는 개념을 설명하고 있다.</p>
<p>2부 "적용"에서는 NoSQL의 종류별로 좀더 구체적으로 설명하고 있다. 키-값 저장소, 문서 데이터베이스, 칼럼 패밀리 데이터 저장소, 그래프 데이터베이스를 차례차례 설명하면서 어떤 특성을 가지고 있고 어떤 장단점이 있는지를 설명해서 상황에 따라 어떤 종류를 사용해야 할지 판단해야 할 근거를 제공한다. 각 종류마다 적절한 사용처와 사용하지 말아야 할 경우를 제시하는 것도 고민할 때 꽤 유용할 꺼라 생각한다.</p>
<p>2부의 뒷부분에서는 스키마를 변경해야 하거나 레거시 시스템에 적용해야 하는 등의 실제로 일어날 수 있는 상황에 대해서 설명하고 있고 NoSQL외에 다른 데이터 처리 방법등에 대해서 소개하고 있는데 이 뒷부분은 크게 중요하지는 않아 보인다.(몇페이지 되지도 않는다.)</p>
<p><strong><a href="https://blog.outsider.ne.kr/987?commentInput=true#entry987WriteComment">댓글 쓰기</a></strong></p>MongoDB 도큐먼트의 BSON 크기 확인하기Outsiderhttps://blog.outsider.ne.kr/9412013-05-16T23:54:02+09:002013-05-16T23:54:02+09:00간단한 개인 프로젝트를 하면서 MongoDB를 사용했는데 데이터를 조회하던 중 다음과 같은 connection closed due to parseError 오류가 발생한다.<br><pre class="line-numbers"><code class="language-shell">
Thu May 16 2013 19:53:18 GMT+0900 (KST) - error: Error: connection closed due to parseError
at [object Object].Server.connect (/example/node_modules/mongodb/lib/mongodb/connection/server.js:645:45)
at [object Object].EventEmitter.emit (events.js:126:20)
at [object Object]._connect (/example/node_modules/mongodb/lib/mongodb/connection/connection_pool.js:181:15)
at [object Object].EventEmitter.emit (events.js:99:17)
at Socket.exports.Connection.createDataHandler (/example/node_modules/mongodb/lib/mongodb/connection/connection.js:357:20)
at Socket.EventEmitter.emit (events.js:96:17)
at TCP.onread (net.js:397:14)
</code></pre><br>오류 메시지만 보면 파싱오류가 발생한 것데 왜 파싱오류가 발생했는지는 추측하기가 쉽지 않다. 이건 소스를 보면 확인할 수 있는데 해당 부분인 <font color="#FF7635">connection.js</font>의 소스는 다음과 같다.<br><pre class="line-numbers"><code class="language-javascript">
if(sizeOfMessage < 0 || sizeOfMessage > self.maxBsonSize) {
var errorObject = {err:"socketHandler", trace:'', bin:self.buffer, parseState:{
sizeOfMessage: sizeOfMessage,
bytesRead: self.bytesRead,
stubBuffer: self.stubBuffer}};
if(self.logger != null && self.logger.doError) self.logger.error("parseError", errorObject);
// We got a parse Error fire it off then keep going
self.emit("parseError", errorObject, self);
return;
}
</code></pre><br>메시지가 없거나 최대 BSON 사이즈보다 작은 경우에 오류가 발생한건데 이 경우에는 BSON 사이즈가 최대 크기를 넘어선 경우이다. MongoDB는 BSON(Binary JSON)이라는 데이터형식을 사용하는데 현재 <a href="http://docs.mongodb.org/manual/reference/limits/#BSON Document Size" target="_blank">MongoDB의 최대 사이즈는 16MB</a>이다. 과거에는 <a href="https://jira.mongodb.org/browse/SERVER-431?focusedCommentId=22283&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-22283" target="_blank">4MB였는데 1.7.4버전부터인가 16MB로 올라갔고</a> 차후에는 32MB로 올릴 예정인 것으로 알고 있다. 이 값은 참고로 수정할 수 없는 값이므로 MongoDB의 제약사항 중 하나고 MongoDB에서 하나의 도규먼트(RDB라면 하나의 Row)의 최대 크기가 16MB라는 의미이다. 임시적인 프로젝트라서 귀차니즘에 하나의 컬렉션에 데이터를 임베딩해서 넣으면서 16MB가 넘을 일은 없을꺼라고 생각했지만 아마도 넘은듯 하다.(사실 정말 16MB가 넘은지 좀 의심스럽기는 하지만 데이터가 많아서 정확히 확인하지는 못했다.)<br><br><br><b><font size="5">BSON 사이즈 확인</font></b><br>MongoDB 쉘에서는 BSON의 크기를 확인할 수 있는 <font color="#FF7635">Object.bsonsize()</font>라는 함수를 제공하고 있고 있다.<br><pre class="line-numbers"><code class="language-shell">
> Object.bsonsize({})
5
> Object.bsonsize({name:'outsider', url:'http://blog.outsider.ne.kr'})
60
</code></pre><br>bsonsize()에 객체를 넘겨보면 BSON의 크기를 계산해 볼 수 있다. 위와 같이 객체를 직접 넣는대신 query를 넣어서 확인할 수도 있다.<br><pre class="line-numbers"><code class="language-shell">
> Object.bsonsize(db.test.findOne())
988923
</code></pre><br>위와 같이 <font color="#FF7635">findOne()</font> 쿼리를 사용해서 디비에 담긴 특정 도큐먼트의 크기를 확인해 볼 수 있는데 여기서 주의할 점은 <font color="#FF7635">findOne()</font>만 되고 <font color="#FF7635">find()</font>로는 제대로 확인이 되지 않는다. 여기서 나오는 크기는 바이트크기이므로 988923은 988KB정도가 되는 것이다. BSON 사이즈제한이 의심되는 도큐먼트가 있다면 이 함수를 사용해서 확인해 볼 수 있다.<br><p><strong><a href="https://blog.outsider.ne.kr/941?commentInput=true#entry941WriteComment">댓글 쓰기</a></strong></p>MongoDB 백업하고 복구하기Outsiderhttps://blog.outsider.ne.kr/7902012-05-29T21:59:39+09:002012-05-29T21:59:39+09:00사용하던 MongoDB를 백업받아서 다른 서버로 이전해야할 일이 있었습니다. 어떤 게시판같은 서비스에 사용하는 것은 아니기 때문에 데이터를 실시간으로 유지해야할 건 아니었고 그냥 덤프떠서 복구하면 되는 거였고 건수도 몇건 안되긴 했습니다.(당연히 샤딩을 사용하지 않은 단일 디비입니다.)<br><br><br><br><font style="font-weight: bold;" size="5">mongodump</font><br>MongoDB가 설치된 bin디렉토리에 가면 <span style="color: rgb(255, 118, 53);">mongodump</span>라는 명령어가 존재합니다. 이 명령어를 사용하면 MongoDB 전체나 특정 DB, 컬렉션을 바이너리 형태로 덤프받을 수 있습니다. 즉 BSON형태로 내려받게 됩니다.<br><pre class="line-numbers"><code class="language-shell">
$ mongodump --host 127.0.0.1
connected to: 127.0.0.1
all dbs
DATABASE: dbname to dump/dbname
.....
</code></pre><br>위와같이 <span style="color: rgb(255, 118, 53);">mongodump</span> 명령어를 사용하면 MongoDB에 접속해서 전체 디비의 덤프를 dump라는 폴더아래 내려받게 됩니다. 디비별로 디렉토리가 하나씩 생기가 그 아래 컬랙션 별로 BSON 파일이 생성됩니다. 인증이 필요한 경우는 <span style="color: rgb(255, 118, 53);">-u 아이디 -p 비밀번호</span> 와 같은 옵션을 사용할 수 있고 <span style="color: rgb(255, 118, 53);">-d 디비명 -c 컬렉션명</span> 으로 특정 디비의 컬렉션만 덤프받을 수도 있습니다. 좀더 자세한 옵션에 대한 것은 <a href="http://www.mongodb.org/display/DOCS/Import+Export+Tools#ImportExportTools-mongodumpandmongorestore" target="_blank">가이드문서</a>에 잘 나와있습니다. (예를 들면 ObjectID 대신 커스텀 id를 사용할 경우 속도문제를 해결하기 위한 방법 등)<br><br><br><br><font style="font-weight: bold;" size="5">mongorestore</font><br>mongodump 명령어가 존재하므로 당연히 <span style="color: rgb(255, 118, 53);">mongorestore</span> 명령어가 존재하고 이는 dump받은 BSON파일에서 데이터를 복구해주는 역할을 합니다.<br><pre class="line-numbers"><code class="language-shell">
$ mongorestore -h 127.0.0.1 ~/dump/
connected to: 127.0.0.1
....
</code></pre><br>위와 같이 몽고디비를 지정하고 덤프파일이 있는 디렉토리를 지정해 주면 됩니다. 덤프받을 때 index도 같이 덤프받기 때문에 복구과정에서 인덱스도 같이 생성이 됩니다.(index를 생성하지 않으려면 index 컬렉션의 BSON파일을 제거하면 됩니다.) mongorestore는 단순히 insert과정이 있기 때문에 겹치는 데이터가 있을 경우 해당 값을 덮어쓰지 않습니다. 복구 전에 존재하는 컬렉션을 없애고 싶다면 <span style="color: rgb(255, 118, 53);">--drop</span> 옵션을 사용합니다.<br><br>데이터를 복구하는 가운데 <span style="color: rgb(204, 153, 0);">assertion: 13111 field not found, expect type 2</span>가 날 수 있는데 <a href="http://stackoverflow.com/questions/10712600/mongodump-and-mongorestore-field-not-found" target="_blank">이는 덤프받은 MongoDB와 복구하려는 MongoDB의 버전이 다른 경우에 발생합니다.</a> 이 문제는 인덱스를 인서트 하는 과정에서 발생하는 듯 한데 <span style="color: rgb(255, 118, 53);">-d, -c</span> 옵션으로 디비와 컬렉션을 지정해서 인덱스를 제외한채로 복구하거나 앞에서 얘기한것처럼 index 덤프파일을 제거하고 데이터를 복구한 뒤에 <span style="color: rgb(255, 118, 53);">ensureIndex</span>로 인덱스를 다시 생성해 주면 됩니다.<br><p><strong><a href="https://blog.outsider.ne.kr/790?commentInput=true#entry790WriteComment">댓글 쓰기</a></strong></p>[Book] MongoDB 활용 가이드Outsiderhttps://blog.outsider.ne.kr/7732012-04-20T01:35:09+09:002012-04-19T23:59:15+09:00<div class="ttbReview">
<fieldset style="PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 10px; WIDTH: 90%; PADDING-TOP: 5px"><legend><a href="http://www.aladin.co.kr/shop/wproduct.aspx?ISBN=8979148860&ttbkey=ttboutsideris1727002&COPYPaper=1" class="aladdin_title">MongoDB 활용 가이드</a></legend>
<p>
</p><table>
<tbody>
<tr>
<td><a href="http://www.aladin.co.kr/shop/wproduct.aspx?ISBN=8979148860&ttbkey=ttboutsideris1727002&COPYPaper=1"><img src="http://image.aladin.co.kr/product/1420/79/cover/8979148860_1.jpg" alt="" border="0"></a></td><td style="vertical-align:top;" align="left"><a href="http://www.aladin.co.kr/shop/wproduct.aspx?ISBN=8979148860&ttbkey=ttboutsideris1727002&COPYPaper=1" class="aladdin_title">MongoDB 활용 가이드</a> - <img src="http://image.aladin.co.kr/img/common/star_s8.gif" alt="8점" border="0"><br>크리스티나 초도로우 지음<br>이진석 옮김<br>한빛미디어</td></tr></tbody></table></fieldset><br><a href="http://blog.outsider.ne.kr/685" target="_blank">MongoDB 완벽 가이드</a>에 이어 국내에 두번째로 나온 MongoDB 번역서입니다. 이 책은 사실 오렐리의 <a href="http://shop.oreilly.com/product/0636920018308.do" target="_blank">Scaling MongoDB</a>와 <a href="http://shop.oreilly.com/product/0636920019893.do" target="_blank">50 Tips and Tricks for MongoDB Developers</a> 두 권을 책을 엮어서 한권의 책으로 만든 것입니다.(표지는 Scaling MongoDB의 표지입니다.) 그래서 Part 1은 Scaling MongoDB이고 Part 2는 50 Tips and Tricks for MongoDB Developers인데 책이 다른 책이기 때문에 글의 진행방식도 완전히 다릅니다. 개인적으로는 좀 일반적인 Part 2가 앞으로 오고 스케일링 부분이 뒤로 가는게 더 낫지 않았을 까 하는 생각도 합니다.<br><br>앞에서 말했듯이<span style="color: rgb(204, 153, 0);"> Part 1은 스케일링 MongoDB입니다. 즉 MongoDB를 분산환경에서 어떻게 사용해야 하는 것을 얘기하는 것이고 더 구체적으로 말하면 샤딩을 의미합니다. MongoDB의 샤딩이 어떻게 처리되고 샤딩을 제대로 사용하려면 샤드키나 설정등을 어떻게 해야하는지에 대해서 설명하고 있습니다. 그리고 이렇게 분산된 몽고디비를 운영할 때 알아두어야 하는 상황에 대해서 알려줍니다.</span> 분산이라는 것이 워낙 복잡하기 때문에 이 책을 일고 분산을 파악했다고 할 수는 없겠지만 MongoDB의 샤딩을 사용할 생각이라면 사전에 알아야 할 지식정도는 알려주고 있습니다.<br><br><span style="color: rgb(204, 153, 0);">Part 2는 MongoDB 팁 & 트릭으로 50가지의 팁을 알려주고 있습니다. 일반적인 레시피 책처럼 각 팁별로 한 두 페이지정도의 간단한 설명으로 되어 있지만 MongoDB를 사용하려고 했을 때 고민해 봤을 만한 내용들이 꽤 있습니다.</span> 예를 들어 정규화 해야하는지 비정규화 해야할지... 문서를 정규화해서 분리할 지 다른 문서내에 내장할 지 등이 기존 RDBMS랑은 달라서 상당히 고민되는데 명확한 답이라고 할 순 없지만 어떤 상황에 어떤 기준으로 고민해 봐야할 지를 알려주기 때문에 유용합니다. 저는 Part 1보다는 Part 2가 훨씬 유용한 것 같습니다.(샤딩은 좀 나중의 얘기라.. ㅎ) MongoDB를 사용할 생각이 있다면 Part 2정도는 한번 파악해 두면 도움이 될 것입니다.<br><br>전체가 150페이지가 약간 넘기 때문에 가볍게 읽어볼 수 있어서 MongoDB에 관심있다면 한번 볼만은 하다고 생각합니다. 그리고 이 책은 1.8을 기준으로 쓴 듯 한데 명확하게 나와있지 않아서 좀 헷갈립니다. 그래서 이 글을 쓰는 시점에 어떤 문제가 있다 등이 있는데 그게 어느 버전인지 모르니 지금도 있는 문제인지 아닌지가 약간 헷갈립니다.(물론 일부는 역자가 어느 버전에 해결되었는지를 명시해 놓기도 했습니다.)<br></div><p><strong><a href="https://blog.outsider.ne.kr/773?commentInput=true#entry773WriteComment">댓글 쓰기</a></strong></p>Redis 설치하기Outsiderhttps://blog.outsider.ne.kr/7632012-03-25T23:22:04+09:002012-03-25T23:22:04+09:00<a href="http://www.redis.io/" target="_blank">Redis</a>는 <span style="color: rgb(204, 153, 0);">오픈소스 NoSQL 중 하나로 Salvatore Sanfilippo(aka <a href="https://twitter.com/antirez" target="_blank">antirez</a>)가 만든 키-밸류 스토어의 성격을 가진 in-memory 데이터베이스입니다.</span> <a href="http://redis.io/topics/faq" target="_blank">Redis의 FAQ</a>를 보면 Redis의 의미가 <span style="color: rgb(204, 153, 0);">REmote DIctionary Server</span>의 약자로 정의하고 있는데 저도 Redis에 대해서는 잘 모르고 다른 걸 사용하기 위해서 설치만 했으므로 Redis에 대한 설명은 생략하고 바로 설치로 넘어갑니다.(사실 블로깅하기에도 해매할 정도로 간단합니다. ㅎ)<br><br><a href="http://redis.io/download" target="_blank">Redis 다운로드페이지</a>에서 Stable 버전을 다운로드 받습니다. 현재 최신 버전은 2.4.9입니다.<br><br><pre class="line-numbers"><code class="language-shell">
$ wget http://redis.googlecode.com/files/redis-2.4.9.tar.gz
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 606k 100 606k 0 0 86792 0 0:00:07 0:00:07 --:--:-- 100k
$ tar -xvzf redis-2.4.9.tar.gz
$ cd redis-2.4.9/
redis-2.4.9 $ make
cd src && make all
</code></pre><br>Redis의 압축을 푼 뒤에 make를 실행해 주면 설치가 완료됩니다.<br><br>서버실행은 <span style="color: rgb(255, 118, 53);">src/redis-server</span>로 합니다.<br><br><pre class="line-numbers"><code class="language-shell">
$ src/redis-server
[12925] 25 Mar 20:06:20 # Warning: no config file specified, using the default config. In order to specify a config file use 'redis-server /path/to/redis.conf'
[12925] 25 Mar 20:06:20 * Server started, Redis version 2.4.9
[12925] 25 Mar 20:06:20 * The server is now ready to accept connections on port 6379
[12925] 25 Mar 20:06:20 - 0 clients connected (0 slaves), 922304 bytes in use
</code></pre><br><span style="color: rgb(204, 153, 0);">Redis는 설정파일로 redis.conf를 사용하는데 다른 redis.conf를 사용하려면 <span style="color: rgb(255, 118, 53);">src/redis-server /path/to/redis.conf</span>와 같이 지정할 수 있고 설정파일 대신에 <span style="color: rgb(255, 118, 53);">--port 포트번호</span>나 <span style="color: rgb(255, 118, 53);">--loglevel debug</span>처럼 옵션을 주어서 실행할 수도 있습니다.</span> 이제 서버가 실행되었습니다. <br><br>Redis는 명령행 클라이언트도 함께 제공하고 있습니다. <span style="color: rgb(255, 118, 53);">src/redis-cli</span>입니다.<br><br><div class="imageblock center" style="text-align: center; clear: both;"><img src="//blog.outsider.ne.kr/attach/1/1291258017.gif" alt="Redis-cli 사용모습" height="259" width="445" /></div><br>위처럼 클라이언트로 사용해 보면 Redis가 정상작동하는 것을 확인할 수 있습니다.<br><p><strong><a href="https://blog.outsider.ne.kr/763?commentInput=true#entry763WriteComment">댓글 쓰기</a></strong></p>