2.X/1. Getting Started

1-10-12. Index Aliases and Zero Downtime

drscg 2017. 9. 30. 16:53

The problem with the reindexing process described previously is that you need to update your application to use the new index name. Index aliases to the rescue!

위에서 언급한 reindex 프로세스의 문제점은, 새로운 index 이름을 사용하기 위해, 응용프로그램을 업데이트해야 한다는 점이다. index alias가 해결책이다.

An index alias is like a shortcut or symbolic link, which can point to one or more indices, and can be used in any API that expects an index name. Aliases give us an enormous amount of flexibility. They allow us to do the following:

index alias 는 shortcut(바로 가기)나 symbolic link와 유사하고, 하나 이상의 indices를 가리킬 수 있고, index 이름을 전달해야 하는 어떤 API에서도 사용할 수 있다. alias는 아래와 같은 엄청난 유연성을 제공한다. 다음과 같은 기능이 있다.

  • Switch transparently between one index and another on a running cluster

    동작하고 있는 cluster내의 어떤 index와 다른 index를 전환한다.

  • Group multiple indices (for example, last_three_months)

    여러 indices를 모은다. 예: last_three_months

  • Create "views" on a subset of the documents in an index

    index에 있는 document의 부분집합인 "views" 를 생성한다.

We will talk more about the other uses for aliases later in the book. For now we will explain how to use them to switch from an old index to a new index with zero downtime.

이 책의 후반부에서, alias의 다른 용도에 대해 더 이야기할 것이다. 지금은, 정지 시간 없이(zero downtime), 기존 index를 새로운 index로 전환하는 방법에 대해 설명할 것이다.

There are two endpoints for managing aliases: _alias for single operations, and _aliases to perform multiple operations atomically.

alias 관리에는 단일 작업을 위한 _alias, 그리고 다수의 작업을 자동으로 수행하기 위한 _aliases 의 두 가지가 있다.

In this scenario, we will assume that your application is talking to an index called my_index. In reality, my_index will be an alias that points to the current real index. We will include a version number in the name of the real index: my_index_v1my_index_v2, and so forth.

이 시나리오에서, my_index 라 불리는 index와 통신하는 응용프로그램을 가정해 보자. 실제 상황에서, my_index 는 현재의 실제 index를 가리키는 alias이다. 실제 index의 이름은 my_index_v1my_index_v2 와 같이, 버전을 포함하고 있다.

To start off, create the index my_index_v1, and set up the alias my_index to point to it:

시작하기 위해, my_index_v1 라는 index를 생성하고, 그것을 가리키는 my_index alias를 설정하자.

PUT /my_index_v1 
PUT /my_index_v1/_alias/my_index 

my_index_v1 라는 index 생성

my_index 라는 alias가 my_index_v1 를 가리키도록 설정

You can check which index the alias points to:

alias가 어떤 index를 가리키는지 확인할 수 있다.

GET /*/_alias/my_index

Or which aliases point to the index:

또는, 어느 alias가 그 index를 가리키는지

GET /my_index_v1/_alias/*

Both of these return the following:

위의 둘 모두 아래와 같이 반환한다.

{
    "my_index_v1" : {
        "aliases" : {
            "my_index" : { }
        }
    }
}

Later, we decide that we want to change the mappings for a field in our index. Of course, we can’t change the existing mapping, so we have to reindex our data. To start, we create my_index_v2 with the new mappings:

나중에, index에 있는 특정 field의 mapping을 변경하기로 결정했다. 물론, 기존의 mapping을 변경할 수 없다. 그래서 데이터를 재색인해야만 한다. 이를 위해, 새로운 mapping을 가진 my_index_v2 를 생성한다.

PUT /my_index_v2
{
    "mappings": {
        "my_type": {
            "properties": {
                "tags": {
                    "type":   "string",
                    "index":  "not_analyzed"
                }
            }
        }
    }
}

Then we reindex our data from my_index_v1 to my_index_v2, following the process described in Reindexing Your Data. Once we are satisfied that our documents have been reindexed correctly, we switch our alias to point to the new index.

그리고 나서, 데이터를 my_index_v1 에서 my_index_v2 로 재색인한다. 이는 Reindexing Your Data에서 언급한 프로세스를 따른다. 재색인 작업이 올바르게 완료되면, alias가 새로운 index를 가리키도록 전환한다.

An alias can point to multiple indices, so we need to remove the alias from the old index at the same time as we add it to the new index. The change needs to be atomic, which means that we must use the _aliases endpoint:

alias는 다수의 indices를 가리킬 수 있다. 따라서, 새로운 index에 alias를 추가하면서, 동시에 기존 index에서 alias를 제거해야 한다. 이 변경은 원자성(atomicity)을 보장해야 한다. 즉, 마지막에 _aliases 를 사용해야 한다.

POST /_aliases
{
    "actions": [
        { "remove": { "index": "my_index_v1", "alias": "my_index" }},
        { "add":    { "index": "my_index_v2", "alias": "my_index" }}
    ]
}

Your application has switched from using the old index to the new index transparently, with zero downtime.

응용프로그램은 기존 index 사용에서, 새로운 index 사용으로, 정지 시간 없이, 확실하게 전환되었다.

Tip

Even when you think that your current index design is perfect, it is likely that you will need to make some change later, when your index is already being used in production.

현재의 index 설계가 완벽하다고 생각할지라도, index가 제품에 이미 사용 중인 경우에, 언젠가는 어떤 변경이 필요할 수 있다.

Be prepared: use aliases instead of indices in your application. Then you will be able to reindex whenever you need to. Aliases are cheap and should be used liberally.

미리 대비하기 위해, 응용프로그램에서는 indices가 아닌 alias를 사용하자. 그러면, 필요할 때 언제라도 재색인할 수 있다. alias는 비용이 적게 소모되고, 자유롭게 사용될 수 있다.


'2.X > 1. Getting Started' 카테고리의 다른 글

1-10-10. Default Mapping  (0) 2017.09.30
1-10-11. Reindexing Your Data  (0) 2017.09.30
1-11. Inside a Shard  (0) 2017.09.30
1-11-1. Making Text Searchable  (0) 2017.09.30
1-11-2. Dynamically Updatable  (0) 2017.09.30