EC2를 이용한 ElasticSearch Cluster 구현하기 - NFS 설정 및 config 공유
.
Data_Engineering_TIL(20210924)
[참고자료]
- “ES Cluster 구성” 최정민님 깃허브 자료
URL : https://github.com/cjungm/with-aws/tree/main/ElasticSearch/installed_ES
- “Elastic Cluster 구성” 김종민(kimjmin@gmail.com)님 블로그글
URL : http://kimjmin.net/2018/01/2018-01-build-es-cluster-1/
[참고사항]
“EC2를 이용한 ElasticSearch Cluster 구현하기 - kibana 및 Stack Monitoring 설치” 에 이어서 진행하는 실습내용임
URL : https://minman2115.github.io/DE_TIL280
- 구현하고자 하는 클러스터 아키텍처
3개의 data node, 1개의 master node 노드로 클러스터를 구성
Master Node가 설치된 서버에는 Kibana, Logstash 및 기타 프로그램들을 같이 설치
마스터 노드만 HTTP REST API를 열고, Data Node 들은 Transport 통신
Kibana, Logstash 및 기타 프로그램은 Master Node 와 REST로 통신
데이터는 Master Node 를 통해서만 색인
[실습내용]
NFS(네트워크 파일 시스템) 마운트란 여러 노드간에 디렉토리를 공유하도록 작동한다. 홈 디렉토리는 한 서버에만 보관되고 다른 서버는 네트워크를 통해 연결할 수 있기 때문에 디스크 공간을 절약 할 수있는 이점이 있다. 마운트를 설정할 때 NFS는 항상 액세스 할 수 있어야하는 영구 고정 디렉토리에 가장 효과적이다.
NFS 마운트는 두 개 이상의 서버 사이에 설정된다. 공유 네트워크를 호스팅하는 머신을 서버라고하고 여기에 연결하는 머신을 ‘클라이언트’라고 한다.
STEP 1) 먼저 4개의 모든 서버에서 아래와 같이 elasticsearch 서비스를 중지한다.
# 마스터 서버
[ec2-user@es-master ~]$ sudo service elasticsearch stop
Stopping elasticsearch (via systemctl): [ OK ]
[ec2-user@es-master ~]$ sudo service kibana stop
Stopping kibana (via systemctl): [ OK ]
[ec2-user@es-master ~]$ sudo service metricbeat stop
Stopping metricbeat (via systemctl): [ OK ]
[ec2-user@es-master ~]$
# 그외 데이터노드 서버
[ec2-user@data01 ~]$ sudo service elasticsearch stop
Stopping elasticsearch (via systemctl): [ OK ]
그런 다음에 NFS 서버 설정을 할 것이다.
STEP 2) 모든 노드에 접속해서 아래와 같이 필요한 소프트웨어를 다운로드 하고 실행을 시킨다.
Amazon linux2 서버에는 nfs-utils,nfs-utils-lib 가 이미 설치되어 있을 것이다.
[ec2-user@es-master ~]$ sudo yum install -y nfs-utils nfs-utils-lib
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
amzn2-core | 3.7 kB 00:00:00
amzn2extra-docker | 3.0 kB 00:00:00
kibana-7.x | 1.3 kB 00:00:00
(1/3): amzn2-core/2/x86_64/group_gz | 2.5 kB 00:00:00
(2/3): amzn2-core/2/x86_64/updateinfo | 405 kB 00:00:00
(3/3): amzn2-core/2/x86_64/primary_db | 56 MB 00:00:00
Package 1:nfs-utils-1.3.0-0.54.amzn2.0.2.x86_64 already installed and latest version
No package nfs-utils-lib available.
Nothing to do
[ec2-user@es-master ~]$ sudo chkconfig nfs on
Note: Forwarding request to 'systemctl enable nfs.service'.
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
[ec2-user@es-master ~]$ sudo service rpcbind start
Redirecting to /bin/systemctl start rpcbind.service
[ec2-user@es-master ~]$ sudo service nfs start
Redirecting to /bin/systemctl start nfs.service
STEP 3) /usr/share/elasticsearch
경로를 공유하도록 설정
elasticsearch 프로그램들이 들어있는 /usr/share/elasticsearch
디렉토리 공유를 설정해야 한다. 공유를 하는 목적은 업그레이드나 플러그인 설치 등을 각 서버별로 하지 않고 한번에 적용할 수 있도록 하기 위함이다.
step 3-1) 마스터 서버에서 아래와 같이 명령어를 실행해서 설정해준다.
# /etc/exports 파일을 열고 아래와 같은 형태로 작성해준다.
#/usr/share/elasticsearch {data node1 private ip}(rw,sync,no_root_squash,no_subtree_check)
#/usr/share/elasticsearch {data node2 private ip}(rw,sync,no_root_squash,no_subtree_check)
#/usr/share/elasticsearch {data node3 private ip}(rw,sync,no_root_squash,no_subtree_check)
[ec2-user@es-master ~]$ sudo vim /etc/exports
/usr/share/elasticsearch 10.10.1.88(rw,sync,no_root_squash,no_subtree_check)
/usr/share/elasticsearch 10.10.1.11(rw,sync,no_root_squash,no_subtree_check)
/usr/share/elasticsearch 10.10.1.22(rw,sync,no_root_squash,no_subtree_check)
# 변경한 설정값 적용
[ec2-user@es-master ~]$ sudo exportfs -a
위에서 설정한 내용은 아래와 같다.
-
rw : 클라이언트 서버가 공유 디렉토리 내에서 읽고 쓸 수 있도록 한다.
-
sync : 동기화는 변경 사항이 커밋 된 후에 만 공유 디렉터리에 대한 요청을 확인하도록 한다.
-
no_subtree_check : 하위 트리 검사를 방지한다. 공유 디렉토리가 더 큰 파일 시스템의 하위 디렉토리 인 경우 nfs는 권한과 세부 정보를 확인하기 위해 그 위에있는 모든 디렉토리를 스캔한다. 하위 트리 검사를 비활성화하면 NFS의 안정성이 향상되지만 보안이 저하 될 수 있다.
-
no_root_squash : 루트가 지정된 디렉토리에 연결할 수 있도록 한다.
step 3-2) 데이터 노드에서 아래와 같이 명령어를 실행해서 설정해준다.
모든 데이터노드에서 적용 해줘야 한다. 먼저 기존의 /usr/share/elasticsearch
를 삭제하고 빈 디렉토리로 다시 만든다. 그리고 나서 마스터 서버의 네트워크 디렉토리를 마운트 해준다
그런 다음에 시스템 재시작 후에도 공유 디렉토리가 유지되도록 /etc/fstab
파일에 설정값을 추가한다.
[ec2-user@data01 ~]$ sudo rm -rf /usr/share/elasticsearch
[ec2-user@data01 ~]$ sudo mkdir /usr/share/elasticsearch
# sudo mount {master private ip}:/usr/share/elasticsearch /usr/share/elasticsearch
[ec2-user@data01 ~]$ sudo mount 10.10.1.120:/usr/share/elasticsearch /usr/share/elasticsearch
# {master private ip}:/usr/share/elasticsearch /usr/share/elasticsearch nfs auto,noatime,nolock,bg,nfsvers=3,intr,tcp,actimeo=1800 0 0
[ec2-user@data01 ~]$ sudo vim /etc/fstab
#
UUID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx / xfs defaults,noatime 1 1
10.10.1.120:/usr/share/elasticsearch /usr/share/elasticsearch nfs auto,noatime,nolock,bg,nfsvers=3,intr,tcp,actimeo=1800 0 0
다음은 config 파일들이 들어있는 /etc/elasticsearch
디렉토리 공유를 설정해야한다. config 파일들은 마스터 노드와 데이터 노드들이 구분되어야 하기 때문에 데이터 노드들은 서버에 /etc/elasticsearch-data
라는 디렉토리를 새로 만들어 이 디렉토리와 공유되도록 해줘야 한다.
step 3-3) 마스터 서버에서 기존 /etc/elasticsearch
디렉토리를 권한 그대로 /etc/elasticsearch-data
로 복사한다.
[ec2-user@es-master ~]$ sudo cp -pr /etc/elasticsearch /etc/elasticsearch-data-1
[ec2-user@es-master ~]$ sudo cp -pr /etc/elasticsearch /etc/elasticsearch-data-2
[ec2-user@es-master ~]$ sudo cp -pr /etc/elasticsearch /etc/elasticsearch-data-3
# 아래와 같은 양식으로 설정값을 추가해준다.
# /etc/elasticsearch-data {data node1 private ip}(rw,sync,no_root_squash,no_subtree_check)
# /etc/elasticsearch-data {data node2 private ip}(rw,sync,no_root_squash,no_subtree_check)
# /etc/elasticsearch-data {data node3 private ip}(rw,sync,no_root_squash,no_subtree_check)
[ec2-user@es-master ~]$ sudo vim /etc/exports
/usr/share/elasticsearch 10.10.1.88(rw,sync,no_root_squash,no_subtree_check)
/usr/share/elasticsearch 10.10.1.11(rw,sync,no_root_squash,no_subtree_check)
/usr/share/elasticsearch 10.10.1.22(rw,sync,no_root_squash,no_subtree_check)
/etc/elasticsearch-data-1 10.10.1.88(rw,sync,no_root_squash,no_subtree_check)
/etc/elasticsearch-data-2 10.10.1.11(rw,sync,no_root_squash,no_subtree_check)
/etc/elasticsearch-data-3 10.10.1.22(rw,sync,no_root_squash,no_subtree_check)
[ec2-user@es-master ~]$ sudo exportfs -a
step 3-4) 다시 모든 데이터노드를 각각 들어가서 기존의 /etc/elasticsearch
에 있는 파일들을 모두 삭제해준다. 루트 권한으로 들어가서 삭제 해준다.
[ec2-user@data01 ~]$ sudo su
[root@data01 ec2-user]# cd /etc/elasticsearch
[root@data01 elasticsearch]# rm -rf ./*
[root@data01 elasticsearch]# exit
exit
[ec2-user@data01 ~]$
# sudo mount {master private ip}:/etc/elasticsearch-data-{node number} /etc/elasticsearch
[ec2-user@data01 ~]$ sudo mount 10.10.1.120:/etc/elasticsearch-data-1 /etc/elasticsearch
# 시스템 재시작 후에도 NFS가 유지되도록 /etc/fstab 파일에 다음 내용을 추가한다.
# {master private ip}:/etc/elasticsearch-data-{node number} /etc/elasticsearch nfs auto,noatime,nolock,bg,nfsvers=3,intr,tcp,actimeo=1800 0 0
[ec2-user@data01 ~]$ sudo vim /etc/fstab
#
UUID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx / xfs defaults,noatime 1 1
10.10.1.120:/usr/share/elasticsearch /usr/share/elasticsearch nfs auto,noatime,nolock,bg,nfsvers=3,intr,tcp,actimeo=1800 0 0
10.10.1.120:/etc/elasticsearch-data-1 /etc/elasticsearch nfs auto,noatime,nolock,bg,nfsvers=3,intr,tcp,actimeo=1800 0 0
# 2번 노드일 경우
#[ec2-user@data02 ~]$ sudo vim /etc/fstab
##
#UUID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx / xfs defaults,noatime 1 1
#10.10.1.120:/usr/share/elasticsearch /usr/share/elasticsearch nfs auto,noatime,nolock,bg,nfsvers=3,intr,tcp,actimeo=1800 0 0
#10.10.1.120:/etc/elasticsearch-data-2 /etc/elasticsearch nfs auto,noatime,nolock,bg,nfsvers=3,intr,tcp,actimeo=1800 0 0
# 3번 노드일 경우
#[ec2-user@data03 ~]$ sudo vim /etc/fstab
##
#UUID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx / xfs defaults,noatime 1 1
#10.10.1.120:/usr/share/elasticsearch /usr/share/elasticsearch nfs auto,noatime,nolock,bg,nfsvers=3,intr,tcp,actimeo=1800 0 0
#10.10.1.120:/etc/elasticsearch-data-3 /etc/elasticsearch nfs auto,noatime,nolock,bg,nfsvers=3,intr,tcp,actimeo=1800 0 0