<Insert Picture Here> In-Memory Datagrid Computing mit Oracle Coherence Michael Bräuer Oracle Deutschland B.V. & Co KG The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle. Agenda • Motivation • In-Memory Data Grids • Einführung in Oracle Coherence – Konfiguration und Administration – Entwicklung • Ein Blick auf das Java API • Integration mit Datenbanken • Fragen und Antworten <Insert Picture Here> Motivation Über die Zeit: Wir haben da ein Problem … • Was dann oft schon gemacht wurde: – – – – – Upgrade auf aktuellste Softwarekomponenten Einsatz der aktuellsten Sprach-Features Einsatz optimaler Datenstrukturen und Algorithmen Hardware ist State-of-the-Art Tuning erfolgt regelmäßig • Wo ist das Problem? – Frage nach Kapazität, Latenz, (verteiltem Zugriff) – Analogie: Warteschlange am Flughafenschalter • Benutzer der bedient wird: ―fühlt‖ gute Performanz • Benutzer in Warteschlange ―erfahren‖ weniger gute Performanz <Insert Picture Here> In-Memory Datagrid Definition In-Memory Datagrid • Ein In-Memory Datgrid ist ein [In-Memory] Datenmanagment-System zum Verwalten von Anwendungsobjekten, welche verteilt genutzt werden können. Es zeichnet sich durch – – – – – eine geringe Latenz bei Zugriffen einen hohen Durchsatz vorhersehbare Skalierbarkeit hohe Verfügbarkeit und ein robustes Verhalten aus. In-Memory Datagrid • Kein Allheilmittel • ABER: wird oft unterschätzt: – Brauchen wir nicht – Baue ich mal schnell selber –… • Deshalb: bei jeder Architekturbetrachtung in Diskussion einbeziehen <Insert Picture Here> Einführung in Oracle Coherence Was ist Oracle Coherence? • Eine Java Bibliothek: • ~ 12 MB Download: coherence-java-3.7.0.0b23397.zip • keine Abhängigkeit zu anderen Bibliotheken, ausser JDK (>= 1.5) • Java, .NET, C++ Client API (für .NET und C++ zusätzliche Bibliotheken zum Download) • Coherence Knoten ist JVM Prozess, gestartet mit notwendigen Coherence Java Bibliothek und Konfigurationsdateien • Storageknoten können Daten aufnehmen/verwalten, spezielle Serialisierungsmechanismen sind möglich • Coherence Knoten laufen in Coherence Cluster: dynamische Kapazität, spezielle Protokolle (TCMP) Was ist Oracle Coherence? • Client (Java, .NET, C++) verbindet sich mit Cluster (wird selbst Teil des Verbunds) und iniitiert CRUD Operationen, Berechnungen, Abfragen Dynamisches Hinzufügen/Wegnehmen von Knoten Coherence Cluster Consensus • Coherence Consensus basiert auf – speziellem Network Stack: TCMP – TCMP = The Consensus Management Protocol ;-) – TCMP = Tangosol Coherence Management Protocol • TCMP – Vollständig asynchron, feste Anzahl von Sockets (2+1) und Threads pro JVM (6+1) – unabhängig von Clustergrösse – Server Discovery, Cluster Management, Service Provisioning Data Transmission Begrifflichkeiten • Service: – Menge von Threads für dedizierte Aufgabe – Verschiedene Typen, z.B. Connectivity Services, Processing Services, Cache Services • Cluster: Menge von Services innerhalb eines definierten Verbundes im Netzwerk • Cache: – bildet Schlüssel auf Werte ab – wird mittels Namen referenziert(deshalb interface NamedCache.) – typischerweise geclustert, d.h. Zugriff von jedem Clustermitglied aus Begrifflichkeiten • Backing Map: – Datenstruktur eines Storage-Knotens zum Verwalten des Inhalts von Caches Cache Typen – Replicated Cache • Jeder Knoten hat alle Informationen: für Lesezugreiffe perfekt, aber … Cache Typen – Replicated Cache • Jeder Knoten hat alle Informationen: schreiben aufwendig und Größe limitiert durch Heap Size Cache Typen – Partitioned Cache • = ―distributed cache‖: partitioniert, Load-Balancing, Lokationstransparenz, Failover Cache Typen – Partitioned Cache • = ―distributed cache‖: partitioniert, Load-Balancing, Lokationstransparenz, Failover Cache Typen – Partitioned Cache • = ―distributed cache‖: partitioniert, Load-Balancing, Lokationstransparenz, Failover Cache Typen – Partitioned Cache • = ―distributed cache‖: partitioniert, Load-Balancing, Lokationstransparenz, Failover Cache Typen – Local Cache • Jeder Knoten hat nur Informationen lokal • Keine geclusterten Services • Implementiert gleiche Standard Collections wie geclusterte Caches • Wird in Kombination mit geclusterten Services benutzt Cache Typen – Near Cache • Kombiniert Local Cache mit Distributed Cache Cache Konfiguration • Coherence benutzt XML File zur Konfiguration der Cache Topologie • Zwei Abschnitte – Cache Names mit Mapping auf Cache Schemes – Definition der Cache Schemes • Beim Aufruf von CacheFactory.getCache("name") wird Argument mit Namen im Konfigurationsfile verglichen Cache Konfiguration • coherence.jar beinhaltet coherence-cache-config.xml • Überschreiben mittels: – -Dtangosol.coherence.cacheconfig=my-config.xml – Oder in coherence-tangosol-override*.xml Cluster Konfiguration • coherence.jar beinhaltet coherence-tangosol*.xml • Überschreiben von Parametern mittels: – Java System Properties – coherence-tangosol-override*.xml im Classpath vor coherence.jar oder mittels -Dtangosol.coherence.override • Beispiel: Benutzung von WKAs (Well Known Adresses) anstelle von Multicast Exkurs Serialisierung – Portable Object Format • Vergleich – XML • <date format=―java.util.Date‖>2008-07-03</date> • 47 Zeichen (möglich 94 bytes abhängig vom Encoding) – Java (raw long) • 64 bits = 8 bytes – Java (java.util.Date mit ObjectOutputStream) • 46 bytes – In ExternalizableLite (raw long) • 8 bytes – In POF (portierbares, effizientes Format) • 4F 58 1F 70 6C = 5 bytes Exkurs Serialisierung – Portable Object Format • Eigener Pof Serializer oder Interface com.tangosol.io.pof.PortableObject implementieren: Management • Management basiert vollständig auf JMX • Z.B. Verbindung mit JConsole o.ä. • Dedizierte Knoten, z.B. mit System Properties – -Dcom.sun.management.jmxremote – -Dtangosol.coherence.management=all – -Dtangosol.coherence.management.remote=true • Management Knoten sind Teil des Clusters, deshalb: – -Dtangosol.coherence.distributed.localstorage= false • Gute Integration in Oracle Management Produkte (Enterprise Manager) und Drittparteilösungen • Sehr gute Integration in Oracle GlassFish Server und Oracle WebLogic Server ! <Insert Picture Here> Ein Blick auf das API Clustering Java Prozesse • Cluster beitreten oder neuen Cluster formieren • cluster enthält Information über – – – – Cluster Name Members Locations Processes • Es gibt keinen ―Master Server‖ • Es gibt keine ―Server Registries‖ Cluster cluster = CacheFactory.ensureCluster(); Einen Cluster verlassen • Verlässt den aktuellen Cluster • shutdown blockt bis Daten ―sicher‖ CacheFactory.shutdown(); Benutzen des Caches get, put, size & remove • CacheFactory löst Cache Namen auf (z.B: “mine”) wurde als Cache konfiguriert NamedCache nc = CacheFactory.getCache(“mine”); Object previous = nc.put(“key”, “hello world”); Object current = nc.get(“key”); • NamedCache liefert Topologie-agnostischen Zugriff auf Information • NamedCache Implementierungen implementieren verschiedene Interfaces: – java.util.Map, Jcache, ObservableMap*, ConcurrentMap*, QueryMap*, InvocableMap* int size = nc.size(); Object value = nc.remove(“key”); Coherence* Extensions Benutzen des Caches keySet, entrySet, containsKey • Benutzung eines NamedCache ist analog zu java.util.Map NamedCache nc = CacheFactory.getCache(“mine”); • Was ist gleich/anders? Set entries = nc.entrySet(); – Beide nutzen (key,value) Paare für Einträge – Map Einträge haben kein Ablauf (Expiration) – Maps sind limitiert durch Heap Space – Caches sind typischerweise grössenlimitiert (#Einträge oder Speicher) – Map ist In-Process Set keys = nc.keySet(); boolean exists = nc.containsKey(“key”); Querying Caches QueryMap • Abfragen über NamedCache (Data Grid): – – Parallele Abfragen mit Filter • Ergebnisse können geordnet werden: – – natürliche Ordnung Comparators • Filter liefern umfangreiche Funktionalität ala SQL Where Klausel • Eigene Filter NamedCache nc = CacheFactory.getCache(“people”); Set keys = nc.keySet( new LikeFilter(“getLastName”, “%Stone%”)); Set entries = nc.entrySet( new EqualsFilter(“getAge”, 35)); Überwachen von Veränderungen ObservableMap • Überwachungen von Veränderungen in Echtzeit NamedCache nc = CacheFactory.getCache(“stocks”); nc.addMapListener(new MapListener() { public void onInsert(MapEvent mapEvent) { } • Optionen: Benutzung von Filtern und Lite Events • Verschiedene MapListener stehen zur Verfügung: – Abstract, Multiplexing... public void onUpdate(MapEvent mapEvent) { } public void onDelete(MapEvent mapEvent) { } }); Aggregieren von Information InvocableMap • Aggregierte Werte eines NamedCache im gesamten Cluster (Data Grid): – – Parallele Aggregation mit Filter • Aggregationskonstrukte beinhalten: – Distinct, Sum, Min, Max, Average, Having, Group By • Eigene Aggregate NamedCache nc = CacheFactory.getCache(“stocks”); Double total = (Double)nc.aggregate( AlwaysFilter.INSTANCE, new DoubleSum(“getQuantity”)); Set symbols = (Set)nc.aggregate( new EqualsFilter(“getOwner”, “Larry”), new DistinctValue(“getSymbol”)); Update von Cache Einträgen InvocableMap • Aufruf von EntryProcessor auf einem oder mehreren Einträgen eines NamedCache im Cluster (Data Grid): – NamedCache nc = CacheFactory.getCache(“stocks”); nc.invokeAll( new EqualsFilter(“getSymbol”, “ORCL”), new StockSplitProcessor()); parallel (mit Filter) • Ausführung erfolgt dort, wo sich Einträge befinden, nicht im aufrufenden Thread (Aufruf von invoke) ... class StockSplitProcessor extends AbstractProcessor { Object process(Entry entry) { Stock stock = (Stock)entry.getValue(); stock.quantity *= 2; entry.setValue(stock); return null; } • erlaubt Daten + Processing Affinität } Beispiel EntryProcessor: Gibt es Cache Eintrag … NamedCache nc = CacheFactory.getCache(“entriesManipulated”); Filter filter = new NotFilter(PresentFilter.INSTANCE); Object result = cache.invoke(key, new ConditionalPut(filter, value, true)); … • Aufruf von EntryProcessor effizienter als explizites Locking • Parallelität • Serverseitiger Ablauf <Insert Picture Here> Integration mit Datenbanken Integration mit Datenbanken • CacheLoader, CacheStore: read-through, refreshahead, write-through, write-behind • TopLink Grid: Basis ist das JPA Programmiermodell Read-Through Write-Through Write-Behind Zusammenfassung • Oracle Coherence realisiert In-Memory Datagrid, mit – sehr geringe Latenzzeiten und einem hohen Durchsatz – vorhersehbarer Skalierbarkeit für Lese- als auch Schreibzugriff – hoher Verfügbarkeit – keine Single-Point-of-Failures (SPOF) – schnellem transparentes Failover und Failback – Zugriff auf In-Memory gehaltenen Daten (Objekte) durch verschiedene Programmiersprachen, wie Java, .Net, und C++ – ... • Wertschöpfung in neuen und bestehenden Architekturen Fragen Zusätzliche Information • Coherence Tutorial (Coherence 3.7.1) – http://docs.oracle.com/cd/E24290_01/coh.371/e22622/toc.ht m – http://docs.oracle.com/cd/E24290_01/coh.371/e22622.pdf • Coherence Beispiele – http://docs.oracle.com/cd/E24290_01/coh.371/examples.zip • Downloads und Online Dokumentation (inkl. Java Doc): – http://www.oracle.com/technetwork/middleware/coherence/d ownloads/index.html – http://docs.oracle.com/cd/E24290_01/index.htm <Insert Picture Here> Exkurs TopLink Grid, Coherence*Web TopLink Grid • Idea: use JPA programing model and Coherence • Grid Cache—Coherence as Shared (L2) Cache – Configurable per Entity type – Entities read by one grid member are put into Coherence and are immediately available across the entire grid • Grid Read – All supported read queries executed in the Coherence data grid – All writes performed directly on the database by TopLink (synchronously) and Coherence updated • Grid Entity – All supported read queries and all writes are executed in the Coherence data grid Coherence*Web What: Distributed HTTP Session Management Span Applications: Seamlessly share sessions between applications Scale in Heterogeneous Environments: Manage sessions in WebLogic, Glassfish, WebSphere, JBoss Handle Large Sessions: Store more information within the session Coherence*Web Why: Decouple session management from web container Handle more users without adding more application servers Restart/maintain applications/containers without loosing sessions Handle very large sessions efficiently Keep session data coherent under heavy load