ÃֽŠ°Ô½Ã±Û(OS/WAS)
2018.11.19 / 15:16

Enterprise ȯ°æ¿¡¼­ Tomcat ¿î¿µÇϱâ

hanulbit
Ãßõ ¼ö 202

ÅèĹ ¿î¿µ ³ëÇÏ¿ì

  1. 1. Enterprise ȯ°æ¿¡¼­ Tomcat ¿î¿µÇϱâ Part 1 : Tomcat Àß ¾Ë°í »ç¿ëÇϱâ Victor Lee sleepred@gmail.com 2015.12.29
  2. 2. • Tomcat °³¿ä • Tomcat Architecture • Basic Features - Configuration, Connector, Tomcat JDBC Connection Pool µî • Advance Features - À¥¼­¹ö ¿¬µ¿, Session Clustering µî • Management & Monitoring - Tomcat Manager, JK Manager, VisualVM, Scouter µî • Tomcat Troubleshooting & ¿î¿µ ³ëÇÏ¿ì • Tomcat Community ¼Ò°³ - Build, Tomcat È®ÀåÇϱâ, Contribution
  3. 3. Complexity Vendor Dependency Cost Overrun Solution?
  4. 4. Stability Security Availability Solution?
  5. 5. ¡Ø ASF : http://www.apache.org/ Top Open Source Communities
  6. 6. ¡Ø Apache Tomcat : http://tomcat.apache.org/ ¡Ø User Mailing list : http://mail-archives.apache.org/mod_mbox/tomcat-users/
  7. 7. ¡Ø https://plumbr.eu/blog/java/most-popular-java-ee-containers-2015-edition
  8. 8. WEBSITE LISTS AVAILABLE Create a list of 158,040 websites using Apache Tomcat. ¡Ø https://wappalyzer.com/applications/apache-tomcat
  9. 9. • 1996³â 6¿ù Á¦ 4ȸ JavaOne (´ç½Ã Sun Microsystems ÁÖÃÖ) °¡ °³¹ßÇÏ°í ÀÖ´ø, JSWDK(JavaServer Web Development Kit)À» Apache Software Foundation ¿¡ ±âÁõÇÏ¿© ½ÃÀÛ µÇ¾úÀ½. • TomcatÀº Apache Software Foundation(ASF) ÇÏÀ§ÀÇ Apache Tomcat ÇÁ·ÎÁ§Æ®¿¡¼­ °¡ °³¹ß µÇ°í ÀÖ´Â Sevlet/JSP Container°¡ Æ÷ÇÔµÈ À¥ ¾îÇø®ÄÉÀÌ¼Ç ¼­¹ö(WAS) • Tomcat History • Tomcat 3.x (1999³â) : ÃÖÃÊ ¸±¸®Áî • Tomcat 4.x (2003³â) : Catalina ¾ÆÅ°ÅØó µµÀÔ • Tomcat 5.x (2004³â) : Session Replication ±â´É ±¸Çö • Tomcat 6.0 (2007³â) : Primary-Secondary ¹æ½Ä Sessioin Replication ±¸Çö • Tomcat 7.0 (2011³â) : Security °­È­, Connector ¸®ÆÑÅ丵 • Tomcat 8.0 (2014³â) : Resouce ¸®ÆÑÅ丵, WebSocket ±â´É Ãß°¡ • Tomcat 9.0 (2015³â) : 9.0.0.M1(alpha) Release (2015-11-19)
  10. 10. • TomcatÀº Serlvet Spec º° Major ¹öÀüÀ¸·Î ¸±¸®Áî • Servlet ¹öÀü°ú Tomcat »ç¾ç(Spec) Servlet Spec JSP Spec EL Spec WebSocket Spec Tomcat version Release revision Support Java Versions 4.0 TBD (2.4?) TBD (3.1?) TBD (1.2?) 9.0.x 9.0.0.M1 (alpha) 8 and later 3.1 2.3 3.0 1.1 8.0.x 8.0.28 7 and later 3.0 2.2 2.2 1.1 7.0.x 7.0.65 6 and later (WebSocket 1.1 requires 7 or later) 2.5 2.1 2.1 N/A 6.0.x 6.0.44 5 and later 2.4 2.0 N/A N/A 5.5.x (archived) 5.5.36 (archived) 1.4 and later 2.3 1.2 N/A N/A 4.1.x (archived) 4.1.40 (archived) 1.3 and later 2.2 1.1 N/A N/A 3.3.x (archived) 3.3.2 (archived) 1.1 and later ¡Ø TBD : To Be Determined ¡Ø Community support version : Tomcat6, Tomcat7, Tomcat8, Tomcat9 End of life for Apache Tomcat 6.0.x : 31 December 2016.
  11. 11. DB WASWEB Session Server L4 / Switch OpenEJB Browser(User) Network Session replication Load Balancing Load Balancing Fail-over Fail-over
  12. 12. Coyote Jasper Catalina
  13. 13. Server Service(*) Engine Host(*) Context(*) ConnectorConnectorConnector Valve Valve ValveValve Valve Valve Global Resource Clustering SupportJMX SupportJSP SupportSecurity Utility R e q u e s t Realm Realm Realm Wrapper(*) ValveValve ValveListener ValveListener ValveListener ValveListener Logger Resources Executor Loader Manager Listener Listener Listener ValveListener Jar Scanner ResourceResource JSPJSP ServletsServlet
  14. 14. • Server : Server = Catalina servlet container = Tomcat Instance JVM ¾È¿¡¼­ Singleton À¸·Î Á¸Àç, Server³»¿¡ Æ÷ÇԵǴ Serviceµé Life Cycle°ü¸® ´ã´ç • Context : web applicationÀ» ³ªÅ¸³»´Â ±¸¼º¿ä¼Ò, Spec »ó ServletContext¿Í ¸ÊÇÎ. WAR/EAR ÆÄÀÏÀ̳ª, explodedµÈ µð·ºÅ丮 ¡Ø http://tomcat.apache.org/tomcat-8.0-doc/config/server.html ¸¦ Âü°í
  15. 15. • Listeners : Tomcat Lifecycle À̺¥Æ® ¹ß»ý½Ã actionÀ» ¼öÇàÇÏ´Â ÄÄÆ÷³ÍÆ® TomcatÀÇ lifecycle À» Ä¿½ºÅ͸¶ÀÌ¡ÇÏ°í ½ÍÀº °æ¿ì È°¿ë °¡´É ex) APR Lifecycle Listener, Global Resources Lifecycle Listener µî • Manager : HTTP ¼¼¼ÇÀ» »ý¼º °ü¸®ÇØÁÖ´Â session manager • Logger : ¾È¿¡ JULI(Java Logging implimentation)¶ó´Â ÀÚü ±¸Çöü¸¦ Á¦°ø
  16. 16. • Valve : ÄÁÅ×À̳Ê(Engine, Host, Context)¿Í °ü·ÃµÈ °¢°¢ÀÇ request ó¸® pipeline(valve chain °´Ã¼)¾È¿¡ µé¾î°¡ ÀÖ´Â ÄÄÆ÷³ÍÆ®
  17. 17. • Server.xml ¿¹Á¦ <?xml version='1.0' encoding='utf-8'?> <Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <GlobalNamingResources> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> </GlobalNamingResources> <Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" /> </Host> </Engine> </Service> </Server> ¡Ø It is NOT recommended to place <Context> elements directly in the server.xml file (https://tomcat.apache.org/tomcat-8.0-doc/config/context.html)
  18. 18. Tomcat • Client ·ÎºÎÅÍ ¿äûÀ» ¹Þ¾Æ Container¿¡ Àü´ÞÇϱâ À§ÇÑ Component • Connector ´Â TomcatÀÇ À¥¼­¹ö ±â´ÉÀ¸·Î Coyote Architecture ·Î ±¸ÇöµÊ • Protocal°ú ó¸® ¹æ½Ä¿¡ µû¸¥ ±¸Çöü¸¦ °¡Áü • Connector Protocal • HTTP/HTTPS (HTTP/1.1) • AJP (AJP/1.3) • Connector 󸮹æ½Ä • Java Blocking I/O (BIO) : All I/O operations are blocking in processor thread (Read, Write, etc. ) ¡æ Simple, stable, mature • Java Non-blocking I/O (NIO) : Allows huge number of parallel requests • Java NIO.2 (NIO2) : like the NIO connector but uses the NIO2 framework • Native / Apache Portable Runtime (APR) : Native code (C), Use JNI • ¡Ø http://www.tecbar.net/optimize-tomcat-performance/
  19. 19. Tomcat • Connector ¼º´É • ÀÌ·ÐÀûÀ¸·Î´Â APR > NIO > BIO À̳ª, JAVA ¹öÀü, OS ¼³Á¤, »ç¿ëÀÚ ºÎÇÏ À¯Çü¿¡ µû¶ó »óÀÌÇÔ • Stability : BIO > NIO or APR • SSL : APR > NIO > BIO • Low concurrency : BIO > APR > NIO • High concurrency No Keep-Alive : BIO > APR > NIO • High concurrency Keep-Alive : APR > NIO > BIO ¡Ø http://www.tecbar.net/optimize-tomcat-performance/
  20. 20. Tomcat • HTTP Connector´Â HTTP/1.1 protocolÀ» Áö¿øÇÏ´Â ÄÄÆ÷³ÍÆ® • ¼Ó¼º : <Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1¡° connectionTimeout="20000¡° redirectPort="8443" /> ¡¦ </Service> Ç׸ñ ¼³¸í ±âº»°ª protocol HTTP, AJP µî ConnectorÀÇ ProtocalÀ» ¼³Á¤ÇÏ´Â Ç׸ñÀ¸·Î ±¸Çöü¸¦ Á÷Á¢ ¼³Á¤µµ °¡´ÉÇÔ - BIO(java connector) : org.apache.coyote. http11.Http11Protocol - NIO(java connector) : org.apache.coyote. http11.Http11NioProtocol - NIO2(java connector) : org.apache.coyote. http11.Http11Nio2Protocol - APR(native connector) : org.apache.coyote. http11.Http11AprProtocol HTTP/1.1
  21. 21. Tomcat ¡Ø http://tomcat.apache.org/tomcat-8.0-doc/config/http.html ¡Ø http://tomcat.apache.org/tomcat-8.0-doc/config/http.html#Connector_Comparison • HTTP Connector´Â HTTP/1.1 protocolÀ» Áö¿øÇÏ´Â ÄÄÆ÷³ÍÆ®
  22. 22. Tomcat • AJP Connector´Â AJP protocolÀ» »ç¿ëÇÏ¿© Tomcat°ú web server¿Í Åë½ÅÇÒ ¶§ »ç¿ëµÇ´Â ÄÄÆ÷³ÍÆ® • ¼Ó¼º : <Service name="Catalina"> <Connector port="8089" protocol=¡°AJP/1.3¡° redirectPort="8443" /> ¡¦ </Service> Ç׸ñ ¼³¸í ±âº»°ª protocol HTTP, AJP µî ConnectorÀÇ ProtocalÀ» ¼³Á¤ÇÏ´Â Ç׸ñÀ¸·Î ±¸Çöü¸¦ Á÷Á¢ ¼³Á¤µµ °¡´ÉÇÔ - BIO : org.apache.coyote.ajp.AjpProtocol - NIO : org.apache.coyote.ajp.AjpNioProtocol - NIO2 : org.apache.coyote.ajp.AjpNio2Protocol - APR : org.apache.coyote.ajp.AjpAprProtocol AJP/1.3
  23. 23. Tomcat ¡Ø http://tomcat.apache.org/tomcat-8.0-doc/config/ajp.html ¡Ø http://tomcat.apache.org/tomcat-8.0-doc/config/http.html#Connector_Comparison ¡Ø http://www.tecbar.net/optimize-tomcat-performance/ • AJP Connector´Â AJP protocolÀ» »ç¿ëÇÏ¿© Tomcat°ú web server¿Í Åë½ÅÇÒ ¶§ »ç¿ëµÇ´Â ÄÄÆ÷³ÍÆ®
  24. 24. Tomcat Logging • JULI Logging Framework »ç¿ë Apache Commons Logging ±â¹ÝÀ¸·Î ±¸Çö ¡æ java.util.logging »ç¿ë (default) extra ÆÐÅ°Áö¸¦ ÅëÇØ Log4j µî Logging Framework º¯°æ °¡´É • JULI Logging Architecture
  25. 25. Tomcat Logging • ClassLoaderLogManager java.util.logging.LogManager¸¦ È®Àå - $CATALINA_BASE/conf/logging.properties ÆÄÀÏ Loading ÇÏ¿©, Tomcat¿¡ Àû¿ë - ClassLoaderÀÇ path¿¡¼­ logging.properties¸¦ ã¾Æ, ClassLoaderº° Log ±¸¼ºÀ» Àû¿ë -> À¥¾îÇø®ÄÉÀÌ¼Ç º° log Configuration ±¸Çö # ----------------------------------------------------------------------------- # LOGGING_MANAGER (Optional) Override Tomcat's logging manager # Example (all one line) # LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager" # ----------------------------------------------------------------------------- if [ -z "$LOGGING_MANAGER" ]; then LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager" fi
  26. 26. Tomcat Logging • logging.properties handlers = 1catalina.org.apache.juli.AsyncFileHandler, 2localhost.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler .handlers = 1catalina.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler ############################################################ # Handler specific properties. # Describes specific configuration info for Handlers. ############################################################ 1catalina.org.apache.juli.AsyncFileHandler.level = FINE 1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs 1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina. 2localhost.org.apache.juli.AsyncFileHandler.level = FINE 2localhost.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs 2localhost.org.apache.juli.AsyncFileHandler.prefix = localhost. ############################################################ # Facility specific properties. # Provides extra control for each logger. ############################################################ java.util.logging.ConsoleHandler.level = FINE java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.AsyncFileHandler
  27. 27. Tomcat Logging • Tomcat Logging Á¾·ù java.util.logging, javax.servlet.ServletContext.log, Console, Access Logging ÀÌ Á¦°øµÊ ±¸ºÐ ¼³¸í ÆÄÀϸí Java Logging API Tomcat¿¡¼­´Â Application´ç ·Î±ë¼³Á¤À» Á¦¾îÇϱâ À§ÇØ java.util.logging ±â¹ÝÀÇ ±¸Çöü JULI¸¦ »ç¿ë logging.properties ÆÄÀÏÀÇ ¼³Á¤¿¡ µû¸§ ex) localhost.yyyy-MM- dd.log Servlets logging API javax.servlet.ServletContext.log(¡¦)¸¦ ÅëÇØ ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÒ ¶§ »ç¿ëµÊ logging.properites ÆÄÀÏÀÇ ¼³Á¤ Áß org.apache.catalina.core.ContainerBase.[${engine}].[${host}].[${context}] ÀÇ ¼³Á¤¿¡ µû¸§ ex) manager.yyyy-MM- dd.log Console Tomcat¿î¿µ ½Ã Ãâ·ÂµÇ´Â STDERR/STDOUT ex) catalina.out Access logging AccessLogValve ¶Ç´Â ExtendedAccessLogValve¿¡¼­ »ý¼ºÇÏ´Â ·Î±× Access Log ValveÀÇ ¼³Á¤¿¡ µû¸§ ex) access_log.yyyy-MM- dd
  28. 28. Tomcat Session Manager • Tomcat Session Manager HTTP ¼¼¼ÇÀ» »ý¼º °ü¸®ÇØÁÖ´Â session manager·Î Context¾È¿¡ ¼³Á¤Çϸç, ¼³Á¤ÀÌ ¾ÈµÇ¾î ÀÖ´Â °æ ¿ì ÀÚµ¿À¸·Î ±âº» ¼³Á¤°ª¿¡ ÀÇÇØ »ý¼ºµÊ (default : org.apache.catalina.session.StandardManager) • Session Manager Á¾·ù ¡Ø http://tomcat.apache.org/tomcat-8.0-doc/config/manager.html ¸¦ Âü°í <Manager classname=¡°org.apache.catalina.session.StandardManager¡± /> ±¸ºÐ ¼³¸í ÆÄÀϸí StandardManager ±âº» ¼³Á¤. ÇÑ°³ÀÇ instance¸¦ »ç¿ëÇÏ´Â °æ¿ì¸¸ Àû¿ë°¡´É org.apache.catalina.sess ion.StandardManager PersistentManager µð½ºÅ© ¶Ç´Â DB¿¡ ¼¼¼ÇÀ» Persist. ¼¼¼Ç ½º¿ÍÇΰú Àå¾Ö ´ëó(fault tolerance) org.apache.catalina.sess ion.PersistentManager DeltaManager All-to-All ¹æ½Ä Session Replication ±â´É ±¸Çö org.apache.catalina.sess ion.DeltaManager BackupManager Primary-Secondary Session Replication ±â´ÉÀ» ±¸Çö org.apache.catalina.sess ion.BackupManager
  29. 29. Tomcat Connnection Pool • TomcatÀº DataBase Connection Pool ·Î Commons DBCP¿Í Tomcat JDBC PoolÀÇ 2°³ Áö PoolÀ» Á¦°ø The Tomcat JDBC Connection Pool (https://tomcat.apache.org/tomcat-8.0-doc/jdbc- pool.html) Commons DBCP (http://commons.apache.org/proper/commons -dbcp/) ¡Ø Tomcat 7.0.18 – extra package·Î Æ÷ÇÔ Tomcat 7.0.19 – Á¤½Ä Release
  30. 30. Tomcat JDBC Connnection Pool • TomcatÀº DataBase Connection Pool ·Î Commons DBCP¿Í Tomcat JDBC PoolÀÇ 2°³Áö PoolÀ» Á¦°ø • Commons DBCP : org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory (default) - org.apache.commons -> org.apache.tomcat. ÆÐÅ°Áö º¯°æ • Tomcat JDBC : org.apache.tomcat.jdbc.pool.DataSourceFactory • DBCP ´Â Apache Commons ÇÁ·ÎÁ§Æ®°¡ Á¦°øÇÏ´Â, DataBase Connection Pool·Î ¿ÀÇ ¼Ò½º DataBase Connection Pool ¸¦ °¡Àå ¸¹ÀÌ ¾Ë·ÁÁ® ÀÖ°í, ¸¹ÀÌ »ç¿ëÇÏ°í ÀÖ´Ù. • Tomcat JDBC´Â Apache Tomcat ÇÁ·ÎÁ§Æ®°¡ µ¶¸³ÀûÀ¸·Î °³¹ßÇÑ DataBase Connection Pool ÀÌ´Ù. <Resource type="javax.sql.DataSource" name="jdbc/TestDB" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/mysql" username="mysql_user" password="mypassword123" />
  31. 31. Tomcat JDBC Connnection Pool ±âº»¼³Á¤ • °øÅë DB Á¢¼Ó ¼³Á¤ ±¸ºÐ ¼³¸í ºñ°í username DB ¿¬°áÀ» À§ÇØ JDBC µå¶óÀ̹ö¿¡ Àü´ÞµÇ´Â »ç¿ëÀÚ À̸§ password DB ¿¬°áÀ» À§ÇØ JDBC µå¶óÀ̹ö¿¡ Àü´ÞµÇ´Â »ç¿ëÀÚ Æнº¿öµå url DB ¿¬°áÀ» À§ÇØ JDBC µå¶óÀ̹ö¿¡ Àü´ÞµÇ´Â ¿¬°á URL driverClassName JDBC µå¶óÀ̹öÀÇ FQCN £¨Fully Qualified Class Name) connectionProperties DB ¿¬°áÀ» À§ÇØ JDBC µå¶óÀ̹ö¿¡ Àü´ÞµÇ´Â ¿¬°á Properties Ç׸ñ ¼³¸í ±âº»°ª defaultAutoCommit »ý¼ºµÈ ConnectionÀÇ ÀÚµ¿ Commit Mode JDBC Dirver ±âº»°ª - Oracle : true - MySQL/MariaDB : true defaultReadOnly »ý¼ºµÈ ConnectionÀÇ ReadOnly JDBC Dirver ±âº»°ª defaultTransactionIsolation »ý¼ºµÈ ConnectionÀÇ TransactionIsolation JDBC Dirver ±âº»°ª defaultCatalog »ý¼ºµÈ ConnectionÀÇ defaultCatalog JDBC Dirver ±âº»°ª ¡Ø Commons DBCP : defaultAutoCommit ÀÇ ±âº»°ªÀº true
  32. 32. • °øÅë DB Á¢¼Ó ¼³Á¤ Ç׸ñ ¼³¸í ±âº»°ª initialSize Pool ±âµ¿ ½Ã »ý¼ºµÇ´Â ConnectionÀÇ Ãʱ⠻çÀÌÁî 10 maxActive Pool¿¡¼­ µ¿½Ã¿¡ À¯ÁöÇÒ¼ö ÀÖ´Â ÃÖ´ë ¿¬°á ¼ö 100 maxIdle Pool¿¡¼­ À¯ÁöÇÏ´Â ÃÖ´ë Connection ¼ö 100 minIdle Pool¿¡¼­ À¯ÁöÇÏ´Â ÃÖ¼Ò Connection ¼ö initialSize maxWait »ç¿ë °¡´ÉÇÑ ConnectionÀÌ Á¸ÀçÇÏÁö ¾Ê´Â °æ¿ì ´ë±âÇÏ´Â ÃÖ´ë½Ã°£ 30,000 (30ÃÊ) maxAge ConnectionÀ» º¸Á¸ÇÏ´Â ½Ã°£. Connection ¹Ýȯ ½Ã¿¡ maxAge ÀÌ»ó °æ°úÇßÀ¸¸é, ÇØ´ç ConnectionÀ» Close ½ÃÅ´ 0 (msc) fairQueue getConnection È£ÃâÀÌ ConnectionÀÌ FIFO¹æ½ÄÀ¸·Î °øÁ¤ÇÏ°Ô Á¦°øÇÏ·Á ¸é true·Î ¼³Á¤. org.apache.tomcat.jdbc.pool.FairBlockingQueue ·Î ±¸Çö µÇ¾î ÀÖÀ¸¸ç, ¾²·¹µå°¡ µµÂøÇÑ ¼ø¼­´ë·Î ConnectionÀ» ȹµæÇÏ´Â °ÍÀÌ º¸ ÀåµÊ true
  33. 33. Tomcat JDBC Connnection Pool ±âº»¼³Á¤ • Connection Validation °ü·Ã ¼³Á¤ Ç׸ñ ¼³¸í ±âº»°ª validationQuery Connection À¯È¿¼º È®ÀÎÀ» À§ÇÑ SQL Query MySQL/MariaDB : SELECT 1 Oracle : SELECT 1 FROM DUAL testOnBorrow Pool¿¡¼­ ²ô³½ ConnectionÀ» Àü´ÞÇϱâ Àü¿¡ À¯È¿¼ºÀ» °ËÁõ °ËÁõ¿¡ ½ÇÆÐÇßÀ» °æ¿ì, ÇØ´ç ¿¬°áÀ» »èÁ¦ÇÏ°í, »õ·Ó°Ô Pool¿¡¼­ ConnectionÀ» ²ô³»·Á°í ½Ãµµ False, true ¼³Á¤½Ã validationQuery ÇÊ¿ä testOnReturn Pool¿¡ ConnectionÀ» ¹ÝȯÇϱâ Àü¿¡ ConnectionÀÇ À¯È¿¼ºÀ» °ËÁõ false, true ¼³Á¤½Ã validationQuery ÇÊ¿ä testWileIdle Idle »óÅÂÀÇ Connection ¿¡ ´ëÇÑ À¯È¿¼ºÀ» °ËÁõ °ËÁõ¿¡ ½ÇÆÐÇÒ °æ¿ì ÇØ´ç ConnectionÀ» ÆıâÇÔ À̱â´ÉÀº Evictor ¸¦ ÀÌ¿ëÇϱâ ??¹®¿¡ Evictor¸¦ È°¼ºÈ­ ÇØ¾ßµÊ (timeBetweenEvictionRunsMillis ¼³Á¤ ÂüÁ¶) false, true ¼³Á¤½Ã validationQuery ÇÊ¿ä initSQL ConnectionÀ» ¸¸µé?? ½ÇÇàµÇ´Â SQL Query validationClassName Validation Class¸íÀ» ÁöÁ¤. ÀÌ ¼Ó¼ºÀ» ÁöÁ¤ ½Ã validationQuery¿¡ ÀÇÇÑ °ËÁõ ´ë½Å, Validator Class¿¡ ÀÇÇÑ ¿¬°áÀÇ °ËÁõÀÌ ÀÌ·ç¾îÁü (org.apache.tomcat.jdbc.pool.Validator ÀÎÅÍÆäÀ̽º ±¸Çö ÇÊ¿ä) validationInterval ValidationÀÇ ½ÇÇà °£°Ý ÁöÁ¤. ¸¶Áö¸· °ËÁõÀ¸·ÎºÎÅÍ ÀÌ °ª ÀÌ»ó °æ°úÇÏÁö ¾ÊÀº °æ¿ì ¿¬°á °ËÁõÀ» °Å Ä¡Áö ¾ÊÀ½ 30000 (30ÃÊ) logValidationErrors ValidationÁß ¿À·ù ¹ß»ý½Ã, ·Î±× Ãâ·ÂÇÒÁö¿¡ ´ëÇÑ ¼³Á¤ false
  34. 34. • PoolCleaner °ü·Ã ¼³Á¤ (Evictor) Ç׸ñ ¼³¸í ±âº»°ª timeBetweenEvictionRunsMilles Idle »óÅÂÀÇ Connection À» check ÇÏ´Â °£°Ý, 5,000 (5ÃÊ) minEvictableIdleTimeMillis Idle ConnectionÀÇ »ýÁ¸ ±â°£ 60,000(60ÃÊ) * Commons DBCPÀÇ ¼Ó¼º Áß numTestsPerEvictionRun ¼Ó¼º »èÁ¦ • Connection Leak °ËÃâ ¼³Á¤ (removeAbandoned) • PoolCleaner °ü·Ã ¼³Á¤ (removeAbandoned) Ç׸ñ ¼³¸í ±âº»°ª removeAbandoned Connection ´©¼ö °¨Áö ¼³Á¤ »ç¿ë ¿©ºÎ false removeAbandonedTimeout Connection ´©¼ö·Î ÆÇ´ÜÇϱâ±îÁöÀÇ ½Ã°£ 60 ÃÊ logAbandoned Connection ´©¼ö¸¦ °¨ÁöÇßÀ» ¶§, ConnectionÀ» CloseÇÏÁö ¾ÊÀº ¾îÇà ¸®ÄÉÀ̼ÇÀÇ Stuck Thread¸¦ ·Î±×·Î Ãâ·Â ¿©ºÎÀÇ ¼³Á¤ false suspectTimeout Connection ´©¼öÀÇ Àǽɿ¡ ´ëÇÑ ÆÇ´Ü ÇÒ¶§±îÁöÀÇ ½Ã°£ suspectTimeout ½Ã°£À» ÃÊ°úÇÑ Connection¿¡ ´ëÇØ °æ°í ·Î±× ¹× JMX ¿¡ ÅëÁö¸¦ ¼öÇà 0 abandonWhenPercentageFull ´©¼öµÈ Connection À» ÆıâÇÒ ºñÀ²À» ¼³Á¤ 0~100 »çÀÌ·Î ¼³Á¤Çϸç, ÀÌ ¼³Á¤À» ÃÊ°úÇÑ ´©¼ö ConnectionÀ» Æıâ, removeAbandonedTimeout°¡ ÃÊ°úÇÑ ConnectionÀº ¸ðµÎ Æıâ. 0
  35. 35. • DataSouce Resource ¼³Á¤ <Resource name="${jdbc.resource.name}" factory=¡°org.apache.tomcat.jdbc.pool.DataSourceFactory" auth="Container" type="javax.sql.DataSource" username="${jdbc.username}" password="${jdbc.password}" driverClassName="${jdbc.driverClassName}" url="${jdbc.url}" testWhileIdle="true" testOnBorrow="true" testOnReturn="false" validationQuery="SELECT 1" validationInterval="30000" timeBetweenEvictionRunsMillis="5000" maxActive="100" minIdle="10" maxWait="10000" initialSize="10" removeAbandonedTimeout="60" removeAbandoned="true" logAbandoned="true" minEvictableIdleTimeMillis="30000" jmxEnabled="true" jdbcInterceptors="ConnectionState;StatementFinalizer;SlowQueryReportJmx(threshold=10000)"/>
  36. 36. • Global Resource Level ¡æ DataSource Pool Global level °øÀ¯ • Global Resource(server.xml) + Resouce Link(application-context.xml) ¡æ ÇØ´ç Application ¿¡¼­¸¸ »ç¿ë °¡´É • Global Resource(server.xml) + Resouce Link(Global context.xml) ¡æ ¸ðµç Application¿¡¼­ »ç¿ë °¡´É • Context Level ¡æ DataSource Pool ÇØ´ç Context º° »ý¼ºµÊ • Global Context (context.xml) ¡æ ¸ðµç Application¿¡¼­ »ç¿ë °¡´É • Application Context (application-context.xml) ¡æ ÇØ´ç Application¿¡¼­¸¸ »ç¿ë °¡´É
  37. 37. • Global Resource Level (+ Resouce Link) • Server : ${CATALINA_HOME}/conf/server.xml • Context(1) : ${CATALINA_HOME}/conf/context.xml • Context(2) : ${CATALINA_HOME}/conf/Catalina/localhost/${CONTEXT_NAME}.xml <Server port="${port.shutdown}" shutdown="ARGO_INSTANCE_SHUTDOWN"> <GlobalNamingResources> <Resource name="jdbc/argo" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://10.0.1.88:3306/oom" username="root¡° password="uCO5FkZ3NfgDo/LWB0l+0A==" ¡¦¡¦ /> </GlobalNamingResources> </Server> <?xml version="1.0" encoding="utf-8" standalone="no"?> <Context> <WatchedResource>WEB-INF/web.xml</WatchedResource> <ResourceLink global="jdbc/argo" name="jdbc/argo" type="javax.sql.DataSource"/> </Context> <?xml version="1.0" encoding="UTF-8" standalone="no"?> <Context docBase="/sorc001/argo/application/sample-simpleweb" path="/" reloadable="false"> <ResourceLink global="jdbc/argo" name="jdbc/argo" type="javax.sql.DataSource"/> </Context>
  38. 38. • Context Level • Context(1) : ${CATALINA_HOME}/conf/context.xml • Context(2) : ${CATALINA_HOME}/conf/Catalina/localhost/${CONTEXT_NAME}.xml <?xml version="1.0" encoding="UTF-8" standalone="no"?> <Context> <WatchedResource>WEB-INF/web.xml</WatchedResource> <Resource name="jdbc/argo" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://10.0.1.88:3306/oom" username="root¡° password="uCO5FkZ3NfgDo/LWB0l+0A==" ¡¦¡¦ /> </Context> <?xml version="1.0" encoding="UTF-8" standalone="no"?> <Resource name="jdbc/argo" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://10.0.1.88:3306/oom" username="root¡° password="uCO5FkZ3NfgDo/LWB0l+0A==" ¡¦¡¦ /> </Context>
  39. 39. • Commons DBCP ´Â Single Thread¸¦ »ç¿ëÇÑ´Ù. ±×·¡¼­ Thread°¡ ¾ÈÀüÇÒ ¼ö ÀÖµµ·Ï Àüü Ç® (pool) ¿¡ ´ëÇؼ­ lockÀ» °Ç´Ù. ¸ÖƼ ÄÚ¾î/CPU ȯ°æ¿¡¼­ ¼º´ÉÀÌ ¶³¾îÁø´Ù. (´À¸®´Ù) ¡æ (not DBCP 2.x) • Commons DBCP ´Â º¹ÀâÇÏ´Ù. Commons DBCP ´Â °ü¸®ÇØ¾ß ÇÒ Å¬·¡½º°¡ 60¿©°³, Tomcat Àº 8 °³ÀÇ ÇÙ½ÉŬ·¡½º¸¸ »ç¿ëÇÑ´Ù. • Tomcat JDBC´Â Common DBCP ¿¡¼­ Å©°Ô º¯°æ ¾øÀÌ ÀüȯÀÌ °¡´ÉÇϸç, Ãß°¡ÀûÀ¸·Î JMX Áö¿ø È®Àå µîÀ¸·Î ¿ÜºÎ¿¡¼­ Connection Validation, JdbcInterceptor¸¦ ÅëÇÑ DBó¸®ÀÇ µ¶¸³ÀûÀΠó¸® Ãß°¡ ±â´É µî ´Ù¾çÇÑ ±â´ÉÀÌ Ãß°¡µÇ¾î ÀÖÀ½ • ¼Ò½º Äڵ嵵 Common DBCP¿¡ ºñÇØ, »ó´çÈ÷ °£´ÜÇϸç, ¸±¸®Áîµµ Tomcat °ú µ¿½Ã¿¡ µÇ±â ¶§¹®¿¡, ¹ö±× ¼öÁ¤ µî À¯Áö º¸¼ö¿¡ ´ëÇÑ ¾ÈÁ¤¼º/½Å·Ú¼ºÀ» Á¦°øÇÔ. ¡Ø Commons DBCP vs Tomcat JDBC : http://vigilbose.blogspot.kr/2009/03/apache-commons-dbcp-and-tomcat-jdbc.html http://people.apache.org/~fhanik/tomcat/jdbc-pool.html
  40. 40. Jasper • Jasper¶õ TomcatÀÇ JSP¿£ÁøÀ¸·Î, JSP¸¦ ÄÄÆÄÀÏÇϱâ À§ÇÑ ÄÄÆ÷³ÍÆ® • JSPC(JSP to Servlet), JavaC(Servlet to Class) ¼öÇà
  41. 41. Jasper • ¸ðµç JSP ÆÄÀÏÀº org.apache.jasper.servlet.JspServlet °ú Servlet ¸ÅÇεǾî ÀÖÀ½. <servlet> <servlet-name>jsp</servlet-name> <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> <init-param> <param-name>fork</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>xpoweredBy</param-name> <param-value>false</param-value> </init-param> <!-- <init-param> <param-name>checkInterval</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>development</param-name> <param-value>true</param-value> </init-param> --> <load-on-startup>3</load-on-startup> </servlet> <!-- The mappings for the JSP servlet --> <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.jsp</url-pattern> <url-pattern>*.jspx</url-pattern> </servlet-mapping>
  42. 42. • Á¤Àû ÆÄÀÏÀÇ Ã³¸® • Static Contents¿¡ ´ëÇÑ ¼º´É • Apache HTTP ServerÀÇ ´Ù¾çÇÑ ¿É¼Ç ¹× ±â´É È°¿ë (Access Control, Contents Caching, Filter µî) • ºÎÇÏ ºÐ»ê • »ç¿ëÀÚ ¿äû¿¡ ´ëÇÑ ºÎÇÏ ºÐ»ê • WEB + WAS¿¡ ´ëÇÑ ºÎÇÏ ºÐ»ê • Àå¾Ö ´ëÀÀ • Fail Over • Fail Back • ±âŸ • º¸¾È (Security)
  43. 43. • À¥¼­¹ö ¿¬µ¿ ¹æ¹ý • mod_proxy - http://httpd.apache.org/docs/2.4/mod/mod_proxy.html • mod_jk - http://tomcat.apache.org/connectors-doc/ • mod_cluster - http://mod-cluster.jboss.org/ • ¿¬µ¿¹æ¹ý ºñ±³ Ç׸ñ Ư¡ ºñ°í mod_proxy • Protocal(http, https, ajp)¿¡ °ü°è¾øÀÌ ¿¬µ¿ °¡´É • Apache HTTP Server ¿¡ ¸ðµâ·Î Æ÷ÇԵǾî ÀÖ¾î, º°µµ ¼³Ä¡ ¹× °ü¸®°¡ ÇÊ¿ä ¾øÀ½ • ±âº»ÀûÀÎ Load Balancer ±â´É Á¦°ø • Apache HTTP Server ÇÁ·ÎÁ§Æ®¿¡¼­ Á¦°ø mod_jk • Áøº¸µÈ Load Balancer ±â´É Á¦°ø • Áøº¸µÈ Àå¾Ö °¨Áö ±â´É Á¦°ø • Apache Tomcat ÇÁ·ÎÁ§Æ®¿¡¼­ Á¦°ø • Àû¿ë »ç·Ê ¸¹À½ mod_cluster • µ¿ÀûÀ¸·Î worker(Tomcat) Ãß°¡°¡ °¡´É • worker »óÅ¿¡ µû¸¥ Load Balancing °¡´É • JBOSS ¿¬µ¿À» À§ÇÑ ¸ðµâ (Tomcatµµ ¿¬µ¿ °¡´É) • Àû¿ë »ç·Ê°¡ ¸¹Áö ¾ÊÀ½
  44. 44. • Tomcat ÇÁ·ÎÁ§Æ®¿¡¼­ Á¦°øÇÏ´Â À¥¼­¹ö ¿¬µ¿ ¸ðµâ • Document : http://tomcat.apache.org/connectors-doc/ • Download : http://tomcat.apache.org/download-connectors.cgi • mod_jk ±â´É • worker °¨½Ã ±â´É (CPing/CPong) • Connection Pooling • Sticky Session • Retry (Recovery) • Load banance • worker Status °ü¸® • Àû¿ë ¾ÆÅ°ÅØó
  45. 45. • mod_jk Àû¿ë ¹æ¾È • mod_jk ¼³Ä¡ ¹× ¼³Á¤ (httpd.conf) • worker Á¤ÀÇ (worker.properties) • WEB-WAS ¿äû ¸ÅÇÎ Á¤ÀÇ (uriworkermap.properties) • mod_jk ¼³Á¤ LoadModule jk_module modules/mod_jk.so <IfModule mod_jk.c> JkWorkersFile ${INSTALL_PATH}/conf/extra/workers.properties JkLogFile "|${ENGN_HOME}/bin/rotatelogs ${INSTALL_PATH}/logs/jk.log_%Y%m%d 86400 +540" JkLogLevel error JkLogStampFormat "[%a %b %d %H:%M:%S %Y]" JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories JkShmFile ${INSTALL_PATH}/logs/jk.shm JkMountFile ${INSTALL_PATH}/conf/extra/uriworkermap.properties </IfModule> <Location /jk-status/> JkMount jkstatus Order deny,allow Deny from all </Location>
  46. 46. • worker Á¤ÀÇ worker.list=${SERVER_LB_ID},jkstatus worker.template.type=ajp13 worker.template.lbfactor=1 worker.template.socket_timeout=300 worker.template.socket_keepalive=True worker.template.connect_timeout=30000 worker.template.connection_pool_size=128 worker.template.connection_pool_minsize=32 worker.template.connection_pool_timeout=20 ######################################### ## Worker for Tomcat ######################################### worker.argow_8180_hostname.reference=worker.template worker.argow_8180_hostname.host=127.0.0.1 worker.argow_8180_hostname.port=8009 ######################################### ## Load Balancer ######################################### worker.${SERVER_LB_ID}.type=lb worker.${SERVER_LB_ID}.balance_workers=argow_8180_hostname worker.${SERVER_LB_ID}.sticky_session=1 worker.jkstatus.type=status
  47. 47. • ¿äû ¸ÅÇÎ Á¤ÀÇ /*.jsp|/=${SERVER_LB_ID} /*.do|/=${SERVER_LB_ID}
  48. 48. • status typeÀÇ Worker ¼³Á¤½Ã Status Worker·Î µ¿ÀÛÇÔ • Status Worker´Â workerÀÇ »óÅ ¸ð´ÏÅ͸µ ¹× mod_jkÀÇ ¼³Á¤ Á¤º¸¸¦ °ü¸®ÇÏ´Â ±â´É Á¦°ø
  49. 49. • Clustering • ´Ù¼öÀÇ ¼­¹ö¸¦ ¿¬°áÇÏ¿©, ÇϳªÀÇ ¼­¹ö·Î º¸ÀÌ°Ô ÇÏ´Â ±â¼ú • Clustering ¸ñÀû : ºÎÇÏ ºÐ»ê, ¼º´É Çâ»ó, °¡¿ë¼º Çâ»ó, Fail-over • Tomcat Clustering • Cluster Load Balance (with Apache HTTP Server) • Cluster Membership • Session Replication
  50. 50. • Clustering Arcihitecture
  51. 51. • Cluster Architecture Cluster Channel - cluster groupÀÇ communication °ü¸®¸¦ ´ã´ç. Manager - Cluster ȯ°æ¿¡¼­ÀÇ Session Manager¸¦ ¼³Á¤. Membership - Multicast(default) ¹æ½ÄÀ¸·Î cluster groupÀÇ ³ëµå Ãß°¡/»èÁ¦¿¡ ´ëÇÑ °øÁö¸¦ Ã¥ÀÓÁü. Receiver - Member°¡ º¸³»¿À´Â Message receiveÇÔ. Sender- ¿ÜºÎ·Î ³ª°¡´Â Message¸¦ °ü¸®. Valve - Request°¡ Servlet Container ÃâÀÔÇÏ´Â ½ÃÁ¡¿¡ Track.(Tomcat Valve¿Í µ¿ÀÏ) ClusterListener - Cluster GroupÀÇ Message send/receive ½ÃÀÇ Track. Interceptor - Message sendÇÒ ¶§ interceptor stackÀ» °Åħ. (Send Àü Message¸¦ º¯°æ ÇÒ ¼ö ÀÖÀ½) Deployer - Application Deploy¸¦ cluster ´ÜÀ§·Î °¡´ÉÇÏ°Ô ÇØÁÜ.
  52. 52. • Cluster Session Manager Á¾·ù ±¸ºÐ ¼³¸í ÆÄÀϸí DeltaManager • All-to-All session replication • Default Session Manager in Cluster environment • For small cluster org.apache.catalina.sessi on.DeltaManager BackupManager • Primary-Secondary session replication • For large cluster org.apache.catalina.sessi on.BackupManager
  53. 53. • Session Replication • Failover Load Balancer Load Balancer Session (Primary)
  54. 54. • Node Recovery
  55. 55. • Session Replication (create) • Session Replication (destroy) Entry • Primary: Tomcat #1 • Backup: Tomcat #2 • Key: JsessionId • Value: Session (Value´Â Primary/Backup Node¸¸ µ¿±âÈ­ µÈ °ªÀ» °¡Áö°í ÀÖ´Ù. Proxy´Â null)
  56. 56. • Failover Node Failure ¡æ Tomcat1 • Access to Primary node Entry • Primary: Tomcat #2 • Backup: Server #3 • Key: JsessionId • Value: Session (Value´Â Primary/Backup Node¸¸ µ¿±âÈ­ µÈ °ªÀ» °¡Áö °í ÀÖ´Ù. Proxy´Â null)
  57. 57. • Access to Backup node • Accessto Proxy node
  58. 58. • Configuration Tomcat ClusteringÀ» À§Çؼ­´Â conf/server.xml ÀÇ <Engine> ¶Ç´Â <Host> ¿¡ ¼³Á¤ÇÑ´Ù. <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> À§ ¼³Á¤Àº ¾Æ·¡¿Í µ¿ÀÏÇÏ´Ù. <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8"> <Manager className="org.apache.catalina.ha.session.DeltaManager¡° expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/> <Channel className="org.apache.catalina.tribes.group.GroupChannel"> <Membership className="org.apache.catalina.tribes.membership.McastService¡° address="228.0.0.4¡± port="45564¡± frequency="500¡± dropTime="3000"/> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver¡° address="auto¡° port="4000¡± autoBind="100¡° selectorTimeout="5000" maxThreads="6"/> <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> </Sender> <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/> </Channel> <Valve className="org.apache.catalina.ha.tcp.ReplicationValve¡° filter=""/> <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/> <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer¡± tempDir="/tmp/war-temp/¡° deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/¡° watchEnabled="false"/> <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"> </Cluster> Session Manager ¼³Á¤ •DeltaManager •BackupManager µ¿ÀÏ Cluster GroupÀ¸·Î ¼³Á¤ÇÏ ±â À§Çؼ­´Â address¿Í port (Multicase ÁÖ¼Ò) °¡ µ¿ÀÏÇØ¾ß ÇÔ. Cluster Message¸¦ ¹Þ´Â Receiver ¼³Á¤ Port´Â Ãæµ¹¹æÁö¸¦ À§ÇØ ÀÚµ¿ bind. port <= ÀÚµ¿¼³Á¤µÈport < port + autoBind Http Request Áß data º¹Á¦ ¿©ºÎ¸¦ ¼³Á¤. txt, html µî ÀÏ ¶© sessionÀÌ º¯ °æµÇÁö ¾ÊÀ¸¹Ç·Î filter¿¡ ¼³Á¤ÇÏ¸é µÊ. mod_jk Failover¸¦ ½èÀ» °æ¿ì, sessionId µÚÀÇ jvmRoute °ªÀ» ¹Ù²ãÁÜ. Ãß°¡·Î, Application/WEB-INF/web.xml ¿¡ <distributable/> À» Ãß°¡ÇØÁØ´Ù.
  59. 59. • JVM Àü¹Ý¿¡ ´ëÇØ ¸ð´ÏÅ͸µÀ» Á¦°øÇÏ´Â Åø • JVM¿¡ Æ÷ÇÔ($JAVA_HOME/bin/jvisualvm )µÇ¾î ÀÖÀ¸¸ç, °ø½Ä ȨÆäÀÌÁö¿¡¼­µµ ´Ù¿î·Îµå °¡´É (http://visualvm.java.net/) • Á¦°ø ±â´É • Display local and remote Java applications • Display application configuration and runtime environment • Monitor application threads, application performance and memory consumption • Take and display thread dumps • Take and browse heap dumps
  60. 60. https://github.com/scouter-project/scouter • 2015.7.1 initial commit • Apache 2 License • Java/Scala/Eclipse-RCP
  61. 61. MYSQL(DB) Tomcat(App.) Browser(User) agent.java agent.host Collector agent.host CPU, MEM, DISK Heap, TPS ResTime Service Profile Client
  62. 62. Active Service & Control Indivisual Request Service Perf. & Profile Top-Stack Frequecy Resource Usage & Service Perf.
  63. 63. Recent User TPS Avg Res. Time CPU Usage Active Service Heap Usage XLog Monitoring Objects
  64. 64. • L»ç´Â ¿Â¶óÀÎ ºñÁî´Ï½º ¸ÅÃâ Áõ´ë·Î ½Ã½ºÅÛ Áõ¼³ ¼ö¿ä°¡ ÀÖ¾úÀ¸¸ç, ±âÁ¸ Unix ¹× »ó ¿ë WEB/WAS·Î´Â ¸¹Àº ÅõÀÚºñ°¡ ¹ß»ýÇÏ°Ô µÇ¾î, OSSÀÇ Àüȯ • ÀÎÅͳݼîÇθô µî ÃÑ 22°³ ¾÷¹«¸¦ CentOS/Apache/TomcatÀ¸·Î ÀüȯÇÔ
  65. 65. • Tomcat Àüȯ À̽´ & ÇØ°á • HTTPS ¿¡¼­ »ý¼ºµÈ ¼¼¼ÇÀ» HTTP ·Î À̵¿ ½Ã ÀνÄÇÏÁö ¸øÇÏ´Â Çö»ó (¹Ý´ëÀÇ °æ¿ì, Áï HTTP ¿¡¼­ »ý¼ºµÈ ¼¼¼ÇÀº HTTPS ¿¡¼­µµ Á¤»óÀûÀ¸·Î »ç¿ë °¡´É) ¡æ Tomcat Valve Ãß°¡ °³¹ß (HTTPS ¼¼¼Ç »ý¼º ½Ã, HTTP ¼¼¼Ç »ý¼º ±â´É) • JSP ÇÑ±Û ±úÁü ¡æ web.xml ÀÇ jsp-property-group³» page-encoding ¼³Á¤ • DB Password ³ëÃâ ¡æ Tomcat ±âº»ÀûÀ¸·Î DataSource ¼³Á¤ ³» DB Password °¡ Plain Text ·Î ³ëÃâµÇ¾î ÀÖ¾î À̸¦ ¾ÏȣȭÇÏ¿© °ü¸®Çϱâ À§ÇÑ º°µµÀÇ Å¬·¡½º ¹èÄ¡
  66. 66. • Apache Àüȯ À̽´ & ÇØ°á • Tomcat Connector ÀÇ Tomcat VM ´Ù¿î ÀÎ½Ä Áö¿¬ ¡æ OS (VM) ÀÌ ´Ù¿îµÇ¾î ÀÖ´Â °æ¿ì Tomcat Connector °¡ ÀÌ¿¡ ´ëÇÑ ÀνıîÁö Áö¿¬ Çö»ó ¹ß»ý ¡æ ICA (IP Table Control for Apache) Àû¿ëÇÏ¿© ÇØ°áÇÔ • °£ÇæÀû ¼­ºñ½º Áö¿¬ Çö»ó ¹ß»ý ¡æ À̹ÌÁö ¼­¹ö¿¡ mod_expires ¸¦ ÅëÇÑ À̹ÌÁö ºê¶ó¿ìÀú ij½Ã ±â´É Àû¿ë ¡æ js, css ÆÄÀÏ ´ë»óÀ¸·Î mod_deflate Àû¿ëÀ» ÅëÇÑ ¾ÐÃà ±â´É Àû¿ë • ÀÀ¿ë Àüȯ À̽´ & ÇØ°á • <url-pattern> Áߺ¹ ¿À·ù • ÅÂ±× ¶óÀ̺귯¸® ¹öÀü ȣȯ ¿À·ù • JSP include tag »ç¿ë ¿À·ù • »óÀÌÇÑ contentType ¿¡ ÀÇÇÑ ¿À·ù • JSP ³» °ø¹éÀÌ ¾ø¾î ¹ß»ýÇÑ ¿À·ù
  67. 67. • L»ç ¼îÇθô Àüȯ »ç·Ê – ¼º´É ºÐ¼® • ÀÎÅÍ³Ý ¼îÇθô º´Çà ¿î¿µ Áß¿¡ Jeus¿Í TomcatÀÇ ¼­ºñ½º ÀÀ´ä½Ã°£À» Scouter APMÅø·Î ºñ±³Çغ» °á°ú Å« Â÷ÀÌ°¡ ¾øÀ½
  68. 68. • U2L Àüȯ »ç·Ê • ±âÁ¸¿¡ ¼Ò±Ô¸ðÀÇ ºñÇÙ½É ¾÷¹«¿¡¸¸ Àû¿ëÇß´ø OSS¸¦ Áß¿ä/ÇÙ½É ¾÷¹«¿¡µµ Àû¿ëÇÔÀ¸·Î½á ´ë±Ô¸ð Enterpriseȯ°æ¿¡µµ ¾ÈÁ¤ÀûÀÎ ¿î¿µÀÌ °¡´ÉÇÏ´Ù´Â »ç·Ê¸¦ º¸¿© ÁÜ • ±âÁ¸ ¿ÀǼҽº¿¡¼­´Â ºÎÁ·ÇÑ ±â´ÉÀ» º¸¿ÏÇÒ ¼ö ÀÖ´Â Ãß°¡ÀûÀÎ ¼Ö·ç¼ÇÀ» °³¹ßÇÏ¿© Á¦°øÇÔÀ¸·Î½á Ãß°¡ÀûÀÎ °í°´ value¸¦ Á¦°ø °¡´ÉÇÏ¿´À½ • Scale-outÀÌ ¿ëÀÌÇÑ WEB/WAS ½Ã½ºÅÛÀº ¼­¹ö ÇÑ´ëÀÇ ´Ù¿îÀ¸·Î ÀÎÇÑ ¼­ºñ½º ¿µÇâÀÌ °ÅÀÇ ¾ø±â ¶§ ¹®¿¡ Àû±ØÀûÀÎ OSSÀüȯ Àü·« ¼ö¸³ÀÌ °¡´ÉÇØ º¸ÀÓ
  69. 69. • À¥¼­¹ö ¿¬µ¿ À̽´ (mod_jk Fail-over ¸ÞÄ¿´ÏÁò) • WEB¼­¹ö¿¡ sticky·Î µî·ÏµÈ WAS¸¦ Àç½ÃÀÛÇϰųª ¼Ò½º¸¦ ¹èÆ÷ÇÏ´Â °æ¿ì ¼¼¼ÇÀÌ ³ª¸ÓÁö WAS·Î Round Robin¹æ½Ä À¸·Î ºÐ¹èµÇ¾î ºÒÇÊ¿äÇÏ°Ô ¼¼¼ÇÀÌ ´Ã¾î³ª´Â Áõ»óÀÌ ¹ß»ý Internet WAS WEB L4 WEB WAS WAS WAS Internet WAS WEB L4 WEB WAS WAS WAS Á¤»óÀûÀÎ °æ¿ì ¼¼¼ÇÀ» ¸ÎÀº WAS·Î¸¸ Request°¡ Àü´ÞµÊ ¼­¹öÀå¾Ö »óȲÀÎ °æ¿ì, ³ª¸ÓÁö WAS·Î Request°¡ Round RobinÀ¸·Î ºÐ¹è
  70. 70. • mod_jk worker lb(Load Banancer) : was¿Í Á÷Á¢ÀûÀ¸·Î Åë½ÅÇÏÁö´Â ¾Ê°í, ¸â¹ö·Î ÀÖ´Â ½ÇÁ¦ worker¿¡ ´ëÇÑ °ü¸®¸¦ ¼öÇà • lb(Load Banancer) - worker¸¦ ÃʱâÈ­ - load-balancing factor¸¦ ÀÌ¿ëÇÏ¿© ºÎÇϺлê - sticky¼¼¼Ç ó¸® - ƯÁ¤ worker¿¡ Àå¾Ö¹ß»ý ½Ã ´Ù¸¥ worker·Î failover - load balancer¿Í ¸â¹öÀÇ »óÅÂÁ¤º¸¸¦ Á¦°ø .
  71. 71. • Tomcat ¹èÆ÷ÆÇ(¿£Áø) Çϳª ¼³Ä¡, ${CATALINA_BASE} ¸¦ ºÐ¸® • CATALINA_HOME °øÀ¯, CATALINA_BASE ºÐ¸® • ¼­¹ö library °øÀ¯, shell Àç»ç¿ë °¡´É, ¼³Á¤ ºÐ¸® • ÀåÁ¡ : ¼­¹ö ¶óÀ̺귯¸® ¹× ¼³Á¤ ÆÄÀÏ °øÀ¯·Î, °ü¸® Æ÷ÀÎÆ®°¡ ÁÙ¾îµë • ´ÜÁ¡ : ¼­¹ö ¶óÀ̺귯¸® °øÀ¯·Î ÆÐÄ¡ ¹× ¹öÀü ¾÷±×·¹À̵å½Ã Àüü ¼­¹ö¿¡ ¿µÇâÀ» ¹Ìħ Tomcat (CATALINA_HOME) bin conf lib logs temp webapps work Server1(CATALINA_BASE)) Server2(CATALINA_BASE) bin conf lib logs temp webapps work bin conf lib logs temp webapps work Tomcat bin conf lib logs temp webapps work Tomcat(CATALINA_HOME=CATALINA_BASE) bin conf lib logs temp webapps work [ CATALINA_HOME °øÀ¯, CATALINA_BASE ºÐ¸® ¹æ½Ä ][ ¼­¹ö N°³ ¼­¸® ¹æ½Ä ]
  72. 72. • TomcatÀÇ °æ¿ì JAVA ¿É¼Ç ¼³Á¤ ½Ã JAVA_OPTS, CATALINA_OPTS ¸ðµÎ »ç¿ëÇÒ ¼ö ÀÖÀ¸¸ç, Â÷ÀÌ´Â ´ÙÀ½°ú °°À½ • JAVA_OPTS ¡æ ±âµ¿/ÁßÁö ½Ã ¸ðµÎ Àû¿ë ¡æ Catalina Java Options µî ex) • CATALINA_OPTS ¡æ ±âµ¿ ½Ã¿¡¸¸ Àû¿ëµÊ ¡æ JVM Memory Options, Business System Java Options ex) ## JVM Memory Options (tune them) CATALINA_OPTS=" ${CATALINA_OPTS} -Xms2048m -Xmx2048m -XX:MaxPermSize=256m" CATALINA_OPTS=" ${CATALINA_OPTS} -verbose:gc" CATALINA_OPTS=" ${CATALINA_OPTS} -Xloggc:${LOG_HOME}/gc_${INST_NAME}.${DATE}.log" CATALINA_OPTS=" ${CATALINA_OPTS} -XX:+UseParallelGC" CATALINA_OPTS=" ${CATALINA_OPTS} -XX:+UseParallelOldGC" CATALINA_OPTS=" ${CATALINA_OPTS} -XX:-UseAdaptiveSizePolicy" CATALINA_OPTS=" ${CATALINA_OPTS} -XX:+PrintGCDetails" CATALINA_OPTS=" ${CATALINA_OPTS} -XX:+PrintGCDateStamps¡° CATALINA_OPTS=" ${CATALINA_OPTS} -XX:+ExplicitGCInvokesConcurrent" CATALINA_OPTS=" ${CATALINA_OPTS} -XX:+HeapDumpOnOutOfMemoryError" CATALINA_OPTS=" ${CATALINA_OPTS} -XX:HeapDumpPath=${LOG_HOME}/hdump¡° ## Business System Java Options (for your application) ## Catalina Java Options (don't modify them) JAVA_OPTS=" ${JAVA_OPTS} -server" JAVA_OPTS=" ${JAVA_OPTS} -DjvmRoute=${JVM_ROUTE}" JAVA_OPTS=" ${JAVA_OPTS} -Dwas_name=${INST_NAME}" JAVA_OPTS=" ${JAVA_OPTS} -Dport.http=${SERVICE_PORT}" JAVA_OPTS=" ${JAVA_OPTS} -Dport.https=`expr ${SERVICE_PORT} + 363`" JAVA_OPTS=" ${JAVA_OPTS} -Dport.ajp=`expr ${SERVICE_PORT} - 71`" JAVA_OPTS=" ${JAVA_OPTS} -Dport.shutdown=`expr ${SERVICE_PORT} - 75`"
  73. 73. • setenv ½ºÅ©¸³Æ® È°¿ë • Catalina ½ºÅ©¸³Æ® ³»¿¡¼­ setenv ½ºÅ©¸³Æ® ½ÇÇàµÊ • Tomcat ½ÇÇà ½ºÅ©¸³Æ® °ü°è • Catalina ½ºÅ©¸³Æ® setenv.sh shutdown.sh catalina.shstartup.sh daemon.sh setclasspath.sh # ----------------------------------------------------------------------------- # Control Script for the CATALINA Server # # Environment Variable Prerequisites # # Do not set the variables in this script. Instead put them into a script # setenv.sh in CATALINA_BASE/bin to keep your customizations separate. # # ----------------------------------------------------------------------------- if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then . "$CATALINA_BASE/bin/setenv.sh" elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then . "$CATALINA_HOME/bin/setenv.sh" fi
  74. 74. • Tomcat ¼³Á¤ ÆÄÀÏÀ» Template ¹æ½ÄÀ¸·Î »ç¿ë • °øÅë include shell ¿¹Á¦ ex) • Tomcat ¼³Á¤ ÆÄÀÏ (Server.xml) ex) ## Catalina Java Options (don't modify them) JAVA_OPTS=" ${JAVA_OPTS} -server" JAVA_OPTS=" ${JAVA_OPTS} -DjvmRoute=${JVM_ROUTE}" JAVA_OPTS=" ${JAVA_OPTS} -Dwas_name=${INST_NAME}" JAVA_OPTS=" ${JAVA_OPTS} -Dport.http=${SERVICE_PORT}" JAVA_OPTS=" ${JAVA_OPTS} -Dport.https=`expr ${SERVICE_PORT} + 363`" JAVA_OPTS=" ${JAVA_OPTS} -Dport.ajp=`expr ${SERVICE_PORT} - 71`" JAVA_OPTS=" ${JAVA_OPTS} -Dport.shutdown=`expr ${SERVICE_PORT} - 75`" <?xml version='1.0' encoding='utf-8'?> <Server port="${port.shutdown}" shutdown="ARGO_INSTANCE_SHUTDOWN"> ...... <Service name="Catalina"> <Connector port="${port.http}" protocol="HTTP/1.1" server="Server" connectionTimeout="20000" URIEncoding="UTF-8" redirectPort="${port.https}" /> <Connector port="${port.ajp}" protocol="AJP/1.3" server="Server" redirectPort="${port.https}" maxPostSize="-1" maxThreads="256" connectionTimeout="60000" URIEncoding="UTF-8" acceptCount="10" enableLookups="false" tcpNoDelay="true" /> <Engine name="Catalina" defaultHost="localhost"> ...... <Host name="localhost" unpackWARs="true" autoDeploy="false"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="${log.home}" prefix="access_${was_cname}." suffix=".log" pattern="%h %l %u %t &quot;%r&quot; %s %b %D" /> </Host> </Engine> </Service> </Server>
  75. 75. - Tomcat Build - Tomcat È®ÀåÇϱâ
  76. 76. • Tomcat Major Version º° Documentation Á¦°ø • Tomcat8 : http://tomcat.apache.org/tomcat-8.0-doc/ • Tomcat Connectors : mod_jk Documentation – http://tomcat.apache.org/connectors-doc/ • Tomcat Native - http://tomcat.apache.org/native-doc/ • Tomcat Wiki – http://wiki.apache.org/tomcat/FrontPage • Migration Guide – http://tomcat.apache.org/migration.html • Security Report – http://tomcat.apache.org.security.html
  77. 77. • Mailing List Guide : http://tomcat.apache.org/lists.html • Tomcat¿¡ ´ëÇÑ °ø½Ä Mailing List Á¤º¸ Á¦°ø • Mailing List • tomcat-users (users@tomcat.apache.org) – subscribe: users-subscribe@tomcat.apache.org – Tomcat »ç¿ëÀÚ¸¦ À§ÇÑ Mailing List • tomcat-dev (dev@tomcat.apache.org) – subscribe: dev-subscribe@tomcat.apache.org – TomcatÀÇ °³¹ß,±¸Çö ¹× ¼¼ºÎ±â´É¿¡ ´ëÇÑ ³íÀÇÇϱâ À§ÇÑ Mailing List • tomcat-announce (announce@tomcat.apache.org) – subscribe: announce-subscribe@tomcat.apache.org – Tomcat ¸±¸®Áî Á¤º¸ ¹× Ãë¾àÁ¡ Á¤º¸¸¦ Announce Çϱâ À§ÇÑ Mailing List • taglibs-user (taglibs-user@tomcat.apache.org) – subscribe: taglibs-user-subscribe@tomcat.apache.org – Apache Taglibs(http://tomcat.apache.org/taglibs/) »ç¿ëÀÚ¿¡ ´ëÇÑ Mailing List
  78. 78. • Bug Report Guide - http://tomcat.apache.org/bugreport.html • Tomcat Community ´Â ¹ö±× µ¥ÀÌŸº£À̽º·Î Bugzilla¸¦ »ç¿ë • Bugzilla¸¦ ÅëÇÏ¿©, ¹ö±× °Ë»ö ¹× ¹ö±× µî·ÏÀ» ÅëÇÑ ¼öÁ¤ ¿äûÀ» ÇÒ ¼ö ÀÖÀ½