Elasticsearch Cluster 구성하기 (shards, replicas)

Elastic/Elasticsearch 2012. 11. 22. 17:34

많이 부족하지만 일단 스스로 정리하기 위해서.. 올립니다. ^^;

[Reference]

    http://www.elasticsearch.org

    http://www.elasticsearchtutorial.com/elasticsearch-in-5-minutes.html


[URI Command]

    http://10.101.254.223:9200/_status

    http://10.101.254.223:9200/_cluster/state?pretty=true

    http://10.101.254.223:9200/_cluster/nodes?pretty=true

    http://10.101.254.223:9200/_cluster/health?pretty=true


[색인파일 setting 확인]

    http://10.101.254.223:9200/depth1_1/_settings?pretty=true


[색인파일 mapping 확인]

    http://10.101.254.223:9200/depth1_1/_mapping?pretty=true


[색인파일의 URI Step 정의]

    /depth1/

        index 명 (각 서비스 단위의 색인명 or vertical service 명)

        예)

            /blog

            /cafe

    /depth1/depth2/

        index type 명

        예)

            /blog/user

            /blog/post

            /cafe/user

            /cafe/post

    /depth1/depth2/depth3

        색인된 document unique key (id)


[색인파일의 생성, shard, replica 설정]

    http://www.elasticsearch.org/guide/reference/api/admin-indices-create-index.html


    - case 1

        curl -XPUT 'http://10.101.254.221:9200/depth1/'


    - case 2

        curl -XPUT 'http://10.101.254.221:9200/depth1_2/' -d '

        index :

            number_of_shards : 3

            number_of_replicas : 2

        '


    - case 3 : recommended

        curl -XPUT 'http://10.101.254.223:9200/depth1_1/' -d '{

            "settings" : {

                "index" : {

                    "number_of_shards" : 3,

                    "number_of_replicas" : 2

                }

            }

        }'


    - case 4

        curl -XPUT 'http://10.101.254.223:9200/depth1_1/' -d '{

            "settings" : {

                "number_of_shards" : 3,

                "number_of_replicas" : 2

            }

        }'


[색인파일 mapping 설정]

    http://www.elasticsearch.org/guide/reference/mapping/

    http://www.elasticsearch.org/guide/reference/mapping/core-types.html

    ※ 이 영역에서 색인 또는 검색 시 사용할 analyzer 나 tokenizer 를 지정 한다.

    ※ solr 의 경우 schema.xml 에서 정의 하는 설정을 여기서 수행 함.


    curl -XPUT 'http://10.101.254.223:9200/depth1_1/depth2_1/_mapping' -d '

    {

        "depth2_1" : {

            "properties" : {

                "FIELD명" : {"type" : "string", "store" : "yes"}

            }

        }

    }'


[데이터 색인]

    http://www.elasticsearch.org/guide/reference/api/index_.html


    curl -XPUT 'http://10.101.254.223:9200/blog/user/dilbert' -d '{ "name" : "Dilbert Brown" }'


    curl -XPUT 'http://10.101.254.223:9200/blog/post/1' -d '

    {

        "user": "dilbert",

        "postDate": "2011-12-15",

        "body": "Search is hard. Search should be easy." ,

        "title": "On search"

    }'


    curl -XPUT 'http://10.101.254.223:9200/blog/post/2' -d '

    {

        "user": "dilbert",

        "postDate": "2011-12-12",

        "body": "Distribution is hard. Distribution should be easy." ,

        "title": "On distributed search"

    }'


    curl -XPUT 'http://10.101.254.223:9200/blog/post/3' -d '

    {

        "user": "dilbert",

        "postDate": "2011-12-10",

        "body": "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat" ,

        "title": "Lorem ipsum"

    }'


    curl -XPUT 'http://10.101.254.223:9200/blog/post/4' -d '

    {

        "user": "dilbert",

        "postDate": "2011-12-11",

        "body": "한글 형태소 분석기 테스트와 shard 그리고 replica 테스트" ,

        "title": "elastic search 분산설정"

    }'


    curl -XGET 'http://10.101.254.223:9200/blog/user/dilbert?pretty=true'

    curl -XGET 'http://10.101.254.221:9200/blog/post/1?pretty=true'

    curl -XGET 'http://10.101.254.223:9200/blog/post/2?pretty=true'

    curl -XGET 'http://10.101.254.221:9200/blog/post/3?pretty=true'


