AppScale
개요
AppScale은 구글 앱엔진 플랫폼을 오픈 소스화하는 프로젝트이다. 아래와 같이 구글 앱엔진의 주요 모듈들을 오픈 소스 서비스들로 교체했다고 보면 정답이다.
- big table => mysql, MongoDB, Cassandra 등 입맛대로 선택.
- memcache => memcached
- task queue => RabbitMQ
- backend => not supported
- email => sendmail
- cron => cron
다만, 위 서비스들을 리얼 머신들에 직접 분산 설치하는 게 아니라, Ubuntu 가상 머신 이미지에 설치해둔 후 Amazon EC2 같은 가상 머신에 인스턴스들을 설치하고 역할을 지정하는 식으로 설치를 하게 된다. 가상 머신에는 그 외에도 다음과 같은 서비스들이 떠 있다.
- ruby
- erlang & neptune => neptune 이라는 cloud config/delpoy language
- mongrel, mongodb
- ndbd
- nginix master & slave => 로드밸런싱용 웹서버
appscale tools라는 아마존 EC2 tools와 비슷한 루비로된 스크립트로 플랫폼을 관리하게 되며, 아직까지는 python 2.5 만 지원한다. 웹 기반의 간단한 관리툴도 제공한다.
구조
- load balancer : http 분산
- application : python
- data management : DB. (cassandra, hbase, hypertable, mongodb, memcachedb, simpledb, mysql cluster, voldmort)
배포 모델
virtualized cluster deployment
관리자가 각 호스트에 이미지를 설치하고 부팅해서 각각 네트워킹이 되는지 체크하고 IP를 기록해서 통신토록.
- 인스턴스 하나당 1G 메모리, 2 virtual CPU 를 권장
- ssh & root 접근 권한 필요
- 그냥 셧다운하면 안됨. appscale 전체를 셧다운한 후에 개별 노드를 셧다운해야 함.
cloud infrastructure deployment
아마존 EC2 에 설치하거나 Eucalyptus(아마존EC2의 오픈소스 버전) 에 배포. AppScale 이 미리 설치된 AMI(Amazon Machine Image)로 설치.
- 클라우드 관리자는 account credential 필요
- appscale 설치 전에 non-appscale image 가 배포되고 public/private ip 를 설치할 수 있는지 체크해야 함.
- 이 테스트가 모두 끝나고 나서 전체 셧다운 후 배포.
배포
appscale tools 를 이용해서 자동화함.
- 클라우드 관리 인터페이스 제공
- 각 인스턴스들의 ssh 키와 credential 들을 동기화함
- ips.yaml 에 각 노드 정보가 있음.
:controller: --> database master & load balancer 가 설치됨
:servers: --> application servers & database slave 가 설치됨
AppScale Tools
사용법 참조
appscale-run-instances
특정 폴더를 배포하면서 appscale 서비스를 시작함.
--file: 배포할 폴더 지정
--table: 데이터베이스 지정.
맨 처음에는 controller 노드를 시작함. servers 노드들은 비동기로 시작. 클라우드 배포시 VM 부팅을 시작함. 이미지 크기 때문에 수십분 걸림. 그다음엔 DB를 시작함.
appscale-describe-instances
각 노드 상태를 보여줌. 메모리. CPU. HDD. 역할. DB.
appscale-upload-app, appscale-remove-app
특정 앱을 업로드하거나 삭제함.
appscale-terminate-instances
전체 클라우드를 셧다운함.
배포 구성 전략
- load balancer: 라우팅. 모든 노드들의 상태 페이지 호스팅. 여러 개 실행 가능.
- app engine: 커스터마이즈된 gae sdk 가 실행됨
- database
- login: 딱 한놈만 appscale-run-instances/appscale-upload-app 역할을 담당
- zoo keeper : db transaction 을 위한 메타 데이터 호스팅
- shadow :
호환성 & 차이점
- python 의 경우 backend, oauth 를 제외하고는 다 호환된다고 함
- blobstore file size < 100M: 우린 안쓰니까 괜찮음.
- query 를 위해서 인덱스를 만드는 대신 in memory filtering 을 한다. 즉 사이즈가 커지면 느려진다 ㅠㅠ 대용량 사용자일 때 개됨.
- task queue 는 실패시 재시작하지 않는다.
- 관리자만 메일을 보낼 수 있다.
- DB 는 소프트웨어적으로 에뮬레이션한다고 보면 됨 (mysql mongodb …) 즉 앱엔진에 맞게 튜닝하는 건 힘들다고 봄. (memcached + mysql 조합이 가능한지?)
- 최대 100개의 노드
- 앱엔진 1.6.2 (python) 지원
- 인스턴스간 세션 공유 문제
- 벌크로딩은 실패함
설치하기
가상 환경에서 guest OS로 돌아감. 가상 머신 이미지를 배포함. KVM, XEN. 근데 리눅스 Host 만 지원함. 보통 우분투를 씀.
아마존에서는 이미지 업로드 없이 public AMI 를 써서 바로 띄울 수 있음. 단 버지니아에만 이미지가 존재함.
see also deploying appscale via ec2
환경 변수 설정
AWS 키 & 크레덴셜 에서 X.509 키들을 다운받아서 pem 파일을 저장하고 환경 변수로 등록할 것.
Access Keys 를 카피해서 배치 파일에 등록한다.
see also appscale IaaS cloud deployment
euca tools 설치
아마존 접근을 위해서는 이 툴을 설치해야 된다.
python2.7 에서는 다음 패치를 해야 함.
3-2. M2Crypto-0.20.2
appscale tools 설치
debian/appscale_build_source.sh 열어서 help2man 관련 섹션 제거 후
sudo bash debian/appscale_build_source.sh
를 실행하면 /usr/local/appscale-tools 에 설치됨
아마존 서버 설치
버지니아에만 있는 appscale 1.6.1rc AMI (ami-e4a3048d) 을 이용해서 1 노드로 설치할 것. 이때 db 는 mysql
appscale-run-instances --min 1 --max 1 --file /usr/local/appscale-tools/sample_apps/python/guestbook --machine ami-e4a3048d --table mysql --iaas --force -v
인스턴스 타입은 지정하지 않으면 m1.large
가끔 키가 이미 등록되어 있다고 하는데, 그럴 때에는 --keyname XXX 로 다른 걸 사용할 것.
관련 키들은 ~/.appscale 폴더에 저장됨. pem 도 들어가 있음.
ssh 하기
ssh -i /Users/reiot/.appscale/warcloud.key root@ec2-23-22-2-204.compute-1.amazonaws.com
팁
access key & secret
대칭형 암호화.
모든 리퀘스트마다 public key id 를 보내고 더불어 secret key의 해시코드를 보내서 서버에서 검증하는 방식. 페북 캔버스앱과 동일한 구조다.
X.509 Certificates
공개키 암호화. cert.pem 으로 암호화하면 pk.pem 으로 복호화.
- PEM encoded X.509 certificate: cert-xxxx.pem
- PEM encoded RSA private key: pk-xxxx.pem
key pairs
EC2 인스턴스 접근시 권한.
ssh 를 위해서 가상 서버 인스턴스에 키를 등록함.
ssh 하기
-v 옵션으로 상태를 볼 것. -i 로 cert-xxx.pem 파일을 이용. 로그인시 account@server 형식 사용.
ssh -i ~/.ec2/cert.pem root@ec2-23-22-2-204.compute-1.amazonaws.com -v
ec2 commands
ec2-authorize default -p NN
: 특정 포트를 기본 오픈. (보통 ssh 22, 웹 80번 포트가 필요함)