인피니스팬 데이터그리드 플랫폼

Post on 06-May-2015

421 views 8 download

description

Infinispan Data Grid Platform JBUG 2013 10th Anniversary Conference, 9 Nov 2013

Transcript of 인피니스팬 데이터그리드 플랫폼

Data Grid Platform

인피니스팬 소개와 사용 사례

전 재 홍 / Jaehong Cheon

9 Nov 2013

Agenda

Data Grid

Infinispan

Case Study

References

Data Grid

Data Grid

Distributed Cache with persistence – Performance Boost

– Dynamic provisioning

– Fast access to data (in memory) - optionally write-through

– Elasticity

– Fault tolerance

Data Grid – Evolution of distributed caches

– Well-known pattern to boost data access performance and scalability

– Clustered by nature

Cache vs. Data Grid

JSR 107 - Temporary Caching for the Java Platform – read, write, expiry, write-through, distributed-manner

– JBoss Cache

JSR 347 - Data Grids for the Java Platform – query, consistency, map-reducing standard way

– Infinispan

Infinispan

Infinispan

Distributed In-memory key/value Data Grid/ Cache

org.infinispan.Cache Interface

Distributed as Library and Server (from 5.3)

High availability

Elastic

Manageable

Open source

DefaultCacheManager manager = new DefaultCacheManager(); // Cache<Integer, Ticket> cache = manager.getCache(); Cache<Integer, Ticket> cache = manager.getCache(“myCache”);

Architecture: Library

JCP-107 Style Cache just cache with advantages: expiry, j2ee transaction

Library Mode - standalone

Infinispan

JVM

App

Architecture: Library (Clustered)

Library Mode - clustered

Cluster

Infinispan

JVM

App

Infinispan

JVM

App

Infinispan

JVM

App

Application doesn’t know it’s on cluster

Use as library – More features

– Richer APIs

– Programmatic/ Declarative configuration

– Extendable/ embeddable

– Faster (API call)

Architecture: Server

Use as server – Remote

Memcached, REST, Hot Rod, WebSocket

– Data tier shared by multi-apps

– App doesn’t affect cluster

– Non-java clients

C++, .NET, Ruby, Python, Java

Server Mode - clustered

Cluster

Infinispan

JVM

Infinispan

JVM

Infinispan

JVM

App

App

App

Architecture: Durability

Durability – By replication

– By persistence

– By replication to other cluster (topology aware)

Durability

Cluster

Infinispan

JVM

Infinispan

JVM

Cluster

Infinispan

JVM

Infinispan

JVM

persistence

Infinispan: Key Features

Transactions

Persistence

Querying

Map/Reduce

Clustering

Peer-to-Peer – No central master, no single point of failure, no single bottle

neck

JGroups – Reliable multicast communication library, nodes discovery,

sharing data, performing cluster scaling

Consistent Hash – Hash based data distribution

– How it finds where data locates

Linear in nature: throughput, capacity

Cluster Mode

Cluster Mode: Replication(복제)

Replication Mode

Cache on Server 1 K,V

Cache on Server 2 K,V

Cache on Server 4 K,V

Cache on Server 3 K,V

cache.put(K,V)

Cluster Mode: Distribution(분산)

Distribution Mode(numOwners=2)

Cache on Server 1 K,V

Cache on Server 2 K,V

Cache on Server 4

Cache on Server 3

cache.put(K,V)

cache.get(K,V)

Cluster Mode: Invalidation(무효화)

Invalidation Mode

Cache on Server 1 K,V2

Cache on Server 2 K,V

Cache on Server 4

Cache on Server 3

cache.put(K,V2)

DB

Configuration: Declarative

Eviction(제거)

Expiration(만료) – on cache

– on key

<global> <transport clusterName="OperationsCacheCluster"> <properties> <property name="configurationFile“ value="jgroups-tcp.xml" /> </properties> </transport> <globalJmxStatistics enabled="true" /> </global> <default> <clustering mode="replication"> <sync /> </clustering> </default> <namedCache name="secureLayerContextCache"> <eviction strategy="LIRS" maxEntries="2000" /> <expiration lifespan="600000" /> <loaders passivation="true" shared="false" preload="false"> <fileStore fetchPersistentState="true" purgerThreads="3" purgeSynchronously="true" ignoreModifications="false" purgeOnStartup="false" location="${java.io.tmpdir}"> <async /> </fileStore> </loaders> </namedCache>

Configuration: Programmatic Configuration Based on XML DefaultCacheManager manager = new DefaultCacheManager("infinispan-config.xml"); Configuration baseConf = manager.getDefaultCacheConfiguration(); Configuration config =new ConfigurationBuilder(). read(baseConf).expiration().lifespan(50000).build(); manager.defineConfiguration(programmaticCache, config); Cache<String, String> cache = manager.getCache("secureLayerContextCache");

DefaultCacheManager manager = new DefaultCacheManager(); Configuration config = new ConfigurationBuilder() .loaders() .shared(false).passivation(false).preload(false) .addCacheLoader() .cacheLoader(new JdbcStringBasedCacheStore()) .addProperty("connectionFactoryClass","org.infinispan.loaders.jdbc .connectionfactory.ManagedConnectionFactory") .addProperty("datasourceJndiLocation", "java:jboss/datasources/MySQLDS") .addProperty("userName", "root") .addProperty("password", "admin") .async().threadPoolSize(10).build(); manager.defineConfiguration(programmaticCache, config); Cache<String, String> cache = manager.getCache("secureLayerContextCache");

