version: '3.7'
services:
my-backend:
build:
context: .
dockerfile: Dockerfile
volumes:
- ./src:/myfolder/src
ports:
- 3000:3000
my-database:
image: mysql:latest
environment:
MYSQL_DATABASE: 'mainproject'
MYSQL_ROOT_PASSWORD: 'root'
ports:
- 3306:3306
my-redis:
image: redis:latest
ports:
- 6379:6379
# elasticsearch-logstash-kibana๋ ํ์!
# ๊ฐ๊ฐ์ ์ค์ ํ์ผ์์ ์๋ก์ ๊ธฐ๋ณธ ์ด๋ฆ์ผ๋ก ์ฐ๊ฒฐ๋์ด์๊ธฐ ๋๋ฌธ์ ์ด๋ฆ์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์
elasticsearch:
image: elasticsearch:7.17.0
environment:
discovery.type: single-node # elasticsearch db์ด๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ๊ฐ๋ก ๋ถ์ฐ๊ฐ๋ฅ! ์ง๊ธ์ test๋ก ํ ๊ฐ๋ก ์ฌ์ฉํ ๊ฒ์ด๊ธฐ๋๋ฌธ์ single-node์ฌ์ฉ
ports:
- 9200:9200
logstash:
image: logstash:7.17.0
# docker์์ logstash๊ด๋ จ ํ์ผ ๋ฃ๊ธฐ
volumes:
- ./elk/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
- ./elk/logstash/mysql-connector-java-8.0.28.jar:/usr/share/logstash/mysql-connector-java-8.0.28.jar
- ./elk/logstash/templates.json:/usr/share/logstash/templates.json
# kibana:
# image: kibana:7.17.0 # ์ฉ๋์ด ๊ต์ฅํ ํผ
ํ ์คํธ, ์ซ์, ์ ํ ๋ฐ ๋น์ ํ ๋ฐ์ดํฐ ๋ฑ ๋ชจ๋ ์ ํ์ ๋ฐ์ดํฐ๋ฅผ ์ํย ๋ฌด๋ฃ ์คํ ์์ค ๊ฒ์ ๋ฐ ๋ถ์ฐ ์์ง
๋จ์ํ ๊ฒ์ ์์ง์ ๋์ด ๋ณด์, ๋ก๊ทธ ๋ถ์, ์ ๋ฌธ๋ถ์ ๋ฑ ๋ค์ํ ์์ญ์์ ์ค์ํ ์ญํ
Elastic Search-์ฐธ๊ณ ์ฌ์ดํธ https://esbook.kimjmin.net
์ธ๋ฑ์ค(๋น ๋ฅธ๊ฒ์)
mySQL
ex) "์ฒ ์"
์ญ์ธ๋ฑ์ค(๋น ๋ฅธ ์ ๋ฌธ(full-text)๊ฒ์)๋ฌธ์ฅ
Elasticsearch
ex) ๋ฌธ์ฅ์ ๋ค์ด๊ฐ "์ ์ฌ"
yarn add @nestjs/elasticsearch
์ค์น
[product.module.ts
ํ์ผ์ elasticsearch ์ฌ์ฉ์ ์ํ ์์กด์ฑ ์ฃผ์
!]
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Product } from './entities/product.entity';
import { ProductResolver } from './product.resolver';
import { ProductService } from './product.service';
import { ElasticsearchModule } from '@nestjs/elasticsearch';
@Module({
imports: [
TypeOrmModule.forFeature([
Product, //
]),
// elasticsearch ์ฌ์ฉ์ ์ํ ์์กด์ฑ ์ฃผ์
!
ElasticsearchModule.register({
node: 'http://elasticsearch:9200',
}),
], //
providers: [
ProductResolver, //
ProductService,
ProductSubscriber,
],
}) //์์กด์ฑ ์ฃผ์
ํ์
export class ProductModule {}
@Mutation(() => Product)
createProduct(
@Args('createProductInput') createProductInput: CreateProductInput, //
) {
// ์๋ผ์คํฑ์์น์์ ๋ฑ๋ก ์ฐ์ตํ๊ธฐ!! => ์ฐ์ต! ์ค์ ๋ก๋ mysql์ ์ ์ฅํ ์์ !
this.elasticsearchService.create({
id: 'myid',
index: 'myproduct', //table ์ด๋ฆ
document: {
name: '์ฒ ์',
age: 14,
school: '๋ค๋์ฅ์ด๋ฑํ๊ต',
},
});
}
[product.resolver.ts์ elasticsearch์ ์กฐํํ๋ ์ฝ๋ ์ถ๊ฐ]
@Query(() => [Product])
async fetchProducts() {
// ๋จ์ผ ์ปฌ๋ผ์ mysql , ๋ฌธ์ฅ์์ ์ฐพ์ผ๋ฉด elasticsearsh์์ ์กฐํ!
// ์๋ผ์คํฑ์์น์์ ์กฐํ ์ฐ์ตํ๊ธฐ
const result = await this.elasticsearchService.search({
index: 'myproduct',
query: {
match_all: {},
},
});
// ๊ฐ์ฒดํํ๋ก ๋ค์ด์ค๊ธฐ๋๋ฌธ์ string์ผ๋ก ๋ณํ ํ์
console.log(JSON.stringify(result, null, ' '));
# ๋งค๋ฒ mysql์์ pullling
# ์ค๋ณต ์ ์ฅ์ ํผํ ์ ์๋๋ก updatedat์ด ๊ฐ์ฅ ๋ง์ง๋ง์ธ ์๊ฐ์ ์ ์ฅ
input{
jdbc{
# ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ์ ์ํ๊ธฐ ์ํ ์ ์ ์ ๋ณด MySQL-connector-java
jdbc_driver_library => "/usr/share/logstash/mysql-connector-java-8.0.28.jar"
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://my-database:3306/myprojectDocker" #๋์ db์ ๋ณด(mysql์ฌ์ฉ, docker์์ db์ด๋ฆ)
jdbc_user => "root"
jdbc_password => "root"
schedule => "* * * * *" # ์คํ ์ฃผ๊ธฐ ๋ถ/ ์๊ฐ/ ์ผ/ ์/ ์์ผ 10 * * * * ๋งค 10๋ถ๋ง๋ค(1์ 10๋ถ,,1์ 20๋ถ,,) * 2 * * * ๋งค์ผ 2์ ๋ง๋ค => ํฌ๋ก ํญ
use_column_value => true # ์ปฌ๋ผ ์ฌ์ฉํ ๊ฒ
tracking_column => "updatedat" # ์ด๋ค ์ปฌ๋ผ ์ถ์ ํ ๊ฑด๋ฐ?
tracking_column_type => "numeric" # ์ปฌ๋ผ์ ํ์
์ด ๋ญ๋ฐ? # numeric = ์ซ์
last_run_metadata_path => "./aaa.txt" # ํ์ผ ์์ฑ ํ ํ์ผ ์์ ๋ง์ง๋ง ๋ฐ์ดํฐ ์ ์ฅ (updatedat์ปฌ๋ผ์ด aaa.txt์ ์ ์ฅ ๋จ) # cat aaa.txt๋ก ํ์ธ ๊ฐ๋ฅ
statement => "select id, name, price, unix_timestamp(updatedat) as updatedat from product where unix_timestamp(updatedat) > :sql_last_value order by updatedat asc" # ๋ช
๋ น์ด(๋ชจ๋ ์๋ฌธ์๋ก ์์ฑ!)
# unix_timestamp => ๋ ์ง๋ฅผ ์ซ์๋ก ๋ณ๊ฒฝ ํด์ค
# updatedat์ aaa.txt์๋ ์ ์ฅ (๋ค์ ์ ์ฅ ๋ ์ ์ฅ์๊ฐ์ ์ฌ์ฉํ๊ธฐ์ํด)
# updatedat์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ ํ์
}
}
output{
# elasticsearch์ ์ ์ฅ!
elasticsearch{
hosts => "elasticsearch:9200"
index => "myproduct" # index = ํ
์ด๋ธ์ด๋ฆ
template =>
}
}
๐ก Elasticsearch๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํ ๊ธฐ๋ฅ์ ๋จ์๊ฒ์๊ธฐ๋ฅ์ผ๋ก ๋ณต์กํ ๊ธฐ๋ฅ์ ์ฒ๋ฆฌํ์ง ์๊ธฐ ๋๋ฌธ์ Logstash๋ฅผ ํ์ฉํด ์ด๋ฏธ ์กด์ฌํ๋ RDBMS์ Data๋ฅผ ์๋ง๊ฒ ๋ณํํ์ฌE ES์ ์ ๊ณตํ๋ ๊ฒ์ด ํต์ฌ!
API์์ฒญ์ ํด์ผ ๋ฐ์ดํฐ๋ฅผ ๋ณผ ์ ์์ ex) match_all:{}
Elastic Search์ ์ฉ dbeaver์ญํ !