[검색테스트]

    http://www.elasticsearch.org/guide/reference/api/search/uri-request.html

    - user에 dilbert 가 포함되어 있는 것

    curl 'http://10.101.254.221:9200/blog/post/_search?q=user:dilbert&pretty=true'

    http://10.101.254.223:9200/blog/post/_search?q=user:dilbert&pretty=true


    - title 에 search 가 포함 안된 것

    curl 'http://10.101.254.223:9200/blog/post/_search?q=-title:search&pretty=true'

    http://10.101.254.223:9200/blog/post/_search?q=-title:search&pretty=true


    - title 에 search 는 있고 distributed 는 없는 것

    curl 'http://10.101.254.223:9200/blog/post/_search?q=+title:search%20-title:distributed&pretty=true&fields=title'

    http://10.101.254.223:9200/blog/post/_search?q=+title:search%20-title:distributed&pretty=true&fields=title


    - range 검색

    curl -XGET 'http://10.101.254.223:9200/blog/_search?pretty=true' -d '

    {

        "query" : {

            "range" : {

                "postDate" : { "from" : "2011-12-10", "to" : "2011-12-12" }

            }

        }

    }'


    - blog 라는 색인 파일 전체 검색

        http://10.101.254.223:9200/blog/_search?q=user:dilbert&pretty=true

        http://10.101.254.223:9200/blog/_search?q=name:dilbert&pretty=true


    - routing 검색 (정확한 의미 파악이 어려움)

        http://10.101.254.223:9200/blog/_search?routing=dilbert?prettry=true


[Clustering 설정 정보]

    ※ 서버1

        cluster.name: cluster_es1

        node.name: node_es1

        node.master: true

        node.data: true

        node.rack: rack_es1

        index.number_of_shards: 3

        index.number_of_replicas: 2

        network.host: 10.101.254.223

        transport.tcp.port: 9300

        http.port: 9200

        gateway.type: local

        gateway.recover_after_nodes: 1

        gateway.recover_after_time: 5m

        gateway.expected_nodes: 2

        cluster.routing.allocation.node_initial_primaries_recoveries: 4

        cluster.routing.allocation.node_concurrent_recoveries: 2

        indices.recovery.max_size_per_sec: 0

        indices.recovery.concurrent_streams: 5

        discovery.zen.minimum_master_nodes: 1

        discovery.zen.ping.timeout: 3s

        discovery.zen.ping.unicast.hosts: ["10.101.254.223:9300", "10.101.254.221:9300"]

        cluster.routing.allocation.allow_rebalance: "indices_all_active"

        indices.recovery.concurrent_streams: 3

        action.auto_create_index: true

        index.mapper.dynamic: true


    ※ 서버2

        cluster.name: cluster_es1

        node.name: node_es2

        node.master: true

        node.data: true

        node.rack: rack_es1

        index.number_of_shards: 3

        index.number_of_replicas: 2

        network.host: 10.101.254.221

        transport.tcp.port: 9300

        http.port: 9200

        gateway.type: local

        gateway.recover_after_nodes: 1

        gateway.recover_after_time: 5m

        gateway.expected_nodes: 2

        cluster.routing.allocation.node_initial_primaries_recoveries: 4

        cluster.routing.allocation.node_concurrent_recoveries: 2

        indices.recovery.max_size_per_sec: 0

        indices.recovery.concurrent_streams: 5

        discovery.zen.minimum_master_nodes: 1

        discovery.zen.ping.timeout: 3s

        discovery.zen.ping.unicast.hosts: ["10.101.254.223:9300", "10.101.254.221:9300"]

        cluster.routing.allocation.allow_rebalance: "indices_all_active"

        indices.recovery.concurrent_streams: 3

        action.auto_create_index: true

        index.mapper.dynamic: true


[설정파일의미]

    ※ 클러스터링할 그룹명 (묶고자 하는 서버들에 elasticsearch.yml 파일에서 이름을 동일하게 주면 클러스터링 됨)

        cluster.name: group1


    ※ 검색 및 색인 서버로 사용하고자 할 경우 설정

        node.master: true

        node.data : true


    ※ 검색 전용 서버로 사용하고자 할 경우 설정 (검색 로드발라서)

        node.master: false

        node.data : false


    ※ 색인 전용 서버로 사용하고자 할 경우 설정

        node.master: false

        node.data : true


    ※ 이건 용도를 잘 모르겠음

        node.master: true

        node.data : false


    ※ 색인 파일(데이터) 사이즈가 작을 경우 수치를 작게 (1), 사이즈가 클 경우 수치를 크게 (기본 5)

    ※ 하나의 색인 파일을 몇 개로 나눠서 저장할 것인지 정의

        index.number_of_shards: 5


    ※ 색인 파일에 대한 복사본 생성 수치 (기본 1)

        index.number_of_replicas: 1


    ※ 설정 후 서버간 클러스터링 되는 과정을 파악하기 어려움

        두 대의 서버에 cluster.name 을 같게 해서 실행 시켜면 자동으로 clustering 됨


    ※ 서버 한대에서 여러개의 elasticsearch instacne 실행 방법

        ./elasticsearch -p pidfile1 -Des.config=elasticsearch/config/elasticsearch1.yml

        ./elasticsearch -p pidfile2 -Des.config=elasticsearch/config/elasticsearch2.yml


        ※ 기타 옵션

        -Xmx1g -Xms1g -Des.max-open-files=true


    ※ node 의 의미

        elasticsearch 에서 node == index 에 의미를 가짐

: