'분류 전체보기'에 해당되는 글 648건

  1. 2015/04/21 용비 03. Installation
  2. 2015/04/21 용비 02. Basic Concepts
  3. 2015/04/21 용비 01. Getting Started
  4. 2015/04/20 용비 04. Serving Static Content
  5. 2015/04/20 용비 몰라도 돼!

Elasticsearch java 7 필요로 한다. 특히 이글을 쓰는 시점에서, Oracle J 1.8.0_25 버전을 사용할 것을 추천한다. Java 설치는 platform 따라 다르다. 따라서 여기서 Java 설치에 대해서 깊이 들어가지는 않을 것이다.

여러분이 elasticsearch 설치하기 전에 java version 체크하라는 것을 말하는 것으로 충분하다. (필요하다면 java 설치하거나 업그레이드 하라)


java -version

echo $JAVA_HOME


Java 셋업하고 나서, elasticsearch 다운로드하고 실행한다. www.elasticsearch.org/download 에서 과거에 릴리즈된 모든 버전의 바이너리를 이용할 있다. 릴리즈별로 zip/tar 압축 파일을 선택하거나 DEB/RPM package 선택할 있다. 간단하게 말하자면, 그냥 tar 파일을 사용하자.


Elasticsearch 1.5.1 tar 파일을 다음과 같이 다운로드 하자. (윈도우 사용자는 zip package 다운로드 해야 한다.)


curl -L -O https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.5.1.tar.gz


그리고 다음과 같이 압축을 푼다. (윈도우 사용자는 zip package unzip 해야 한다.)


tar -xvf elasticsearch-1.5.1.tar.gz


현재 directory 뭉텡이의 file/folder들을 생성할 것이다. 다음과 같이 bin directory 이동하자.


cd elasticsearch-1.5.1/bin


이제 여러분은 지금 node에서 단일 cluster 실행할 준비가 되었다. (윈도우 사용자는 elasticsearch.bat 파일을 실행하라)


./elasticsearch


모든 것이 제대로 되었다면, 아래와 같은 메시지들을 확인할 있을 것이다.


./elasticsearch
[2014-03-13 13:42:17,218][INFO ][node           ] [New Goblin] version[1.5.1], pid[2085], build[5c03844/2014-02-25T15:52:53Z]
[2014-03-13 13:42:17,219][INFO ][node           ] [New Goblin] initializing ...
[2014-03-13 13:42:17,223][INFO ][plugins        ] [New Goblin] loaded [], sites []
[2014-03-13 13:42:19,831][INFO ][node           ] [New Goblin] initialized
[2014-03-13 13:42:19,832][INFO ][node           ] [New Goblin] starting ...
[2014-03-13 13:42:19,958][INFO ][transport      ] [New Goblin] bound_address {inet[/0:0:0:0:0:0:0:0:9300]}, publish_address {inet[/192.168.8.112:9300]}
[2014-03-13 13:42:23,030][INFO ][cluster.service] [New Goblin] new_master [New Goblin][rWMtGj3dQouz2r6ZFL9v4g][mwubuntu1][inet[/192.168.8.112:9300]], reason: zen-disco-join (elected_as_master)
[2014-03-13 13:42:23,100][INFO ][discovery      ] [New Goblin] elasticsearch/rWMtGj3dQouz2r6ZFL9v4g
[2014-03-13 13:42:23,125][INFO ][http           ] [New Goblin] bound_address {inet[/0:0:0:0:0:0:0:0:9200]}, publish_address {inet[/192.168.8.112:9200]}
[2014-03-13 13:42:23,629][INFO ][gateway        ] [New Goblin] recovered [1] indices into cluster_state
[2014-03-13 13:42:23,630][INFO ][node           ] [New Goblin] started


너무 상세히 들어가지 말고, "New Goblin"이라고 이름 붙여진 node name 있을 것이다. 단일 cluster에서 master로서 선출되고 실행된 node이다. 지금 순간에 master 무엇을 의미하는지에 대해서 걱정하지 말라. 여기서 중요한 것은 하나의 cluster에서 하나의 node 실행했다는 것이다.


이전에 언급한 것처럼, cluster node name override (재정의) 있다. Command line에서 elasticsearch 실행할 다음과 같이 있다.


./elasticsearch --cluster.name my_cluster_name --node.name my_node_name


또한 HTTP 주소와 포트에 대한 정보를 가진 http mark 라인이 접속 가능한 주소임을 주목하라. 기본적으로 elasticsearch 9200 포트 번호를 사용하여 REST API 접근할 있다. 필요할 , 포트 번호는 설정할 있다.

받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/687

Elasticsearch 핵심적인 몇가지 concept(개념) 있다. 처음부터 이러한 concept 이해하는 것이 elasticsearch 대해서 배우는 과정 중에서 굉장히 도움이 것이다.


[Near Realtime (NRT)]

Elasticsearch near realtime 검색 플랫폼이다. 이것이 의미하는 바는 여러분이 document index하는 시점으로부터 검색 결과를 얻기까지 약간의 지연 현상(일반적으로 1) 있음을 의미한다.


[Cluster]

Cluster 여러분의 전체 데이터를 담고 있는 하나 이상의 node(server) 모음을 말한다. 그리고 Cluster 모든 node 있는 federated indexing ( node 개별적으로 존재하는 index들의 연합) 검색 기능을 제공한다. Cluster 기본적으로 "elasticsearch"라는 유일한 이름으로 구분된다. 하나의 node 한번 cluster join하도록 셋팅되면 다른 곳에 참여할 없기 때문에 cluster 이름이 중요하다. Prodoction에서는 명시적으로 cluster name 설정하는 것이 좋다. 하지만, testing/development 목적으로는 default name 사용하는 것이 유용하다.


하나의 node만으로 cluster 구성하는 것도 유효하고 완벽하게 동작한다는 것에 유념하라. 더욱이, 유일한 cluster name 가지는 독립적인 여러 cluster 구성하는 것도 가능하다.


[Node]

Node cluster 일부분이고, 데이터를 저장하고, cluster index 검색 기능에 참여하는 하나의 서버이다. Cluster 같이 node 유일한 이름을 갖는다. 기본적으로는 시작 시점에 node 할당되는 임의의 Marvel character명을 갖는다. 기본적으로 부여되는 node명을 원하지 않으면 여러분이 원하는 어떤 이름으로도 node명을 정할 있다. 이름은 네트워크에 있는 어느 서버가 여러분의 elasticsearch cluster 있는 node인지 구분하기 위한 관리하는데 사용되므로 중요하다.


Node cluster name으로 특정 cluser join하도록 설정할 있다. 기본적으로 개별 node elasticsearch라는 이름의 cluster join하도록 셋팅한다. 이것은 여러분이 네트워크 상에 많은 node 실행한다면 - 서로 discover 가능하다고 가정하면 - 자동으로 elasticsearch라고 이름 붙여진 cluster join하여 cluster 구성함을 의미한다.


여러분은 많은 node 하나의 cluster 구성할 있다. 나아가, 네트워크 상에 현재 구동되어 있는 Elasticsearch ndoe 없다면, 하나의 node 실행하여 elasticsearch 이름붙여진 새로운 단일 node cluster 기본적으로 구성할 수도 있다.


[Index]

Index 유사한 특징들을 가진 document들의 집합이다. 예를 들어, customer data 대한 index, 제품 카탈로그에 대한 다른 index, order(주문) 대한 다른 index 가질 있다. Index name (소문자여야만 한다.)으로 구분되고, 이름은 document 대한 indexing, search, update, delete 작업을 수행하기 위해 index 참조하는데 사용한다.


하나의 cluster에서 여러분이 원하는 대로 여러 개의 index 정의할 있다.


[Type]

Index내에서 하나 이상의 type 정의할 있다. Type 논리적인 index category/partition이다. 일반적으로, type common field 가진 document 대해 정의되어 있다. 예를 들어, 여러분이 blogging platform 운영하고 여러분의 모든 data 하나의 index 저장한다고 가정해 보자. index에는 user data, blog data, comments data 등에 대한 type 정의되어 있을 것이다.


[Document]

Document index되는 정보의 기본 단위이다. 예를 들어, 단일 고객에 대한 document, 단일 상품에 대한 document, 단일 주문에 대한 document등을 가질 있다. 이러한 document 인터넷상에서 데이터 형식으로 폭넓게 사용되는 JSON으로 표시된다. (Javascript Object Notation)


여러분은 Index/type내에 여러분이 저장하고자 하는 많은 document 저장할 있다. Document 물리적으로는 index내에 있다고 할지라도, document 실제로 index내에서 Type으로 index되고 지정되어야만 한다는 것에 유의하라.


