ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฐ˜์‘ํ˜•

๐Ÿ™‹โ€โ™€๏ธ

ํšŒ์‚ฌ์—์„œ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ RestAPI ๊ฐœ๋ฐœ์„ ๋งก์•˜๊ณ , ๊ณผ์ •์—์„œ ๋ฐฐ์šด๊ฒƒ๋“ค์ด ์•„์ฃผ ๋งŽ์•˜๋‹ค.

ํฌ๊ฒŒ ๋ณด๋ฉด JPA, GITLAB, OpenSearch ์ •๋„ ๋  ๊ฒƒ ๊ฐ™๋‹ค. 

๊ทธ ์ค‘์—์„œ OpenSearch์— ๋Œ€ํ•ด ์ •๋ฆฌํ•˜๊ฒ ๋‹ค. 

 

๐Ÿ”ŽOpenSearch ์‚ฌ์šฉ์ด์œ 

OpenSearch๋Š” ์ƒ๊ฐ๋ณด๋‹ค ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ์—†์—ˆ๋‹ค.

OpenSearch๋Š” ์—˜๋ผ์Šคํ‹ฑ์„œ์น˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœํ•œ ์•„๋งˆ์กด์˜ ์†”๋ฃจ์…˜์ธ๋ฐ, ์—˜๋ผ์Šคํ‹ฑ์„œ์น˜๊ฐ€ ์•„๋‹Œ ์˜คํ”ˆ์„œ์น˜๋ฅผ ์“ด ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

RDBMS ํ™˜๊ฒฝ์—์„œ ์—˜๋ผ์Šคํ‹ฑ์„œ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด

RDBMS๋ฅผ Documentํ˜•DB๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.

์ด ์ž‘์—…์„ ๋ณดํ†ต ELK์Šคํƒ์—์„œ L(logstash)๊ฐ€ ๋‹ด๋‹นํ•˜๊ณ , ๋‹จ์ˆœ ๋ณ€ํ™˜๋ฟ๋งŒ์•„๋‹ˆ๋ผ ๋ฐฐ์น˜๋ฅผ ํ†ตํ•œ ๋ณ€ํ™˜, ๊ทธ๋ฆฌ๊ณ  K(Kibana)๋ฅผ ์—ฐ๋™ํ•˜์—ฌ ๋Œ€์‹œ๋ณด๋“œ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ์†”๋ฃจ์…˜๋„ ํ•จ๊ป˜ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ, ์š”๊ตฌ์‚ฌํ•ญ์ด ๊ธฐ์กด ๊ฒ€์ƒ‰API๋ฅผ ์—˜๋ผ์Šคํ‹ฑ์„œ์น˜๋กœ ์ ์šฉํ•˜๊ณ , ๋” ๋‚˜์•„๊ฐ€ ๊ฒ€์ƒ‰์ถ”์ฒœ ์ •๋„๊นŒ์ง€์˜€์œผ๋‹ˆ๊น, ๊ตณ์ด ELK์Šคํƒ์„ ์ ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์—ˆ๋‹ค. ๋ฌด๊ฑฐ์šด๊ฒƒ๋„ ๋ฌด๊ฑฐ์šด๊ฒƒ์ด๊ณ  ๊ณต์ˆ˜๋‚˜ ์—ฌ๋Ÿฌ๊ฐ€์ง€๋กœ ๋ฐฐ๋ณด๋‹ค ๋ฐฐ๊ผฝ์ด ๋” ํฐ๊ฒƒ๊ฐ™์•˜๋‹ค.

 

๊ทธ๋ž˜์„œ ๋Œ€์ฒดํ• ๋งŒํ•œ ๊ฒƒ์ด ์—†๋‚˜ ์ฐพ์•„๋ณด๋˜์ค‘ AWS ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•„๋งˆ์กด์—์„œ ์—˜๋ผ์Šคํ‹ฑ์„œ์น˜๋ฅผ ์ง€์›ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋˜์—ˆ๊ณ , ๊ทธ๊ฒƒ์ด Opensearch์˜€๋‹ค.

 

