Scaling Hibernate with Terracotta - Presentation Transcript
Scaling Hibernate with Terracotta
Alex Miller (@puredanger)
Architecture and Scale
Applications in Three Tiers
Client
Server
Database
How do we scale?
Client Client Client
Server Server Server
Database
But what about failover?
Option 1: Servers share state
Client Client Client
Server Server Server
Database
How?
• RMI
• JMS
• Custom (JGroups, etc)
Option 2: Database (“stateless”)
Client Client Client
Server Server Server
Database
Stateless == “State in the database”
• Database load
• Serialization to and from the database
• Network bandwidth
• Object / relational mapping due to impedance mismatch
Option 3: Terracotta!
Client Client Client
Server Server Server
Terracotta Terracotta Terracotta
Terracotta
Terracotta
Database Server
Server
Instance
Instance
Why is this better?
• Hub and spoke vs peer to peer
• Avoid object / relational translation
• Avoid serialization
• Reduce database overload
• Programming model you already know
• Focus on your app, not scalability and high availability
What state should go in Terracotta?
Appropriateness Memory Terracotta Database
Data Lifetime
Clustered Heap
App App app = new App();
app.run();
Clustered Heap
App EmployeeManager employeeMgr =
new EmployeeManager();
Employee
Manager
Object lock
Object lock = new Object();
Map<String,Employee> =
new HashMap<String,Employee>();
HashMap
employees
Clustered Heap
App
Employee
" U9 9 4 1 1 "
M anag er
Ob ject lock
Employee.AC T
IV E = = 1
Employee " Gandalf"
HashM ap
employees
Employee employee =
new Employee(
“U99411”,
“Gandalf”,
Employee.ACTIVE);
Configuration
• Roots
• app.App.employeeMgr - a root of the clustered heap
• Instrumented classes
• app.* - instrument app classes at load time
• Locks
• employeeMgr.addEmployee() -> cluster synchronized blocks
Integration Modules
• Pre-built configuration
• Integration with specific 3rd-party libraries
• Hibernate
• Spring
• Ehcache
• Quartz
• Lucene
• many more...
Scaling Hibernate
• Hibernate Second Level Cache
• Clustered detached entities
• Close session, detach entities
• Cluster those entities in Terracotta
• Merge with new session later
Entity and collection caches
• Entity and collection cache regions
• Mark a Hibernate entity or a collection in an entity as @Cacheable
• Specify a cache concurrency strategy
• ReadOnly, ReadWrite, NonstrictReadWrite, Transactional
• Turn on second level caching in the Hibernate config
Query Cache
• Query cache regions
• Mark HQL, Criteria, Query as cacheable
• Store result set id values
• Timestamp cache region - last update time for each entity type
• Useful for caching natural key lookups (non-primary key)
• ...but lots of hidden issues
Terracotta Hibernate Second Level Cache
• Easy integration and configuration
• Supports entity, collection, and query cache regions
• Supports read-only, read-write, and nonstrict-read-write cache
concurrency strategies
• Hibernate-specific tooling
• High performance with cache coherency
Enabling Second Level Cache
• Mark your entities with a cache concurrency strategy
• In hibernate.cfg.xml: <cache usage="read-write"/>
• With annotations: @Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
• hibernate.cfg.xml
• <property name="cache.use_second_level_cache">true</property>
• <property name="cache.provider_class">
org.terracotta.hibernate.TerracottaHibernateCacheProvider</property>
Enabling Second Level Cache
• Define the tc-hibernate-cache.xml in your classpath
<?xml version=”1.0” encoding=”UTF-8”?>
<terracotta-hibernate-cache-configuration>
<default-configuration>
<time-to-idle-seconds>7200</time-to-idle-seconds>
<time-to-live-seconds>7200</time-to-live-seconds>
</default-configuration>
<cache>
<region-name>org.terracotta.authinator.domain.Account</region-name>
<!-- as many region-names here as you want -->
<configuration>
<time-to-idle-seconds>600</time-to-idle-seconds>
<time-to-live-seconds>600</time-to-live-seconds>
</configuration>
</cache>
</terracotta-hibernate-cache-configuration>
• Add the Terracotta Hibernate cache provider jar to your classpath
• -cp terracotta-hibernate-cache-1.0.0.jar
• Add the Terracotta Hibernate cache agent jar to your command line
• -javaagent:terracotta-hibernate-agent-1.0.0.jar
How else is Terracotta used?
• Distributed cache
• Clustered HTTP sessions
• Batch processing
• Grid
• Messaging and events
Who Uses It?
• e-Commerce
• Online gaming
• Financial services
• Travel & leisure
• Social networking
Thanks!
• Terracotta Open Source JVM clustering:
• http://www.terracotta.org
• Apress: “The Definitive Guide to Terracotta”
• by Ari Zilka, Alex Miller, Geert Bevin, Jonas
Boner, Orion Letizi, Taylor Gautier
• Alex Miller
• @puredanger
• http://tech.puredanger.com
Terracotta (an open source technology) provides a c more
Terracotta (an open source technology) provides a clustered, durable virtual heap. Terracotta's goal is to make Java apps scale with as little effort as possible. If you are using Hibernate, there are several patterns that can be used to leverage Terracotta and reduce the load on your database so your app can scale.
First, you can use the Terracotta clustered Hibernate cache. This is a high-performance clustered cache and allows you to avoid hitting the database on all nodes in your cluster. It's suitable, not just for read-only, but also for read-mostly and read-write use cases, which traditionally have not been viewed as good use cases for Hibernate second level cache.
Another high performance option is to disconnect your POJOs from their Hibernate session and manage them entirely in Terracotta shared heap instead. This is a great option for conversational data where the conversational data is not of long-term interest but must be persistent and highly-available. This pattern can significantly reduce your database load but does require more changes to your application than using second-level cache.
This talk will examine the basics of what Terracotta provides and examples of how you can scale your Hibernate application with both clustered second level cache and detached clustered state. Also, we'll take a look at Terracotta's Hibernate-specific monitoring tools. less
0 comments
Post a comment