[Shards & Replicas]

Index 잠재적으로 하나의 node에서 하드웨어 limit 넘어서는 대용량의 데이터를 저장할 있다예를 들어서 1TB disk space 차지하는 10억개의 document 대한 하나의 index 하나의 node 있는 disk에는 맞지 않거나 single node만으로 검색 요청을 수용하기에는 너무 느릴 것이다.


문제를 해결하기 위해서, elasticsearch 여러분의 index shard라고 부르는 여러 개의 조각으로 세분화할 있도록 한다. 여러분이 index 생성할 , 여러분이 원하는 shard 수를 간단히 지정할 있다. shard cluster 있는 어떤 node에서도 host 있는 fully-functional and independent "index" 자체이다.


Sharding 2가지 주요 이유 때문에 중요하다.

  • Content Volume 수평적 확장 가능
  • 성능과 Throughput 향상을 위해 (여러 node 분산되어 있는) shard 분산/병렬 처리 가능

Shard 어떻게 분산되어 있는지, document들이 search request로부터 어떻게 수집되는지에 대한 메커니즘은 elasticsearch 의해 완벽하게 관리된다. 그리고 여러분은 user로서 알기 쉽다.


언제라도 실패할 있는 네트워크나 클라우드 환경에서, 무슨 이유에서건 shard node offline 되거나 사라지는 경우에 대한 failover 메커니즘을 가지는 것이 강력하게 추천되는 유용한 기능이다. 이러한 목적으로 elasticsearch (replica shard 혹은 짧게 replicas라고 부르는) index shard 대한 하나 이상의 복사본을 가질 있다.


Replication 2가지 이유 때문에 중요하다.

  • Shard/node fail, high availability 제공한다. 이런 이유로, replica shard 절대로 원본 (original/primary) shard 동일한 node 할당되면 된다.
  • Search volume 대한 scale out 제공하고, 모든 replica에서 병렬적으로 검색을 실행할 있기 때문에 throughput 향상된다.

요약하자면, index 여러 개의 shard 나누어질 있다. Index 0(replicas 없는 경우) 이상 복제될 있다. 한번 복제되면, index primary shard(원본) replica shards를 갖는다. Shards와 replicas의 개수는 index 생성될 , index별로 정의될 있다. Index 생성된 이후에는 어느 때라도 동적으로 replicas 수를 변경할 있지만, 사후에 shard 숫자를 변경할 수는 없다. (동적으로 replicas 수를 변경할 수는 있지만 shard 숫자는 변경할 없다.)


기본적으로, elasticsearch내의 index 5개의 primary shard 1개의 replica 할당한다. 이것은 여러분이 cluster내에 최소한 2개의 node 가지고 있다면, 여러분의 index 5개의 primary shard 5개의 replica shard (1개의 replica set) 가진다는 의미이다. 인덱스당 10개의 shard 갖는다.


{Note}

elasticsearch shard Lucene index이다. 하나의 Lucene Index 저장할 있는 Max Document 수가 있다. Limit Integer.MAX_VALUE -128 해당하는 2,147,483,519개이다. _cat/shards API 통해서 shard size 모니터링할 있다.

받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/686

