ํ์ฌ์์ AWS Elasticsearch๋ฅผ ์ด์ฉํ์ฌ ์์ฉ์๋น์ค์ ๋ก๊ทธ๋ฅผ ๊ธฐ๋กํ๊ณ ์๋๋ฐ ๊ทธ ์ฉ๋์ด ์ข ๋ง์ 10TB์ฉ๋์ผ๋ก 1๋ฌ ์ ๋๋ฐ์ ๋ฒํฐ๊ณ ์์ง ๋ชปํด ์ด๋ฐ ์ ๋ฐ ๋ฆฌ์์น๋ฅผ ์ข ํ๋ค๊ฐ ํด๋น ๋ฐ์ดํฐ๋ฅผ S3๋ก ๋ฐฑ์ ํด๋ณด๊ธฐ๋ก ํ์๊ณ ๊ทธ ๊ณผ์ ์ ๊ธฐ๋กํด๋ณธ๋ค.
์ฐธ๊ณ ๋ก AWS SDK๋ 1.11.483 ์ฌ์ฉ์ค์ด๋ฉฐ, role ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉํ๊ณ ์์ด access_key, secret_key๋ฑ์ ์ฌ์ฉํ์ง ์๋๋ค.
์ฐ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํด์ฃผ์๋ค.
// ES snapshot S3 ์ ์ฅ์ ์ํ ๋ํ๋์ ์ถ๊ฐ
compile 'org.elasticsearch:elasticsearch:7.1.1'
compile 'org.elasticsearch.client:elasticsearch-rest-high-level-client:7.1.1'
1. ์ค๋ ์ท ๋ฆฌํฌ์งํ ๋ฆฌ ๋ฑ๋ก
a. Kibana์์ ์ง์ ๋ฑ๋ก
PUT _snapshot/my-snapshot-repo
{
"type": "s3",
"settings": {
"bucket": "๋ฒํท๋ช
, ์์ ์์๋ my-bucket ์ฌ์ฉ",
"base_path": "/๋ก ์์ํ์ง ์๋ ํด๋๊ฒฝ๋ก, ๋ฒํท ๋ด ํด๋ ๊ฒฝ๋ก์, ์์ ์์๋ base/path/to/save/backup/data ์ฌ์ฉ",
"readonly" : "true",
"region": "us-west-1",
"role_arn": "arn:aws:iam::4234:my-role",
"compress" : "true"
}
}
๋ง์ฝ ์ ๋ช ๋ น์ด ์คํ์ ์๋์ ๊ฐ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค๋ฉด role ์ค์ ์ ์ถ๊ฐํด์ผํ ์ฌํญ์ด ์๋๋ฐ, ํด๋น ํฌ์คํธ ์ตํ๋จ์ ์ฐธ๊ณ ๋ฌธํ๋ค์ ์ฝ์ด๋ณด๋ฉฐ ํด๊ฒฐํด๋ณด์๊ธธ ๋ฐ๋๋ค.
{
"Message": "User: anonymous is not authorized to perform: iam:PassRole on resource: arn:aws:iam::4234:my-role"
}
๋๋ ์๋ ์ค๋ช ํ Java ์ฝ๋๋ฅผ ์ด์ฉํ์ฌ ๋ฑ๋กํ๋ค.
b. Java ์ฝ๋ (1๊ณผ ๋์ผํ ๋ด์ฉ์ ์๋ฐ์ฝ๋๋ก ์์ฑํ ๊ฒ์ด๋ค)
import com.amazonaws.auth.AWS4Signer;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.entity.ContentType;
import org.apache.http.nio.entity.NStringEntity;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.client.*;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import javax.ws.rs.HttpMethod;
import java.io.IOException;
@Slf4j
@ActiveProfiles("${SPRING_PROFILES_ACTIVE:local}")
@RunWith(SpringRunner.class)
@SpringBootTest
public class AWSESSnapshotTest {
private String region = "us-west-1";
private static String serviceName = "es";
private static String aesEndpoint = "VPC Endpoint๋ฅผ ๋ฃ์ด์ฃผ์ธ์";
private static String snapshotRepository = "/_snapshot/๋ฆฌํฌ์งํ ๋ฆฌ๋ช
์ ์จ์ฃผ์ธ์";
private static String snapshotSettings = "{ \"type\": \"s3\", \"settings\": { \"bucket\": \"๋ฒํท๋ช
์ ์จ์ฃผ์ธ์\", \"region\": \"๋ฆฌ์ ์ ๋ช
์ํด์ฃผ์ธ์, ์: us-west-1\", \"base_path\": \"์ค๋
์ท์ ์ ์ฅํ ๋ฒํท๋ด ํด๋ ๊ฒฝ๋ก\", "compress":"true", "readonly":"true", \"role_arn\": \"IAM Role์ ์ ์ด์ฃผ์ธ์\" } }";
private static final AWSCredentialsProvider credentialsProvider = new DefaultAWSCredentialsProviderChain();
@Test
public void AWS_ES_์๋์ค๋
์ท_๋ฆฌํฌ์งํ ๋ฆฌ_๋ฑ๋ก() throws IOException {
RestClient esClient = esClient(serviceName, region);
// Register a snapshot repository
HttpEntity entity = new NStringEntity(snapshotSettings, ContentType.APPLICATION_JSON);
Request request = new Request(HttpMethod.PUT, snapshotRepository);
request.setEntity(entity);
// request.addParameter(name, value); // optional parameters
Response response = esClient.performRequest(request);
System.out.println(response.toString());
}
// Adds the interceptor to the ES REST client
public static RestHighLevelClient esClient2(String serviceName, String region) {
AWS4Signer signer = new AWS4Signer();
signer.setServiceName(serviceName);
signer.setRegionName(region);
// java.lang.NoClassDefFoundError: org/elasticsearch/common/xcontent/DeprecationHandler
HttpRequestInterceptor interceptor = new AWSRequestSigningApacheInterceptor(serviceName, signer, credentialsProvider);
return new RestHighLevelClient(RestClient.builder(HttpHost.create(aesEndpoint)).setHttpClientConfigCallback(hacb -> hacb.addInterceptorLast(interceptor)));
}
}
์๋ฐ์ฝ๋๊ฐ ์ ์์ ์ผ๋ก ์คํ๋๋ฉด ES์์ ์๋ ๋ช ๋ น์ด๋ก ์ค์ ์ด ์ ์์ฑ๋์๋์ง ํ์ธํด๋ณด์.
GET _snapshot
"my-repo" : {
"type" : "s3",
"settings" : {
"bucket" : "my-bucket",
"base_path" : "base/path/to/save/backup/data",
"readonly" : "false",
"region" : "us-west-1",
"role_arn" : "arn:aws:iam::4234:my-role",
"compress" : "true"
}
}
์ด๋ ๊ฒ ์ ๋์๋ค๋ฉด ์ด์ ์ธ๋ฑ์ค ๋ฐฑ์ ์ผ๋ก ๋์ด๊ฐ์.
2. ES ์ธ๋ฑ์ค๋ฅผ S3๋ก ๋ฐฑ์
ES ์ธ๋ฑ์ค๋ฅผ S3๋ก ๋ฐฑ์ ํ ๋๋ ์๋์ ๊ฐ์ด ํ ์ ์๋ค.
public void AWS_ES_์๋์ค๋
์ท_S3_์ ์ฅ() throws IOException {
RestClient esClient = esClient(serviceName, region);
// Save indexes into S3 repository
String takeSnapShot = "{\n \"indices\": \"index-2020-04-*\",\n \"ignore_unavailable\": true,\n \"include_global_state\": false\n}";
HttpEntity entity = new NStringEntity(takeSnapShot, ContentType.APPLICATION_JSON);
Request request = new Request(HttpMethod.PUT, snapshotRepository + "/snapshot-test-2020-04");
request.setEntity(entity);
Response response = esClient.performRequest(request);
System.out.println(response.toString());
}
์ถ๋ ฅ๊ฒฐ๊ณผ :
Response{requestLine=PUT /_snapshot/my-repo/snapshot-test-2020-04 HTTP/1.1, host=${VPC Endpoint}, response=HTTP/1.1 200 OK}
์ ์ฝ๋๋ ์ธ๋ฑ์ค๋ช ์ด "index-2020-04-"๋ก ์์ํ๋ ๋ชจ๋ ์ธ๋ฑ์ค๋ฅผ "snapshot-test-2020-04"๋ผ๋ ์ด๋ฆ์ ์ค๋ ์ท์ผ๋ก S3์ ์ ์ฅํ๊ณ ์๋ค.
๊ทธ๋ฐ๋ฐ ์ค์ ๋ก S3์ ํด๋น ๋ฆฌํฌ์งํ ๋ฆฌ๋ก ๊ฐ์ ํ์ธํด๋ณด๋ฉด indices ๋ํ ํ ๋ฆฌ๊ฐ ์์ฑ๋์ด์๊ณ , ๊ทธ ์์๋ ๋ฐฑ์ ํ๋ คํ๋ ์ธ๋ฑ์ค์ ๊ฐ์๋งํผ uuid๊ฐ์ ์ด๋ฆ์ ๋๋ ํ ๋ฆฌ๊ฐ ์์ฑ๋์ด ์๊ณ ๊ทธ ๋๋ ํ ๋ฆฌ ์์๋ ๋ uuid๊ฐ์ ์ด๋ฆ์ ํ์ผ๋ค์ด ์๋ฉ ์์ฑ๋์ด์๋ ๊ฒ์ ํ์ธ ํ ์ ์์๋ค. ๋ฐ๋ผ์ S3 ํ์ผ๋ช ๋ง ๋ณด๊ณ ์๋ ์ด๊ฒ ์ด๋ ์ค๋ ์ท์ ๋ํ ๋ฐ์ดํฐํ์ผ์ธ์ง ์ ์๊ฐ ์๋ค ์๋ ใ ใ ์ถํ S3์์ ํด๋น ์ค๋ ์ท์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๊ณ ์ถ์ด๋ ์ฌ๊ธฐ์(S3์์) ํ์ผ๋ช ๋ง ๋ณด๊ณ ๋ ์ฒ๋ฆฌํ ์๊ฐ ์๋ค๋ ๋ป์ด๋ค.
์ฐ์ ๋ฐฑ์ ๋ ์๋ ์ค๋ ์ท์ ๋ค์ ES๋ก ๋ณต์ํด์ ์ ์กฐํํด์ฌ ์ ์๋์ง๋ถํฐ ํ์ธํด๋ณด์.
3. S3์ ๋ฐฑ์ ๋ ์ค๋ ์ท์ ES๋ก ๋ณต์ํ๊ธฐ
๋ณต์์์๋ ์๋์ฒ๋ผ ํ ์ ์๋ค.
public void AWS_ES_์๋์ค๋
์ท_S3_๋ณต์_ํ
์คํธ() throws IOException {
RestClient esClient = esClient(serviceName, region);
// Restoring snapshot as ES indices
String takeSnapShot = "{\n \"indices\": \"index-2020-04-28\",\n \"ignore_unavailable\": true,\n \"include_global_state\": false\n}";
HttpEntity entity = new NStringEntity(takeSnapShot, ContentType.APPLICATION_JSON);
Request request = new Request(HttpMethod.POST, snapshotRepository + "/snapshot-test-2020-04/_restore");
request.setEntity(entity);
Response response = esClient.performRequest(request);
System.out.println(response.toString());
}
์ถ๋ ฅ๊ฒฐ๊ณผ:
Response{requestLine=POST /_snapshot/my-repo/snapshot-test-2020-04/_restore HTTP/1.1, host=${VPC Endpoint}, response=HTTP/1.1 200 OK}
์ ์ฝ๋๋ 4์๋ฌ ๋ก๊ทธ์ ๋ํด์ ์ ์ฅํ๋ ์ค๋ ์ท์์ ํน์ ์ผ์์ ์ธ๋ฑ์ค ์ฆ, index-2020-04-28 ์ ๋ํด์๋ง ๋ณต์์ ์งํํ๋ค.
์ ์ฝ๋๊ฐ ์ ์์ ์ผ๋ก ์คํ๋๋ฉด ES์ ํด๋น ์ธ๋ฑ์ค๊ฐ ์์ฑ๋์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ง์ฝ ๋ณต์ํ๋ ค๋ ์ธ๋ฑ์ค ๋ช ์ด ์กด์ฌํ๋ค๋ฉด ์๋์ ๊ฐ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
org.elasticsearch.client.ResponseException: method [POST], host [https://vpc-endpoint.amazonaws.com], URI [/_snapshot/my-repo/snapshot-test-2020-04/_restore], status line [HTTP/1.1 500 Server Error]
{"error":{"root_cause":[{"type":"snapshot_restore_exception","reason":"[my-repo:snapshot-test-2020-04/ECzLylZnTsGn8KfBqCvSEw] cannot restore index [index-2020-04-27] because an open index with same name already exists in the cluster. Either close or delete the existing index or restore the index under a different name by providing a rename pattern and replacement name"}],"type":"snapshot_restore_exception","reason":"[my-repo:snapshot-test-2020-04/ECzLylZnTsGn8KfBqCvSEw] cannot restore index [index-2020-04-27] because an open index with same name already exists in the cluster. Either close or delete the existing index or restore the index under a different name by providing a rename pattern and replacement name"},"status":500}
์ด๋ด ๊ฒฝ์ฐ ์๋ 3๊ฐ์ง ๊ฒฝ์ฐ๋ก ๋ณต์์ ์ฐจ๋ฅผ ์งํํด์ผ ํ๋ค.
์ฒซ์งธ, ํ์ฌ ์กด์ฌํ๋ ๋์ผํ ์ด๋ฆ์ ์ธ๋ฑ์ค๋ฅผ ์ญ์ ํ๊ณ ๋ณต์ํ๋ค.
๋์งธ, ๋ณต์ํ ๋ ์ธ๋ฑ์ค๋ช ์ renameํด์ ๋ณต์ํ๋ค.
์ ์งธ, ๋ค๋ฅธ ES๋๋ฉ์ธ์ผ๋ก ๋ณต์ํ๋ค -> ์ด๊ฑด ์๋์ผ๋ก ์ค๋ ์ท์ ์์ฑํ ๊ฒฝ์ฐ์๋ง ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ด๋ค.
๋๋ ํ ์คํธ ์ค์ด๋ฏ๋ก ๊ฐํธํ๊ฒ ์ฒซ๋ฒ์งธ๋ฅผ ์ ํํ๋ค.
๋ง์ฝ ์ค๋ ์ท์ ์ฌ๋ฌ ์ธ๋ฑ์ค์ ๋ํ ์ ๋ณด๊ฐ ๋ด๊ฒจ์๊ณ ๋ชจ๋ ์ ๋ณด๋ฅผ ๋ณต์ํ๋ ค๊ณ ํ ๋ ๋จ ํ๋์ ์ธ๋ฑ์ค๋ผ๋ ์ด๋ฆ์ด ๊ฒน์น๋ค๋ฉด ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
์ ์ฝ๋๊ฐ ์ ์์ ์ผ๋ก ์คํ๋๋ฉด ES์์ ํด๋น ์ธ๋ฑ์ค์ ์ ๋ณด๋ฅผ ์กฐํํด์ฌ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ํน์ ์ธ๋ฑ์ค๊ฐ ์๋ ์ฌ๋ฌ ์ธ๋ฑ์ค๋ฅผ ํ๊บผ๋ฒ์ ๋ณต์ํ๊ณ ์ ํ ๋๋ takeSnapShot์ indices ํญ๋ชฉ์ ์ธ๋ฑ์ค๋ช ์ ๋์ดํด์ฃผ๋ฉด ๋๋ค. *๋ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฑด ES ์ ์ ๋ผ๋ฉด ๋น์ฐํ ์์คํ ๊ณ ..
"indices":"index-2020-04-*,index-2020-05-0*"
์์ฒ๋ผ ํด์ฃผ๋ฉด 4์๋ฌ ๋ชจ๋ ์ธ๋ฑ์ค์ 5์ 1์ผ~5์ 9์ผ๊น์ง์ ์ธ๋ฑ์ค๋ฅผ ๋ณต์ํ๊ฒ ๋ ๊ฒ์ด๋ค.
์, ๊ทธ๋ผ ๋ณต์์ ๋ํด์๋ ์ด์ ๋๋ก ํ๊ณ , ์ค๋ ์ท๋ ๋๋ฌด ์ค๋ ๋ณด๊ดํ๋ฉด ์ฉ๋๋ง ์ก์๋จน์ํ ๋ ์ญ์ ๋ ์ด๋ป๊ฒ ํ ์ ์์์ง ๋ณด์.
4. S3์ ๋ฐฑ์ ํ ES ์ค๋ ์ท ์ญ์ ํ๊ธฐ
์ค๋ ์ท์ ์ญ์ ํ ๋๋ ์๋ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ๋ฉด๋๋ค.
public void AWS_ES_์๋์ค๋
์ท_์ญ์ _ํ
์คํธ() throws IOException {
RestClient esClient = esClient(serviceName, region);
Request request = new Request(HttpMethod.DELETE, snapshotRepository + "/snapshot-test-2020-04");
Response response = esClient.performRequest(request);
System.out.println(response.toString());
}
์ด๋ ๊ฒ ํ๋ฉด S3์ ์์ฑ๋์๋ ํ์ผ๋ค์ด ์ญ์ ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋๋ฐ, indices ๋๋ ํ ๋ฆฌ๋ ์์ ํ ์ญ์ ๋๊ณ ์ค๋ ์ท ๋ฆฌํฌ์งํ ๋ฆฌ๋ก ์ง์ ๋ root ๊ฒฝ๋ก์๋ ๋ช๋ช ์ฐ๋ ๊ธฐ(??) ํ์ผ๋ค์ด ๋จ์์๋ ๊ฒ์ ํ์ธ ํ ์ ์์๋ค. ๋ง์ฝ 2๊ฐ ์ด์์ ์ค๋ ์ท์ ์ ์ฅํ๋ค๋ฉด indices ๋๋ ํ ๋ฆฌ๋ ๋ชจ๋ ์ค๋ ์ท์ ๋ํ ์ญ์ ์์ฒญ์ ํ์ง ์๋ ์ด์ ์ญ์ ๋์ง ์๋๋ค. ๋ํ, ์ค๋ ์ท์ ์ญ์ ํ ๋๋ ์๊ฐ์ด ์ค๋๊ฑธ๋ฆฐ๋ค. sync ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ์๋ ๋๋ฌด๋๋ฌด๋๋ฌด ์ค๋ ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์์ฉ์์ ์ญ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๋ฉด async ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๊ธธ ๊ถ์ฅํ๋ค. ์ ์ฝ๋๋๋ก ์์ฑํ๋ค๋ฉด ๋ฌด์กฐ๊ฑด ์๋ ์์ผํ์์์ ์์ธ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค.
java.net.SocketTimeoutException: 30,000 milliseconds timeout on connection http-outgoing-0 [ACTIVE]
๋ง์ฝ ์ค๋ ์ท ์ด๋ฆ์ด ๊ธฐ์ต์ด ๋์ง ์๋๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น? S3์์ ์กฐํํด๋ด์ผ ํ์ผ๋ช ์ด ์ด๋ค ์ค๋ ์ท์ธ์ง ์ ์ ์๋๋ก ์์ฑ๋์ด์์ผ๋ ์ ๊ธธ์ด ์๋ค. ํค๋ฐ๋ dev tool์์ ์๋ ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ์ฌ ์ด๋ค ์ค๋ ์ท์ด ์๋์ง ๊ทธ ์ค๋ ์ท์ ์ด๋ค ์ธ๋ฑ์ค๋ค์ด ์ ์ฅ๋์ด์๋์ง๋ฅผ ํ์ธํ ์ ์๋ค.
GET _snapshot/my-repo/_all <- my-repo์ ๋ชจ๋ ์ค๋
์ท ์กฐํํ๊ธฐ
{
"snapshots" : [ {
"snapshot" : "snapshot-test-2020-04",
"uuid" : "VPMGlnLTQlqIT7SxPaqCOg",
"version_id" : 7016199,
"version" : "7.1.1",
"indices" : [ "index-2020-04-29", "index-2020-04-26", "index-2020-04-27", "index-2020-04-28" ],
"include_global_state" : false,
"state" : "SUCCESS",
"start_time" : "2020-05-25T07:34:09.804Z",
"start_time_in_millis" : 1590392049804,
"end_time" : "2020-05-25T07:34:32.145Z",
"end_time_in_millis" : 1590392072145,
"duration_in_millis" : 22341,
"failures" : [ ],
"shards" : {
"total" : 20,
"failed" : 0,
"successful" : 20
}
} ]
}
ํน์ ์ค๋ ์ท์ ๋ํ ์ ๋ณด๋ฅผ ํ์ธํ๊ณ ์ถ๋ค๋ฉด ์๋ ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ๋ฉด ๋๋ค.
GET _snapshot/my-repo/snapshot-test-*
์ฐธ๊ณ ๋ก ํ๋ ์ดํฐ๋ฅผ ์ด์ฉํ์ฌ ES์ ๋ฐ์ดํฐ๋ฅผ rotate ์ํฌ ์๋ ์์ต๋๋ค. ๊ด๋ จ ๋งํฌ๋ ์ฐธ๊ณ ๋ฌธ์์ ๋ฃ์ด๋์์ผ๋ ๊ด์ฌ์์ผ์๋ฉด ์ฝ์ด๋ณด์ธ์.
๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก๋ ์ด ์ค๋ ์ท ์ฝ๋๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ES 7 ์ด์์์ ์ง์ํ๋ UltraWarm ์ค์ ์ ์ด์ฉํ๊ธฐ๋ก ํ์ต๋๋ค. ES์ธ์คํด์ค ์ฌ์ด์ฆ๋ warm ๋ ธ๋์ ๊ฒฝ์ฐ ํซ๋ ธ๋์๋ ๋ณ๊ฐ๋ก S3๋ฅผ ์ด์ฉํจ์ผ๋ก์จ ๋น์ฉ์ ๋ง์ด ์ค์ผ ์ ์๊ณ ์ ์ฅ๊ธฐ๊ฐ ์ญ์ ์ํ๋ ๋งํผ ๋๋ฆด ์ ์์๊ธฐ ๋๋ฌธ์ ํ์ฌ ์ํฉ์์ ์ ํํ ์ ์๋ ์ต์ ์ด์์ต๋๋ค. UltraWarm์ด ๋ญ์ง์ ๋ํด์๋ ์ฐธ๊ณ ๋ฌธ์์ ๋งํฌ๋ฅผ ํ์ธํด๋ณด์ธ์. ์ฐธ๊ณ ๋ก ES ๋ฒ์ 6.8์ด์์์๋ง ์ฌ์ฉ๊ฐ๋ฅํฉ๋๋ค.
UltraWarm ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ ๋๋ ์๋ ๋ช ๋ น์ด๋ค์ ์ฐธ๊ณ ํ๋ฉด ๋ฉ๋๋ค.
// ๋ง์ด๊ทธ๋ ์ด์
์์
์์ฒญ
POST _ultrawarm/migration/index-2020-02-09/_warm
// ๋ง์ด๊ทธ๋ ์ด์
์์
์ค์ธ ์ธ๋ฑ์ค์ ์ํ ํ์ธ
GET _ultrawarm/migration/index-2020-02-09/_status
-> ๋ง์ด๊ทธ๋ ์ด์ ์์ ์ค์ด ์๋๊ฒฝ์ฐ ์ฆ, ๋๋ฌ๊ฑฐ๋ ์์๋ ์ํ ์ํ๋ฉด ์ค๋ฅ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
// ์ธ๋ฑ์ค ํจํด ๋ชฉ๋ก ์กฐํ
GET _cat/indices/index-2020-02-0*?v&s=index
-> ์ด ๋ช
๋ น์ ๋ง์ด๊ทธ๋ ์ด์
์์
์งํ ์ค์ ์ธ๋ฑ์ค์ ์ฌ์ด์ฆ๊ฐ ์ด๋ป๊ฒ ๋ณํ๋์ง ํ์ธํ๊ธฐ ์ํด ์ฌ์ฉํ์๋ค. ๋ง์ด๊ทธ๋ ์ด์
์์
์ด ์์๋๋ฉด ๋ง์ด๊ทธ๋ ์ด์
ํ๋ ค๋ ์ธ๋ฑ์ค์ ์๋ ์ฌ์ด์ฆ๋ณด๋ค 2๋ฐฐ๊น์ง hot data node์ ์ฉ๋์ ์ฐจ์งํ๊ฒ๋๋ค. ์ฌ์ ๋ถ์ ์ฌ์ด์ฆ๊ฐ ์๋ค๋ฉด ๋ง์ด๊ทธ๋ ์ด์
์์
์์ฒด๊ฐ ์์๋์ง ์๋๋ค. (free size๋ฅผ ๊ฒ์ฌํ ๋ค ์์ํ๋๋ก ๋์ด์๋ค)
// ๋ง์ด๊ทธ๋ ์ด์
์ด ์๋ฃ๋ ์ธ๋ฑ์ค ์ํ ์กฐํ
GET index-2020-02-09/_settings
-> Ultrawarm ๋
ธ๋๋ก ๋ง์ด๊ทธ๋ ์ด์
์ด ์๋ฃ๋์๋ค๋ฉด ์ ๋ช
๋ น์ด๋ก ์กฐํ ์ box_type์ด warm ์ผ๋ก ๋ฐ๋์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ฐธ๊ณ ๋ฌธ์
https://www.elastic.co/guide/en/elasticsearch/plugins/current/repository-s3-repository.html
https://www.elastic.co/guide/en/elasticsearch/reference/7.1/modules-snapshots.html