Hands On Lab - 한국자바개발자협의회

Download Report

Transcript Hands On Lab - 한국자바개발자협의회

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
Web Server
Failover
Application Server
Failover
Load
Balancing
Database
Failover
AppServer (1)
Database (1)
Client
Load
Balancing
Firewall
Firewall
Apache HTTP (1)
AppServer (2)
Database
Clustering
L4 Switch
(Load Balancing)
Load
Balancing
AppServer (3)
Database (2)
Apache HTTP (2)
AppServer (4)
DMZ
Inner Network
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
VM에 각각의 서비스를
개별로 설정
Load
Balancing
AppServer (1)
Database (1)
Apache HTTP (1)
AppServer (2)
Load
Balancing
Client
VM에 모든 서비스를
하나로 구성
L4 Switch
(Load Balancing)
Load
Balancing
KT ucloud
콘솔 설정
AppServer (3)
Database (2)
Apache HTTP (2)
AppServer (4)
VM에 서비스를 하나
이상의 서비스를 결합
KT ucloud :: Load Balancer
KT ucloud :: Load Balancer
KT ucloud :: Database Service
KT ucloud :: Database Service
Apache HTTP Server & Tomcat
app1
app2
app3
Apache1
192.168.10.2
Client
L4 Switch
192.168.10.1
AppServer1
192.168.10.4
app1
app2
app3
Apache2
192.168.10.3
AppServer2
192.168.10.5
Java System Architecture on IaaS
<TOMCAT>/conf/server.xml
mod_jk.so
mod-jk.conf
uriworkermap.properties
workers.properties
mod_jk
Load
Balancing
AppServer (1)
(Tomcat)
Apache HTTP Server
Database Server
AppServer (2)
(Tomcat)
MySQL on VM
OR
KT ucloud DB)
실습 절차
1. KT ucloud server VM 접속
2. install.sh 스크립트 다운로드 및 실행

3.
4.
5.
6.
7.
8.
9.
Apache HTTP Server, MySQL, Tomcat 다운로드 및 설치
Apache HTTP Server & mod_jk 설정
Apache Tomcat 설정
MySQL 스키마 생성
Apache HTTP Server & MySQL 서비스 재시작
예제 Application 배포
Apache Tomcat 재시작
테스트
실습용 스크립트
http://14.63.194.232/download/script.txt
실습 :: 1. 접속 및 설치
 KT ucloud server 접속
1.
2.
Putty를 실행하고
책상에 있는 접속 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:~ #> ll
total 14212
-rw------- 1 root root
973
drwxr-xr-x 6 root root
4096
drwxr-xr-x 9 root root
4096
-rw-r--r-- 1 root root
305
-rwxr-xr-x 1 root root
2598
-rwxr-xr-x 1 root root
2617
lrwxrwxrwx 1 root root
11
drwxr-xr-x 10 root root
4096
-rw-r--r-- 1 root root
9813
dataload.sql
-rw-r--r-- 1 root root
5616
schema.sql
lrwxrwxrwx 1 root root
18
3.0.3
-rw-r--r-- 1 root root
330
-rw-r--r-- 1 root root
394007
-rw-r--r-- 1 root root 14064359
-rw-r--r-- 1 root root
31
uriworkermap.properties
-rw-r--r-- 1 root root
345
Nov
Oct
Oct
Oct
Oct
Oct
Oct
Oct
Oct
8
19
19
19
19
19
19
19
17
2010
00:36
00:36
00:39
00:42
00:42
00:36
00:36
02:10
anaconda-ks.cfg
apache-maven-3.0.3
apache-tomcat-7.0.22
bashrc
install.sh
install_x86.sh
jdk -> jdk1.6.0_27
jdk1.6.0_27
jpetstore-mysql-
Oct 17 02:10 jpetstore-mysqlOct 19 00:36 maven -> apache-mavenOct
Oct
Oct
Oct
17
17
17
17
01:46 mod-jk.conf
01:46 mod_jk.so
02:09 ROOT.war
01:46
Oct 17 01:46 workers.properties
실습 :: 3. mod_jk 설정
root@i-2732-16209-VM:~ #> cp mod-jk.conf /etc/httpd/conf.d
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf.d/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel debug
 로깅 레벨은 운영시
info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
JkOptions +ForwardKeySize +ForwardURICompatUnparsed ForwardDirectories
JkRequestLogFormat "%w %V %T"
JkMountFile conf.d/uriworkermap.properties
JkShmFile 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.d
worker.list=loadbalancer
worker.jvm1.host=localhost
 Tomcat이 하나 더 늘어나는 경우 추
가
worker.jvm1.port=8009
worker.jvm1.type=ajp13
worker.jvm1.lbfactor=1
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=jvm1
실습 :: 4. Apache Tomcat 설정
root@i-2732-16209-VM:~ #> cd /root/apache-tomcat-7.0.22/webapps
root@i-2732-16209-VM:~/apache-tomcat-7.0.22/webapps #> rm -rf ROOT
root@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/conf
root@i-2732-16209-VM:~/apache-tomcat-7.0.22/conf #> vi server.xml
[FROM]
ie :
<!-- You should set jvmRoute to support load-balancing via AJP
<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-mysqlschema.sql
root@i-2732-16209-VM:~ #> mysql -uroot -p < jpetstore-mysqldataload.sql
실습 :: 6. 서비스 재시작
root@i-2732-16209-VM:~ #> cd /etc/init.d
root@i-2732-16209-VM:/etc/init.d #> ./httpd restart
Server Restart
Stopping httpd: [ OK ]
Starting httpd: [ OK ]
root@i-2732-16209-VM:/etc/init.d #> ./mysqld restart
Restart
Stopping MySQL: [ OK ]
Starting MySQL: [ OK ]
 HTTP
 MySQL
root@i-2732-16209-VM:/etc/init.d #> cd /root/apache-tomcat7.0.22/bin
root@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 start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
Oct 19, 2011 1:18:17 AM org.apache.catalina.startup.Catalina
start
Tomcat 을 백그라운드로 동
INFO: Server startup in 2362 ms
작시키려면 run대신 start
실습 :: 7. 서비스 테스트
참고 :: 도메인 연결하기
참고 :: Sticky Session & JVM Route
세션을 생성한 Tomcat으로
요청이 처리되지 않는 경우
다시 로그인 요청을 하게 되는
문제를 해결하기 위한 방법
Session ID : z0FOv8evAScvu6jPLlcLXQ**.jvm1
①
②
Client
Apache1
192.168.10.2
Tomcat1
192.168.10.4
Apache2
192.168.10.3
Tomcat2
192.168.10.5
L4 Switch
192.168.10.1
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
KT ucloud :: Database Service 연동
 ROOT.war 파일의 WEB-INF/mysql.jdbc.properties 파
일을 다음과 같이 작성
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://172.27.202.16:3306/jpetstore
jdbc.username=jpetstore
jdbc.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/v1
.0
[email protected]
password=********************************
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 {
파일 목록을 JSON 형태로 구성하여 클
라이언트로 전달하면 목록이 나타남
@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();
Storage URL은 서버에서 제공
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);
}
https://ssproxy.ucloudbiz.olleh.com/v1/AUTH_a9876d72-5f73-46bf-af98-13779513dad9/test?objectName=DnD.png
KT Storage Service :: 파일 로딩
@Controller
@RequestMapping("/download")
public class DownloadController {
/download/test?objectName=test
.png
@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); }
}
}
Source Code
http://jcoorkr.tistory.com
End