[여기에 번역된 내용은 http://www.elastic.co/guide/en/elasticsearch/reference/current/index.html 에 있는 Elastic Search Documentation을 번역한 것이다. 원문 내용을 살펴보려면 위의 홈페이지를 방문하기 바란다.]


Elasticsearch full-text 검색과 분석을 위한 엔진으로써, 확장성이 뛰어난 오픈 소스이다. Elasticsearch 이용해 거대한 데이터를 빠르게, 거의 실시간으로 저장(store), 검색(search), 분석(analyze) 있다. 일반적으로 elasticsearch 복잡한 검색 기능이나 요구사항을 가진 application에서 핵심 엔진이나 기술로 사용된다.


Elasticsearch 사용하는 몇가지 use-case 예제가 있다.


  • 여러분은 여러분이 팔고자 하는 상품에 대해서 고객들이 검색할 있는 기능을 가진 online web store 운영 중이다. 경우에, 전체 제품 카탈로그를 저장하는데 elasticsearch 사용하여 고객들에게 검색과 자동완성 기능을 제공할 있다.
  • 로그나 트랜잭션 데이터를 수집하거나 데이터를 분석하고, 트렌트, 통계, 요약, 변칙성을 살펴보기 위해 정리하고자 때가 있다. 경우, 데이터 수집, 취합, 파싱하는데 logstash 사용할 있다. (ELK Stack 일부분이다.) logstash 데이터를 elasticsearch 밀어 넣는다. 일단 elasticsearch 있는 데이터는 관심 있는 어떤 분야의 정보라도 검색하고 정리하여 취합할 있다.
  • 여러분은 가격에 물건을 사고자 하는 고객이 "나는 특정 전자 장치를 사고 싶어. 다음 안에 X달러 아래로 값이 떨어지면 어떤 회사의 제품이라도 나에게 알려줬으면 좋겠어"라는 룰을 등록한 가격 알림 플랫폼 (price alerting platform) 운영 중이다. 이러한 겨우에 여러분은 vendor 가격을 스크랩하여 elasticsearch 넣고, 고객이 쿼리하는 것과는 반대로 가격의 이동에 매치되는 reverse-search (Percolator) 기능을 사용할 있다. 매칭 결과가 발견되면 고객에게 alert push 있다.
  • 여러분은 analytics/business-intelligence 요구 사항이 있어서 많은 데이터(수백만 ~ 수십억 건의 레코드) 빠르게 검사하고, 분석하여, 보여주고, 즉시 의문 사항을 질의하고 싶어할 수도 있다. 이런 경우에, 데이터를 저장하기 위해서 elasticsearch 사용할 있다. 그리고 Kibana(ELK Stack 일부분) 사용하여 custom dashboard 생성하고 데이터를 여러분에게 중요한 측면에서 보여줄 있다. 추가적으로, 데이터에 대한 복잡한 business intelligence query 수행하기 위해 elasticsearch aggregation 기능을 이용할 수도 있다.

tutorial 나머지 부분에서 elasticsearch 시작, 실행 과정을 통해 elasticsearch 내부를 엿보고 데이터 indexing, searching, modifying 같은 기본적인 operation 수행하는 것을 가이드할 것이다. tutorial 마지막 부분에서는 elasticsearch 무엇인지, 어떻게 동작하는지에 대한 훌륭한 아이디어를 가질 있을 것이다. 그리고 바라건데, 어떻게 elasticsearch 사용하여 검색 application 만들거나 intelligence 요건에 맞도록 데이터를 정리할 있는지에 대한 영감을 얻기를 바란다.

받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/685

서버의 주요한 기능은 이미지나 HTML 파일과 같은 파일들을 제공하는 것이다. 여러분은 서로 다른 디렉토리(HTML 파일들이 있는 /data/www 디렉토리와 이미지를 포함하고 있는 /data/images 디렉토리) 있는 파일들을 서로 다른 요청에 의해서 제공하는 예제를 구현할 있다. 그렇게 하기 위해서는 configuration 파일을 수정하여 http block내에 있는 server block 2개의 location block 설정하면 된다.


먼저, /data/www 디렉토리를 생성하고 임의의 텍스트를 가진 index.html 파일을 저장하자. 그리고 /data/images 디렉토리를 생성하고, 임의의 이미지 파일을 위치시킨다.

다음으로 nginx configuration file open하면 이미 기본적으로 server block 여러 예제들이 포함되어 있다. (대부분 코멘트로 막혀 있다.) 이제 모두 코멘트로 막고, 새로운 server block 추가해 보자.


http {

server {

}

}


일반적으로, configuration file 요청을 받을 서로 다른 port server name으로 구분된 여러 server block 가질 있다. Nginx에서 request 처리할 server 결정하고, server block내에 정의된 location 지시어(directive) 파라미터와는 반대로 Request header 특화된 URI를 테스트한다.


Server block내에 다음 location block 추가한다.


location / {

root /data/www;

}


location block prefix "/" 시작하는 request URI 특화되어 있다. URI root directive 특화된 path 추가될 것이다. 따라서, 로컬 파일 시스템상의 요청된 파일은 /data/www 있다. 만약 여러 개의 매칭되는 location block 있다면, nginx 가장 prefix 선택한다. 위에서 제공된 location block 가장 짧은 prefix이다. 따라서, 모든 request에는 location block 사용된다.


다음으로, 두번째 location block 추가해 보자.


location /images/ {

root /data;

}


이것은 /images/ 시작하는 request 매칭될 것이다. (location / 역시 매칭되기는 하지만, 짧은 prefix이다.)

결과적으로 server block configuration 다음과 같다.


http {

server {

location / {

root /data/www;

}


location /images/ {

root /data;

}


}

}



이것은 이미 표준 포트 80으로 요청을 받는 동작하고 있는 server 설정이다. 따라서, localhost 접속할 있다. /images/ 시작하는 URI 요청에 대한 응답에서 server는 /data/images 디렉토리에 있는 이미지 파일을 보낼 것이다. 예를 들어, http://localhost/images/example.png 요청하면 nginx /data/images/example.png 파일을 리턴할 것이다. 만약 그런 파일이 없다면, nginx 404 error 리턴할 것이다. /images/ 시작하지 않는 request URI 대해서는 /data/www directory 맵핑된다. 예를 들어, http://localhost/some/example.html 요청에 대해서 nginx /data/www/some/example.html 파일을 리턴할 것이다.


새로운 configuration 적용하기 위해서는 아직 nginx 시작되지 않았으면 nginx start하고, 이미 nginx 시작했다면, master process reload signal 보낸다. 실행 command 다음과 같다.


nginx -s reload


기대한 대로 동작을 하지 않는 경우에는 access.log error.log에서 이유를 찾아볼 있다. 로그 파일들은 /usr/local/nginx/logs /var/log/nginx에서 찾아볼 있다.

받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/684

몰라도 돼!

Diaries/육아일기 2015/04/20 08:33 용비
며칠 전의 일이다.

요즘 딸 예린이가 심상치 않다. 사춘기인가?
사건의 발단은 이렇다.

우리 딸은 자기 방에서 혼자 자겠다고 해서 이불을 새로 사줬더니 얼마 못가서 다시 안방에 찾아왔다. 이유는, 혼자 잠을 자려고 하니 무섭고 잠이 안 온다는 것이다. 그래서 요즘 내 옆에서 내 손을 꼭 잡고 잠을 잔다. 엄마 옆도 아니고..ㅠ.ㅠ

그 날도 언제나처럼 잠을 자기 위해서 안방에 이부자리를 펴고 누웠다. 그런데 아뿔싸! 자리를 잘못 잡았다. 평소에는 아내와 나 사이에 예린이가 누워 자는데, 그 날에는 아무 생각없이 예린이를 한쪽 구석으로 몰고 아내와 내가 나란히 누웠다. 평소처럼 예린이 손을 잡으려고 하는데 예린이 손이 항상 있던 자리에 없었다.

왠일인지 돌아보니 예린이가 한쪽 구석에서 등을 돌리고 못본체하고 있는 것이 아닌가? 순간 난감했지만, 즉시 수습에 들어갔다.

"우리 딸. 아빠 손!"
"싫어. 아빠는 엄마랑 자!" (응? 그거야 당연하지. 근데 왜 이런 일로 니가 삐지는 건데?)
"아니야, 예린이가 엄마랑 아빠 사이에서 자야지. 자 이리와, 아빠가 옮겨줄께. 그런데 우리 딸 손이 어디갔지?"
"몰라도 돼!"

이렇게 이야기가 시작되었다.
이야기가 조금 더 진전되었다.

"우리 딸. 냄새 나네. 우리 딸 방귀 냄새인가?"
원래는 "아니, 나 아니야" 이렇게 얘기했어야 했는데,
그때부터 우리 딸, 모든 대답이 "몰라도 돼!"였다.

"아빠랑 엄마가 옆에서 자는데 왜 우리 딸이 삐졌지?"
"몰라도 돼!"
"그럼 니가 가운데 올래?"
"몰라도 돼!"

졸립기도 하고, 달래는 데 지치기도 해서 마지막으로 물었다.
"우리 딸, 이름이 뭐였더라?"
"몰라도 돼!"

그때부터 나의 폭주(?)가 시작되었다.
"오, 그래? 야, 몰라도 돼! 이제 자자."
"몰라도 돼! 아빠 손잡아줘!"
"야, 몰라도 돼! 너 자꾸 그러면 아빠가 또 육아일기에 올린다!"
"...."

결국 예린이 울었다. 그것도 서럽게. 한밤중에 애 울렸다고 마누라한테도 혼나고..-.-
그런데 결국 왜 아빠랑 엄마가 나란히 누워 자는데 삐졌는지 대답을 못 들었다.

얘가 벌써 사춘기인가...
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/683