Opensearch์—์„œ L(logstash)์—ญํ• ์€ AWS DMS(Database Migration Service)๊ฐ€ ๋Œ€์ฒด๋˜์—ˆ๋‹ค.

์•„๋ž˜ ์‚ฌ์šฉ์„ค๋ช…์„œ๋ฅผ ์ฝ์–ด๋ณด๋ฉด ์ž์„ธํ•˜๊ฒŒ ์„ค๋ช…๋˜์–ด์žˆ๋‹ค.

https://docs.aws.amazon.com/ko_kr/dms/latest/userguide/CHAP_Target.Elasticsearch.html

 

AWS Database Migration Service ๋Œ€์ƒ์œผ๋กœ Amazon OpenSearch Service ํด๋Ÿฌ์Šคํ„ฐ ์‚ฌ์šฉ - AWSDatabase Migration Service

ParallelLoadThreads๋ฅผ ๊ธฐ๋ณธ๊ฐ’(0)์—์„œ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉด AWS DMS๋Š” ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ OpenSearch Service ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๊ณ ์œ ์˜ ๋กœ๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ต์…˜์„ 1 ์ด์ƒ์œผ๋กœ ์„ค

docs.aws.amazon.com

 

๐ŸŽˆOpenSearch ์ ์šฉ

๊ฐ์‚ฌํ•˜๊ฒŒ๋„ ์ธํ”„๋ผ ๋‹ด๋‹น์ž๊ฐ€ ์„œ๋ฒ„์— DMS์™€ Opensearch๋ฅผ ์„ค์น˜ํ•ด์ฃผ์…จ๋‹ค.

๊ทธ๋ž˜์„œ ์„ค์น˜๋œ Opensearch ๊ด€๋ฆฌ์‚ฌ์ดํŠธ์— ๋“ค์–ด๊ฐ€ ๋ถ€์–ด์ง„(?)๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ index๋ฅผ ์ƒ์„ฑํ•˜์˜€๋‹ค.

-> ์‚ฌ์‹ค์ƒ,๋ฒ„ํŠผ๋งŒ ํด๋ฆญํ•˜๋ฉด๋œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  curl ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ดค๋‹ค.

์•„์ฃผ ์ž˜๋˜์—ˆ๋‹ค.

 

๊ทธ๋Ÿผ ์ฝ”๋“œ๋ฅผ ์ ์šฉํ•ด๋ณด์ž.

์ฝ”๋“œ๋Š” ๋‹จ์ˆœํ•˜๋‹ค.

maven Dependency ์ ์šฉํ•˜๊ณ 

Opensearch ์„œ๋ฒ„ ์ธ์ฆํ•˜๊ณ 

๊ฒ€์ƒ‰ API ํ˜ธ์ถœํ•˜๋ฉด ๋์ด๋‹ค.

 

๐Ÿš€์ ์šฉ์˜ˆ์ œ

์•„๋ž˜ ๊ฐ€์ด๋“œ ์‚ฌ์ดํŠธ์— ์•„์ฃผ ์นœ์ ˆํ•˜๊ฒŒ ์˜ˆ์ œ๊ฐ€ ๋‚˜์™€์žˆ๋‹ค.

https://opensearch.org/docs/latest/clients/java-rest-high-level/#sample-code

 

Java high-level REST client

Java high-level REST client

opensearch.org

์˜ˆ์ œ๋ฅผ ์„ค๋ช…ํ•˜์ž๋ฉด

1. maven์„ค์ •-pom.xml์— ์ถ”๊ฐ€ํ•˜๋ฉด๋œ๋‹ค.

<dependency>
  <groupId>org.opensearch.client</groupId>
  <artifactId>opensearch-rest-high-level-client</artifactId>
  <version>1.2.0</version>
</dependency>

