the 2 nd cloud frontier 2011 hands on lab
DESCRIPTION
The 2 nd CLOUD FRONTIER 2011 Hands On Lab. 2011.10.19. 한국자바개발자협의회. KT ucloud 에 대한 소개 – KT 박상학 팀장 (5 분 ) 클라우드 환경에서 Java Platform (5 분 ) IaaS 기반 Java Platform 환경 구축 실습 (55 분 ) Apache HTTP Server + Tomcat Integration Java Application Deployment - PowerPoint PPT PresentationTRANSCRIPT
The 2nd CLOUD FRONTIER 2011
Hands On Lab
2011.10.19
한국자바개발자협의회
Agenda
1. KT ucloud 에 대한 소개 – KT 박상학 팀장 (5 분 )2. 클라우드 환경에서 Java Platform (5 분 )3. IaaS 기반 Java Platform 환경 구축 실습 (55 분 )
Apache HTTP Server + Tomcat Integration
Java Application Deployment
4. KT ucloud Storage Service 소개 – KT 황진경 팀장 (5 분 )5. KT ucloud Storage Service 데모 (10 분 )
Ajax 기반 Application
6. KT ucloud PaaS Service 소개 – KT 김기현 팀장 (10 분 )7. KT ucloud PaaS Service 데모 (10 분 )
Auto Scaling
Threshold
Java EE Platform
Java EE Application Architecture
Java EE Application 의 환경 변화
IoC Framework :: Spring Framework
EJB POJO & POJI POJO :: Plain Old Java Object POJI :: Plain Old Java Interface
Java EE Server (WAS) Web Container
JSP/Servlet REST(JSON, XML)
Web Browser Any Device
Java EE Application 의 변화
Web Container :: Tomcat, Jetty, JBossWeb, … WAR Deployment
Virtual Machine 환경에 보다 적합
Stateless Application :: REST (JAX-RS Standard) State Management :: Server Client
Scalability 확보가 용이
IoC Container :: Spring Framework Lightweight, POJO, Unmanaged Environment
Scalability 확보가 용이
System Architecture On Java
Fire
wal
l
Fire
wal
lL4 Switch
(Load Balancing)Client
Apache HTTP (2)
Apache HTTP (1)
AppServer (1)
AppServer (2)
AppServer (3)
AppServer (4)
Load Balancing
Load Balancing
Load Balancing
Database (1)
Database (2)
DatabaseClustering
DMZ Inner Network
Web Server Failover
Application ServerFailover
DatabaseFailover
Java On Cloud
IaaS(Infrastructure as a Service) Virtualization :: KT ucloud server 기존의 애플리케이션을 그대로 Migration 하는 방식 경량의 Runtime Environment 구현 필요 장비만 없을 뿐 , 설정은 그대로 진행해야 하나 on demand 기존에 사용하던 소프트웨어의 라이선스 정책 확인 필요 서비스 제공자가 제공하는 서비스에 따라서 제약 발생이 있음
예 ) Database (Oracle 을 사용하지만 VM 에서는 라이선스 문제로 사용이 어려움 )
PaaS(Platform as a Service) 사전에 정의되어 있는 개발 및 배포 환경 개발자는 개발과 배포에 집중 개발 및 배포에 있어서 환경적 제약이 발생하나 개발자는 시스템에
대해서 알아야 필요 없음 서비스 제공자는 개발 환경과 배포 환경을 제공
Java System Architecture on IaaS
L4 Switch(Load Balancing)
Client
Apache HTTP (2)
Apache HTTP (1)
AppServer (1)
AppServer (2)
AppServer (3)
AppServer (4)
Load Balancing
Load Balancing
Load Balancing
Database (1)
Database (2)KT ucloud콘솔 설정
VM 에 각각의 서비스를 개별로 설정
VM 에 서비스를 하나 이상의 서비스를 결합
VM 에 모든 서비스를하나로 구성
KT ucloud :: Load Balancer
KT ucloud :: Load Balancer
KT ucloud :: Database Service
KT ucloud :: Database Service
Apache HTTP Server & Tomcat
L4 Switch192.168.10.1
app1
app2
app3
Apache1192.168.10.2
Apache2192.168.10.3
AppServer1192.168.10.4
AppServer2192.168.10.5
app1
app2
app3
Client
Java System Architecture on IaaS
Apache HTTP Server
AppServer (2)(Tomcat)
Load Balancing
Database Server
MySQL on VMOR
KT ucloud DB)
AppServer (1)(Tomcat)
mod_jk
mod_jk.somod-jk.confuriworkermap.propertiesworkers.properties
<TOMCAT>/conf/server.xml
실습 절차
1. KT ucloud server VM 접속2. install.sh 스크립트 다운로드 및 실행
Apache HTTP Server, MySQL, Tomcat 다운로드 및 설치
3. Apache HTTP Server & mod_jk 설정4. Apache Tomcat 설정5. MySQL 스키마 생성6. Apache HTTP Server & MySQL 서비스
재시작7. 예제 Application 배포8. Apache Tomcat 재시작9. 테스트
실습용 스크립트
http://14.63.194.232/download/script.txt
실습 :: 1. 접속 및 설치
KT ucloud server 접속1. Putty 를 실행하고2. 책상에 있는 접속 IP/Username/Password 로 VM 에 접속
접속 후 다음의 커맨드를 실행[root@i-2732-16209-VM ~]# wget http://14.63.194.232/download/install_x86.sh[root@i-2732-16209-VM ~]# sh install_x86.sh ...Press Enter to continue..... 엔터
Done....[root@i-2732-16209-VM ~]# . .bashrc[root@i-2732-16209-VM ~]# java
실습 :: 2. 다운로드 파일 확인
root@i-2732-16209-VM:~ #> lltotal 14212-rw------- 1 root root 973 Nov 8 2010 anaconda-ks.cfgdrwxr-xr-x 6 root root 4096 Oct 19 00:36 apache-maven-3.0.3drwxr-xr-x 9 root root 4096 Oct 19 00:36 apache-tomcat-7.0.22-rw-r--r-- 1 root root 305 Oct 19 00:39 bashrc-rwxr-xr-x 1 root root 2598 Oct 19 00:42 install.sh-rwxr-xr-x 1 root root 2617 Oct 19 00:42 install_x86.shlrwxrwxrwx 1 root root 11 Oct 19 00:36 jdk -> jdk1.6.0_27drwxr-xr-x 10 root root 4096 Oct 19 00:36 jdk1.6.0_27-rw-r--r-- 1 root root 9813 Oct 17 02:10 jpetstore-mysql-dataload.sql-rw-r--r-- 1 root root 5616 Oct 17 02:10 jpetstore-mysql-schema.sqllrwxrwxrwx 1 root root 18 Oct 19 00:36 maven -> apache-maven-3.0.3-rw-r--r-- 1 root root 330 Oct 17 01:46 mod-jk.conf-rw-r--r-- 1 root root 394007 Oct 17 01:46 mod_jk.so-rw-r--r-- 1 root root 14064359 Oct 17 02:09 ROOT.war-rw-r--r-- 1 root root 31 Oct 17 01:46 uriworkermap.properties-rw-r--r-- 1 root root 345 Oct 17 01:46 workers.properties
실습 :: 3. mod_jk 설정
root@i-2732-16209-VM:~ #> cp mod-jk.conf /etc/httpd/conf.dLoadModule jk_module modules/mod_jk.soJkWorkersFile conf.d/workers.propertiesJkLogFile logs/mod_jk.logJkLogLevel debug 로깅 레벨은 운영시 infoJkLogStampFormat "[%a %b %d %H:%M:%S %Y]"JkOptions +ForwardKeySize +ForwardURICompatUnparsed -ForwardDirectoriesJkRequestLogFormat "%w %V %T"JkMountFile conf.d/uriworkermap.propertiesJkShmFile run/jk.shm
root@i-2732-16209-VM:~ #> cp uriworkermap.properties /etc/httpd/conf.d/=loadbalancer/*=loadbalancer
root@i-2732-16209-VM:~ #> cp workers.properties /etc/httpd/conf.dworker.list=loadbalancerworker.jvm1.host=localhost Tomcat 이 하나 더 늘어나는 경우 추가worker.jvm1.port=8009worker.jvm1.type=ajp13worker.jvm1.lbfactor=1worker.loadbalancer.type=lbworker.loadbalancer.balance_workers=jvm1
root@i-2732-16209-VM:~ #> cp mod_jk.so /etc/httpd/modules
실습 :: 4. Apache Tomcat 설정
root@i-2732-16209-VM:~ #> cd /root/apache-tomcat-7.0.22/webappsroot@i-2732-16209-VM:~/apache-tomcat-7.0.22/webapps #> rm -rf ROOTroot@i-2732-16209-VM:~/apache-tomcat-7.0.22/webapps #> cp ~/ROOT.war .
root@i-2732-16209-VM:~ #> cd /root/apache-tomcat-7.0.22/confroot@i-2732-16209-VM:~/apache-tomcat-7.0.22/conf #> vi server.xml
[FROM]
<!-- You should set jvmRoute to support load-balancing via AJP ie : <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1"> --> <Engine name="Catalina" defaultHost="localhost">
[TO]
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
[VI 커맨드 ]
CTRL + F Page Down CTRL + B Page Up dd 라인 삭제 ESC + :wq 저장하고 종료
실습 :: 5. 테이블 생성 및 데이터 로딩
root@i-2732-16209-VM:~ #> cd /root
root@i-2732-16209-VM:~ #> mysql -uroot -p
Enter password: ( 그냥 엔터 )
mysql> show databases;
mysql> create schema jpetstore;
mysql> show databases;
mysql> quit
Bye
root@i-2732-16209-VM:~ #> mysql -uroot -p < jpetstore-mysql-
schema.sql
root@i-2732-16209-VM:~ #> mysql -uroot -p < jpetstore-mysql-
dataload.sql
실습 :: 6. 서비스 재시작
root@i-2732-16209-VM:~ #> cd /etc/init.d
root@i-2732-16209-VM:/etc/init.d #> ./httpd restart HTTP Server RestartStopping httpd: [ OK ]Starting httpd: [ OK ]
root@i-2732-16209-VM:/etc/init.d #> ./mysqld restart MySQL RestartStopping MySQL: [ OK ]Starting MySQL: [ OK ]
root@i-2732-16209-VM:/etc/init.d #> cd /root/apache-tomcat-7.0.22/binroot@i-2732-16209-VM:~/apache-tomcat-7.0.22/bin #> ./catalina.sh run...INFO: Starting ProtocolHandler ["http-bio-8080"]Oct 19, 2011 1:18:17 AM org.apache.coyote.AbstractProtocol startINFO: Starting ProtocolHandler ["ajp-bio-8009"]Oct 19, 2011 1:18:17 AM org.apache.catalina.startup.Catalina startINFO: Server startup in 2362 ms
Tomcat 을 백그라운드로 동작시키려면 run 대신
start
실습 :: 7. 서비스 테스트
참고 :: 도메인 연결하기
참고 :: Sticky Session & JVM Route
L4 Switch192.168.10.1
Apache1192.168.10.2
Apache2192.168.10.3
Tomcat1192.168.10.4
Tomcat2192.168.10.5
Client
①
②
Session ID : z0FOv8evAScvu6jPLlcLXQ**.jvm1세션을 생성한 Tomcat으로 요청이 처리되지 않는
경우 다시 로그인 요청을 하게 되는 문제를 해결하기
위한 방법
KT ucloud :: Database Service 연동
#mysql --host=172.27.202.16 -ujpetstore -proot < jpetstore-mysql-schema.sql#mysql --host=172.27.202.16 -ujpetstore -proot < jpetstore-mysql-dataload.sql
ROOT.war 파일의 WEB-INF/mysql.jdbc.properties 파일을 다음과 같이 작성
KT ucloud :: Database Service 연동
jdbc.driverClassName=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://172.27.202.16:3306/jpetstorejdbc.username=jpetstorejdbc.password=root
KT Storage Service :: 서비스 신청
KT Storage Service :: Container 생성
Container
Object
KT Storage Service :: API Key 생성
Storage API 를 사용하기 위한 정보
KT Storage Service :: Demo App
KT Storage Service :: Demo App
/upload 컨트롤러
/list 컨트롤러
/download 컨트롤러
KT Storage Service :: Storage API
KT Storage Service :: 사용자 설정 CLASSPATH 에 cloudfiles.properties
파일에 정보 추가 관련 정보는 KT ucloud 클라우드 콘솔에서 확인
connection_timeout=300
auth_url=https://ssproxy.ucloudbiz.olleh.com/auth/[email protected]=********************************
KT Storage Service :: 파일 저장
@Controller@RequestMapping("/upload")public class UploadController {
@RequestMapping(method = RequestMethod.POST) @ResponseBody public String upload(HttpServletRequest request, HttpServletResponse response) throws Exception { DefaultMultipartHttpServletRequest req = (DefaultMultipartHttpServletRequest) request; String containerName = req.getParameter("containerName"); MultipartFile uploadedFile = req.getFile("photo-file");
FilesClient client = new FilesClient(); java-cloudfiles API if (client.login()) { if (client.containerExists(containerName)) { client.storeStreamedObject(containerName, uploadedFile.getInputStream(), uploadedFile.getContentType(), uploadedFile.getOriginalFilename(), new HashMap()); String finalFilename = client.getStorageURL() + "/" + containerName + "/" + uploadedFile.getOriginalFilename(); return "{success:true, file:'" + finalFilename + "'}"; } } return "{success:false, file:'" + uploadedFile.getOriginalFilename() + "'}"; }
}
KT Storage Service :: 파일 리스트
@Controller@RequestMapping("/list")public class ListController {
@RequestMapping(method = {RequestMethod.POST, RequestMethod.GET}) @ResponseBody public String list(HttpServletRequest request, HttpServletResponse response) throws Exception { FilesClient client = new FilesClient(); List list = new LinkedList(); if (client.login()) { List<FilesContainer> containers = client.listContainers(); for (FilesContainer value : containers) { FilesContainerInfo info = value.getInfo(); List<FilesObject> objects = value.getObjects(); for (FilesObject obj : objects) { TreeItem image = new TreeItem( obj.getName(), obj.getName(), client.getStorageURL() + "/" + info.getName() + "?objectName=" + obj.getName(), "Image" ); list.add(image); } } } return JacksonUtils.toString(list); }}
파일 목록을 JSON 형태로 구성하여 클라이언트로 전달하면 목록이 나타남
https://ssproxy.ucloudbiz.olleh.com/v1/AUTH_a9876d72-5f73-46bf-af98-13779513dad9/test?objectName=DnD.png
Storage URL 은 서버에서 제공
KT Storage Service :: 파일 로딩@Controller@RequestMapping("/download")public class DownloadController {
@RequestMapping(value = "/{containerName}", method = RequestMethod.GET) @ResponseBody public void download(@PathVariable("containerName") String containerName, HttpServletRequest request, HttpServletResponse response) throws Exception { String objectName = request.getParameter("objectName");
if (containerName == null || objectName == null) { response.setStatus(500); } else { FilesClient client = new FilesClient(); if (client.login()) { if (client.containerExists(containerName)) { String contentType = FileUtils.getContentType(objectName); response.setHeader("Content-Type", contentType); response.setHeader("Content-Disposition", "attachment; filename=" + objectName); IOUtils.copy(client.getObjectAsStream(containerName, objectName), response.getOutputStream()); } } else { response.setStatus(500); } } }}
/download/test?objectName=test.png
Source Code
http://jcoorkr.tistory.com
End