실무에서 회사 제품에 모듈 형식으로 만들어 붙이기 위해 프로젝트를 진행중이다
프로토타입 형태로 환경을 구축해서 간단하게 CRUD 테스트를 진행했고
해당 내용을 정리해보고자 한다
엘라스틱서치 공식문서를 참고했는데 내용이 부실한 감이 있어서
다른 블로그나 스택오버플로우 등을 활용해 구현했다
참고로 클러스터 1개 노드 1개 로 구성했다
멀티 노드를 구성하고자하면 노드 정보만 추가하면 된다
1. 개발환경
Java 17
SpringBoot 2.7.13
Maven
centOS 7.9.2009
docker 24.0.2
elasticsearch:7.17.11
kibana:7.17.11
Intellij
mobaxterm
2. 참고한 공식문서
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/docker.html
Install Elasticsearch with Docker | Elasticsearch Guide [7.17] | Elastic
The container runs Elasticsearch as user elasticsearch using uid:gid 1000:0. Bind mounted host directories and files must be accessible by this user, and the data and log directories must be writable by this user.
www.elastic.co
공식 문서에는 엘라스틱서치만 설명을 하고 있는데
docker-compose.yml 에 키바나만 추가했고
공식문서와 블로그를 비교하며 이해하면 될것 같다
3. 공식문서 따라 해보기 (도커)
1) docker image를 본인 os 환경 도스 창에서 내려받는다
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.11
2) docker-compose.yml 파일 작성하기
위에서부터 하나하나 설명하겠다
version :
- 도커에 해당하는 버전을 지정해준다
- 버전별 다른 내용이 있으니 공식문서를 참고바란다
https://docs.docker.com/compose/compose-file/compose-versioning/
Compose file versions and upgrading
docs.docker.com
services :
- 컨테이너 정의 (=container) 하는 부분이다
elasticsearch :
- 엘라스틱 서치라는 정의
image :
- 서비스 컨테이너를 생성할 때 쓰일 이미지의 이름을 설정하는 부분
- 도커에 존재하면 존재하는 이미지를 사용한다
- 도커에 존재하지 않으면 도커 허브에서 자동으로 내려받아 사용한다
environment :
- docker run 에서 -env, -e 옵션과 동일한 역할, 엘라스틱 환경 설정
- node.name =
노드 이름을 지정하는 곳
- cluster.name =
클러스터 이름을 지정하는 곳 (클러스터 명을 기준으로 노드가 join 한다)
- discovery.seed_hosts =
클러스터를 구성할 노드에 대한 정의를 하는 곳
- cluster.initial_master_nodes =
마스터로 선출될 후보 노드를 초기 세팅하는 곳
- bootstrap.memory_lock =
엘라스틱이 사용할 메모리 락의 사용 여부
- ES_JAVA_OPTS =
JVM이 사용 가능한 힙 사이즈 결정하는 곳
Ulimits :
- 프로세스 지원 한도를 설정하는 곳
memlock :
메모리 내 주소 공간의 최대 크기를 설정하는 곳
soft :
기본 적용 값
hard :
soft 에서 최대로 늘릴 한도 값
volumes :
- docker run 에서 -v 옵션과 동일한 역할을 함
- 공유 볼륨을 설정하는 곳
- 호스트 pc 폴더와 컨테이너 내부 폴더를 바인딩 하는것이다
- local 과 docker 의 폴더를 바인딩할때 사용하기도 함
port :
- docker run 에서 -p 옵션과 동일한 역할을 함
- 공유할 포트 설정 ( 로컬포트 : 컨테이너 포트 )
networks :
- 컨테이너간 네트워크의 분리를 위한 추가 설정하는 곳
- 대형 서비스가 아닌 이상 보통 하나의 네트워크 안에서 여러 도커를 쓴다
version: '2'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.11
container_name: elasticsearchtest
environment:
- node.name=elasticsearch
- cluster.name=es-docker-cluster
- discovery.seed_hosts=elasticsearch
- cluster.initial_master_nodes=elasticsearch
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
ports:
- 29200:9200
networks:
- elastic
kibana:
image: docker.elastic.co/kibana/kibana:7.17.11
container_name: kibanatest
ports:
- 25601:5601
environment:
#ELASTICSEARCH_URL: http://elasticsearch:29200
#ELASTICSEARCH_HOSTS: http://elasticsearch:29200
- server.host="0"
- server.port=25601
- elasticsearch_hosts=["http://192.168.10.11111:29200"]
networks:
- elastic
networks:
elastic:
driver: bridge
3) docker-compose 실행해 보기
실행
docker-compose up
- 로그가 찍히는걸 보면서 실행할 수 있다
- ctrl + c 하면 빠져나오고 중지 된다
docker-compose up -d
- 백그라운드에서 실행해서 다른 명령을 추가로 할 수 있다
- docker-compose logs 해서 로그를 확인하는 등등
삭제
docker-compose down
- 띄워져 있는 도커 컴포즈를 끄는 명령어 이다
4. 공식문서 따라 해보기 (자바)
보통 키바나를 연결했기에 키바나 명령어로 진행 하지만
우리 회사에서는 이걸 모듈화 해서 프로젝트에 끼우는 거라
자바에서 연결하고 CRUD 까지 될 수 있게 해보았다
여기서는 데이터를 1개만 가지고 하는것인데
bulk를 이용해서 여러 데이터를 동시에 처리하는 것도 있다
일단 돌아가는지 테스트 하는 정도라 1개의 데이터를
가지고 정상작동하는지 볼것이다
아래 공식문서를 참고해서 작성했다
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.17/java-rest-high.html
Java High Level REST Client | Java REST Client [7.17] | Elastic
Deprecated in 7.15.0. The High Level REST Client is deprecated in favour of the Java API Client. The Java High Level REST Client works on top of the Java Low Level REST client. Its main goal is to expose API specific methods, that accept request objects as
www.elastic.co
getting started 또는 document api, index api 등에 들어가서
원하는 정보를 얻으면 된다
1) Java High Level REST Client 이용해서 연결하기
/** 호스트 IP */
static String hostName = "192.168.10.11111";
/** 호스트 포트 */
static int hostPort = 29200;
/** 호스트 프로토콜 */
static String hostProtocol = "http";
/** 엘라스틱서치 접속 정보 생성 */
static RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost(hostName, hostPort, hostProtocol))
);
2) 인덱스 생성하기
샤드 1, 레플리카 0 이라는 조건을 주어 생성했다
1개의 노드를 사용하기에 이런 선택을 했다
/** 인덱스 생성 */
static void crateIndex() throws IOException {
CreateIndexRequest request = new CreateIndexRequest("member");
request.settings(Settings.builder()
.put("index.number_of_shards",1)
.put("index.number_of_replicas", 0)
);
CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
if(createIndexResponse.isAcknowledged() == true) {
System.out.println("인덱스 생성 성공");
} else {
System.out.println("인덱스 생성 실패");
}
}
3) 도큐먼트 생성하기
/** Document 생성 */
static void createDocument() throws IOException {
Map<String,Object> jsonMap = new HashMap<>();
jsonMap.put("name","cho");
jsonMap.put("message","안녕하세요 Elasticsearch님");
IndexRequest request = new IndexRequest("member")
.id("1")
.source(jsonMap)
.opType(DocWriteRequest.OpType.CREATE);
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
}
4) 도큐먼트 수정하기
/** Document 수정 */
static void write() throws IOException {
Map<String,Object> jsonMap = new HashMap<>();
jsonMap.put("name","kim");
jsonMap.put("message","안녕하세요 Elasticsearch pro님");
UpdateRequest updateRequest = new UpdateRequest("member", "1")
.doc(jsonMap);
UpdateResponse updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);
System.out.println("Update 값 보기 : " + updateResponse);
}
5) 도큐먼트 삭제하기
/** Document 삭제 */
static void delete() throws IOException {
DeleteRequest deleteRequest = new DeleteRequest("member", "1");
DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);
System.out.println("Delete 값 보기 : " + deleteResponse);
}
6) 도큐먼트 출력하기
/** Document 출력 */
static void read() throws IOException {
GetRequest getRequest = new GetRequest(
"member",
"1"
);
GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
System.out.println("Get 값 보기 : " + getResponse);
}
5. 마무리
기존 엘라스틱서치가 무료였을때는 회사에서도 잘 사용하다
어느 버전부터 엘라서틱서치를 이용해서 제품을 만들어서
다른 회사에 판매를 하면 유료가 되었다고 한다
그래서 회사에서는 오픈서치를 이용해서 제품을 만들고 있었는데
혹시나 상대방 회사에서 요금을 지불할테니 엘라스틱 서치를 해달라하면
해줘야 하기에 엘라스틱서치도 구현을 한다고 해서
내가 담당하게 되어 알아가 보는 단계에 있다
다음 글에서는 https 를 적용해서 ssl 인증서를 받고
4가지 설정 파일을 만들어서 동작해보는 시간을 가지고자 한다
'DataBase' 카테고리의 다른 글
| [DataBase] Elasticsearch 로컬 인증서 등록 방법 (keytool) (0) | 2023.07.14 |
|---|---|
| [DataBase] Elasticsearch + kibana + docker-compose (HTTPS 방식) (0) | 2023.07.06 |
| [DataBase] Java를 이용한 Elasticsearch CRUD 구현하기 (0) | 2023.06.28 |
| [DataBase] Elasticsearch 란? (0) | 2023.06.21 |
| [DataBase] DBCP (DataBase Connection Pool), HikariCP 란? (0) | 2023.06.14 |