Programmatic configuration

Listener

Listener on CacheManager – Node join/ leave, Cache start/ stop

Cache – CRUD, Eviction/ Passivation

– Rehashing/ Transaction completion @Listener public class SimpleListener { @CacheEntryCreated public void dataAdded(CacheEntryCreatedEvent event) { if (event.isPre()) { System.out.println("Before creating the entry:" + event.getKey()); } else { System.out.println("After creating the entry:" + event.getKey()); } … } DefaultCacheManager manager = new DefaultCacheManager(); manager.addListener(listener); Cache<Integer, Ticket> cache = manager.getCache(); cache.addListener(listener);

Asynchronous APIs

put() and get() and remove() are synchronous – They wait for RPC and Locks (and maybe cache stores)

The asynchronous API returns NotifyingFuture – Events are fired on completion of the operation

NotifyingFuture<String> future = c.removeAsync(key); future.attachListener(new FutureListener<String>() { @Override public void futureDone(Future<String> future) { try { future.get(); System.out.printf ("The entry stored under key %s has been removed.", key); } catch (ExecutionException e) { System.out.printf("Failed to remove %s!", key); } } });

Key Features: Persistence

Used for durability

Cache Store - Persistence Storage – File System, Cloud, Remote, JDBC, JPA, LevelDB, Cassandra,

– HBase, MongoDB, BerkeleyDB, JDBM, REST

CacheLoader, CacheStore(CacheWriter from 6.0)

Write-through, write-behind

Passivation, activation

Store chain

Shared store

Persistence: Passivation/Activation

Passivation – write to persistence when evicted from memory (default)

Activation – read to memory and remove from persistence

Key Features: Transactons

JTA Transaction Support

Support MVCC (Multi-Versioned Concurrency Control)

Isolation Level – READ_COMMITTED (default)

– REPEATABLE_READ

Locking Mode – Optimistic Lock (default)

– Pessimistic Lock

Key Features: Query

JBoss Hibernate Search + Apache Lucene

Query on values

Index Directory – Lucene Directory: in-memory, file system, JDBC

– Infinispan Directory

Distributed queries

Distributed Execution

Executes codes on distributed nodes

Through a standard JDK ExecutorService interface

Use DistributedCallable extends java.util.concurrent.Callable

Key Features: Map/Reduce

Based on Distributed Execution Framework

Mapper, Reducer, Collator, MapReduceTask

public interface Callator<KOut, Vout, R> { R collate(Map<KOut, VOut>); }

public interface Mapper<KIn, VIn, KOut, VOut> extends Serializable { void map(KIn key, VIn value, Collector<KOut, VOut> collector); }

public interface Reducer<KOut, VOut> extends Serializable { VOut reduce(KOut reducedKey, Iterator<VOut> iter); }

Client

Monitoring/Management

Mbeans on CacheManager, Cache

RHQ (JON, JBoss Operations Network)

Spring Integration

Infinispan provider for Spring cache abstraction

infinispan-spring.jar

<cache:annotation-driven cache-manager="operationCacheManager"/> <bean id="operationCacheManager" class="org.infinispan.spring.provider.SpringEmbeddedCacheManagerFactoryBean" p:configurationFileLocation="classpath:infinispan-config.xml" />

@Cacheable(value = "secureLayerContextCache", key="#contextId") public SecureLayerContext getSecureLayerContext(String contextId) { return null; } @CachePut(value = "secureLayerContextCache", key="#contextId") public SecureLayerContext setSecureLayerContext(String contextId, SecureLayerContext secureLayerContext) { return secureLayerContext; } @CacheEvict(value = "secureLayerContextCache", key="#contextId") public void removeSecureLayerContext(String contextId) { // Intentionally blank }

Infinispan on Jboss AS 7

Used for session clustering, Hibernate L2 cache

Application gets cache with JNDI name using @Resource

XML Configuration in server configuration file

<cache-container name="web" aliases="standard-session-cache" default-cache="repl"> <transport lock-timeout="60000" /> <replicated-cache name="repl" mode="ASYNC" batching="true"> <file-store /> </replicated-cache> </cache-container>

JDG

Red Hat JBoss Data Grid

Infinispan-based

JON

All the benefits of subscription, including Red Hat world class support and services

Radar Gun

Data grid and distributed cache benchmarking framework

Built to test Infinispan and other distributed data grid platforms

https://github.com/radargun/radargun

Case Study

Case Study: Session Clustering

Store session information into cache

in Spring MVC Interceptor

Case Study: Session Clustering

- SecurityContextRepository를 구현한

CacheSecurityContextRepository 작성 - loadContext, saveContext를 오버라이드하여

인피니스팬 사용 - Spring cache abstraction 사용

Store session information into cache in Spring Security Filter

Use Cases: Storm Processing State Store

Infinispan Data Grid

References

www.acornpub.co.kr/book/infinispan

infinispan.org

blog.infinispan.org

infinispan-ko.blogspot.com

facebook.com/groups/infinispan

red.ht/data-grid

tedwon.com/display

/dev/Infinispan+Data+Grid

cbcpascal.blogspot.kr

jbugkorea.org