EC2를 이용한 ElasticSearch Cluster 구현하기 - NFS 설정 및 config 공유

2021-09-24

.

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

  • 구현하고자 하는 클러스터 아키텍처

1

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