AWS EC2 인스턴스에서 Milvus DB 구동하기

하나둘셋·2024년 7월 20일

aws와 docker 사용법에 아직 익숙치 않지만 경험을 기록하기 위한 글입니다 😶


프로젝트에서 RAG 기술을 사용하기 위해 Vector DB를 구축해야 한다. 선정한 DB는 Milvus이며, 오픈 소스에다가 클라우드 서비스까지 지원하며 성능도 좋다고 하기에 사용해보기로 결정했다.

직접 조금 사용해보고 느낀 바는 DB 쿼리의 기능이 다양하며, docker와 kubernetes를 활용한 어플리케이션 관리와 배포의 효율성이 매우 좋다고 느꼈다.

Milvus의 자세한 내용은 공식 문서를 참고해보길 바라며,
AWS cloud에 Milvus의 설치는 어떻게 이루어지고 접속하는지 바로 알아보겠다.

What is Milvus



나는 ec2 인스턴스에 Milvus DB를 설치하고 public 서버 ip와 지정 port를 통해 DB에 외부 접속하는 방식으로 진행 했다.
그 이유는 프로젝트를 진행을 위해 클라우드로 데이터베이스를 공유해야 했고, 리눅스 서버에서의 Milvus DB의 설치는 매우 간단했기 때문이었다.
Milvus의 DB 설치 가이드도 모두 리눅스 명령어로 제공되고 있다.


EC2 인스턴스 연결

aws ec2 인스턴스 유형은 t2.micro이고 OS image는 Amazon Linux 2023 AMI로 선택해 생성했다. 그 다음, 생성한 인스턴스 연결을 진행한다.

나는 Amazon Ec2 콘솔을 사용하여 연결했다.

위의 화면에서 하단의 연결 버튼을 누르면

이렇게 브라우저 기반 클라이언트를 사용하여 Linux 인스턴스에 연결 할 수 있다. 이 방법 이외에도 ssh 키를 이용해서 인스턴스에 연결하는 방법이 있다.

다른 연결 방법은 공식 가이드 문서나 다른 블로그를 참고해주길 바란다.

https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/ec2-instance-connect-methods.html



Docker 설치

docker를 통해 Milvus를 설치하고 이용할 것이기 때문에 먼저 docker를 설치해줘야 한다.

  1. 일단 인스턴스에 접속 한 후 최신 버전으로 모든 패키지를 업데이트 한다.
	$ sudo yum update -y
  1. 그 다음 Docker를 설치한다.
	$ sudo yum install docker -y
  1. 설치 후 Docker를 실행해본다.
	$ sudo service docker start
  1. 현재 사용자를 docker 그룹에 추가한다.
    Docker 그룹에 사용자를 추가하면 Docker 명령어를 실행할 때 마다 'sudo'를 사용할 필요가 없다.
	$ sudo usermod -aG docker ec2-user
  1. 인스턴스 재접속 후 Docker 명령어를 실행해본다.
	$docker run hello-world

이제 docker에 Milvus를 설치할 수 있는 사전 작업이 완료되었다.



Milvus 설치

Milvus는 docker container로서 구동되기 위해 설치 스크립트를 제공한다. 스크립트에는 아래의 내용들이 있다.

https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh


  1. 아래의 명령어를 입력한다.
	# Download the installation script
	curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh
위의 설치 스크립트를 다운받고 현재 위치한 디렉토리의 내용을 보면
세개의 파일이 다운받아져 있다.
$ ls
embedEtcd.yaml standalone_embed.sh user.yaml

  1. 이제 docker 컨테이너를 실행시킨다.
	# Start the Docker container
	$ bash standalone_embed.sh start

아래의 그림 처럼 컨테이너가 생성되고 실행된다.


  1. 실행 되고있는 컨테이너 정보를 확인한다.
	$ docker ps
  • 정보를 확인해보면 milvus 이름의 docker 컨테이너가 19530 port로 실행되고 있는 것을 알 수 있다.
  • 기본 Milvus의 구성을 바꾸기 위해서는 user.yaml 파일에 설정을 추가한 후 서비스를 재시작하면 된다.
  • Milvus의 데이터 볼륨은 현재 폴더의 volumes/milvus에 매핑된다.



컨테이너 중지 및 삭제

# Stop Milvus
$ bash standalone_embed.sh stop

# Delete Milvus data
$ bash standalone_embed.sh delete

이제 컨테이너의 실행까지 확인 했기 때문에, AWS 인스턴스 서버의 Milvus DB를 외부 접속 하기 위해서 추가적인 설정을 진행한다.



aws 인바운드 규칙 추가

aws 인스턴스에 접속하는 트래픽을 제어하는 인바인드 규칙을 추가하여 정해진 경로로만 접속 할 수 있도록 한다.
해당 인스턴스의 보안 그룹을 선택하여 인바운드 규칙 편집을 클릭하여 추가한다.

예시

  • Type : 사용자 지정 TCP
  • 프로토콜: TCP
  • 포트 범위: 19530
  • Source: 0.0.0.0/0 (모든 IP 주소 허용, 원래 보안을 위해선 특정 ip로만 접속 할 수 있도록 해야함)

기본적으로 Milvus 컨테이너는 port 19530으로 설정되기 때문에 인스턴스의 port도 19530으로 지정했다.



Docker 포트포워딩

aws 인스턴스에 위의 19530 port로 접속했을 시에 내부 도커 컨테이너와 접속하기 위해선 포트 포워딩이 필요하다. 호스트의 포트를 컨테이너 포트와 연결하여 밖에서 온 통신을 컨테이너 포트로 전달하는 것이다.

먼저 기존의 Milvus 컨테이너를 멈춘다.

$ bash standalone_embed.sh stop

아래의 명령어 처럼 컨테이너를 생성하고 실행하면 되는데 standalone_embed.sh에 이 코드가 존재하기 때문에

$ docker run -d -p 19530:19530 milvusdb/milvus:태그명

그냥 쉘 스크립트를 지운 후, 다시 한번 실행해주었다.

$ bash standalone_embed.sh delete
$ bash standalone_embed.sh start



Milvus 서버 접속

포트 포워딩 후 Milvus 컨테이너를 실행하여 DB를 시작해두고 외부에서 접속해본다.

아래의 코드를 실행했을 때 연결된 정보를 가져다주면 접속에 성공한 것이다.


from pymilvus import connections

conn = connections.connect(host="aws public ip", port=19530)
connections.get_connection_addr(alias="default")

# Output
# {'address': 'aws public ip 주소:19530', 'user': ''}

참조글
https://milvus.io/docs/install_standalone-docker.md
https://chati.tistory.com/124
https://jinjinyang.tistory.com/46

profile
하나씩 뚝딱뚝딱

0개의 댓글