2. OpenSearch ํด๋ผ์ด์–ธํŠธ ์ ‘์†๊ณ„์ •

credentialsProvider
.setCredentials(AuthScope.ANY,new UsernamePasswordCredentials("์•„์ด๋””", "๋น„๋ฐ€๋ฒˆํ˜ธ"));

3. ํด๋ผ์ด์–ธํŠธ build

//Create a client.
    RestClientBuilder builder = RestClient.builder(new HttpHost("OpenSearch์ฃผ์†Œ", ํฌํŠธ, "https"))
      .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
        @Override
        public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
          return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
            }
          });
    RestHighLevelClient client = new RestHighLevelClient(builder);

4. OpenSearch์— ๋‚ ๋ฆด Request ์ƒ์„ฑ, ๊ฒ€์ƒ‰ ์š”์ฒญ

//3.Request ์ƒ์„ฑ
SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchQuery("ํ•„๋“œ๋ช…(๊ฒ€์ƒ‰์กฐ๊ฑด)", "๊ฒ€์ƒ‰์–ด"));
searchRequest.source(sourceBuilder);

//4.๊ฒ€์ƒ‰ ์š”์ฒญ
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

์ด๋ ‡๊ฒŒ ๋œ๋‹ค.

ํ•ด๋‹น ์˜ˆ์ œ์—๋Š” search API๋Š” ์•ˆ๋‚˜์™€์žˆ๊ณ , ์ธ๋ฑ์Šค์ƒ์„ฑAPI, GET,DELETE ๋งŒ ๋‚˜์™€์žˆ์–ด์„œ ์ฐพ๋Š”๋ฐ ์• ๋จน์—ˆ๋‹ค.

์œ„์˜ 4๋ฒˆ์ฝ”๋“œ๋Š” ์—˜๋ผ์Šคํ‹ฑ ๊ฐ€์ด๋“œ๊ฐœ๋ฐœ๋ฌธ์„œ์—์„œ ์ฐธ๊ณ ํ•˜์˜€๋‹ค.

https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-search.html

 

ELK๋ฅผ Base๋ถ€ํ„ฐ ๊ตฌ์ถ•ํ•˜์ง€ ์•Š๊ณ  ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ OpenSearch+DMS ์ŠคํŽ™์œผ๋กœ ์—˜๋ผ์Šคํ‹ฑ์„œ์น˜๋ฅผ ์‚ฌ์šฉํ• ์ˆ˜์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

(a.k.a ๋ˆ์ด ์ตœ๊ณ ๋‹ค๐Ÿ’ธ๐Ÿ’ธ)

-๋-

 

 

๐Ÿ‘‰Tip. SQL๊ณผ OpenSearch์—์„œ ๋งคํ•‘๋˜๋Š” ์šฉ์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์ˆ™์ง€ํ•˜๋Š”๊ฒŒ ๊ฐ€์ด๋“œ๋ฅผ ์ฝ๊ธฐ ๋œ ํ—ท๊ฐˆ๋ฆฌ๋‹ค.

๐Ÿ‘‰Tip. ์œˆ๋„์šฐ์—์„œ curl์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ์ฐธ๊ณ 

https://kitae0522.tistory.com/entry/Windows-%EC%9C%88%EB%8F%84%EC%9A%B010%EC%97%90%EC%84%9C-curl-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95

 

[Windows] ์œˆ๋„์šฐ10์—์„œ curl ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

์ตœ๊ทผ ๋ฆฌ๋ˆ…์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ curl ๋ช…๋ น์–ด๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ๋จธ์‹ ์ด ์œˆ๋„์šฐ ํ™˜๊ฒฝ์ผ ๋•Œ๋„ curl ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์–ด์„œ ์ œ ๋‚˜๋ฆ„๋Œ€๋กœ ๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด ์ž๋ฃŒ๋ฅผ ์•Œ์•„๋ณด๊ณ , ์ €์™€ ๊ฐ™์€

kitae0522.tistory.com

 

๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•