MulX-‐modelová databáze Caché
Transkript
Mul$-‐modelová databáze Caché Ondřej Hoferek Mo$vace • Spravujeme různorodá data, která vyžadují různý přístup k ukládání • Nabízí se použiH více databází podporujících jeden přístup (polyglot persistence) – např. MySQL pro relační a MongoDB pro dokumentový – Každá z nich má vlastní specifika (architektura, administrace, dotazování, …) – Konzistence, transakce a JOINy napříč různě ukládanými daty? Mo$vace • Ta samá data vyžadují v různých situacích různé přístupy k ukládání – Nárazově ukládám obrovské množství dat ze smart meterů – Později nad těmito daty provádím analy$cké dotazy • SQL, indexy Mul$-‐modelové databáze • Podporují více přístupů k ukládání dat – Relační – Objektový – Key-‐value – Vícerozměrná pole – Sloupcový – Dokumentový – Grafový • NoSQL jako Not only SQL • Často umožňují použiH klasických transakčních modelů Databáze InterSystems Caché • Historicky (od roku 1966) aplikační servery s vlastním programovacím jazykem M (MUMPS) – Integrované úložiště vícerozměrných polí s podporou ACID • InterSystems MUMPS -‐> Caché (1997) – Objektová a SQL nadstavba – Nyní přidávány další modely -‐ dokumentový Vícerozměrné pole v Javě • • • • • • int[][] people = new int[2][5] ; people[0][3] = 25; Pevně daný počet rozměrů Pevně daná velikost jednotlivých rozměrů Číselné indexy V pamě$ Vícerozměrná pole v Caché (globály) • • • • • Persistentní Dynamická Asocia$vní Řídká Setříděná • Hierarchická (stromy) Vícerozměrná pole v Caché -‐ dynamická ^Sample.Person(2) = “Bob” ^Sample.Person = 3 ^Sample.Person(1) = “Alice” ^Sample.Person(3) = “Cindy” • Strukturu ani rozměry není třeba předem deklarovat ani alokovat • Indexům pole říkáme subskripty – Nechceme si plést s DB indexy • ^ je symbol pro uvození názvu globálu Vícerozměrná pole v Caché (globály) ^Sample.Person = 3 ^Sample.Person(1) = $LB(“Alice”, 24) ^Sample.Person(2) = $LB( “Bob” , 26) ^Sample.Person(3) = $LB( “Cindy” , 24) • Globály jsou automa$cky setříděné • $LB je struktura pro list/seznam v Caché Vícerozměrná pole v Caché -‐ asocia$vní ^Sample.Person = 3 ^Sample.Person(1, ”Age”) = 24 ^Sample.Person(1, ”Name”) = “Alice” ^Sample.Person(2, ”Age”) = 26 ^Sample.Person(2, ”Name”) = “Bob” ^Sample.Person(3, ”Age”) = 24 ^Sample.Person(3, ”Name”) = “Cindy” Vícerozměrná pole v Caché -‐ řídká ^Sample.Person(1) = “Alice” ^Sample.Person(2) = “Bob” ^Sample.Person(658) = “Cindy” ^Sample.Person(“crazy”) = “Jeremy” Vícerozměrná pole v Caché (globály) ^Sample.Person = 3 ^Sample.Person(1) = “Alice” ^Sample.Person(1, “loves”) = 2 ^Sample.Person(2) = “Bob” ^Sample.Person(2, “loves”) = 3 ^Sample.Person(3) = “Cindy” Vícerozměrná pole v Caché (globály) ^Sample.Person = 3 ^Sample.Person(1) = $LB(“Alice”, 24) ^Sample.Person(1, “loves”, 1) = 2 ^Sample.Person(2) = $LB(“Bob”, 26) ^Sample.Person(2, “loves”, 1) = 3 ^Sample.Person(3) = $LB(“Cindy”, 24) ^Sample.Person(3, “loves”, 1) = 2 ^Sample.Person(3, “loves”, 2) = 1 Vícerozměrná pole v Caché (globály) ^Sample.Person = 3 ^Sample.Person(1) = $LB(“Alice”, 24) ^Sample.Person(1, “loves”) = 1 ^Sample.Person(1, “loves”, 1) = 2 ^Sample.Person(2) = $LB(“Bob”, 26) ^Sample.Person(2, “loves”) = 1 ^Sample.Person(2, “loves”, 1) = 3 ^Sample.Person(3) = $LB(“Cindy”, 24) ^Sample.Person(3, “loves”) = 2 ^Sample.Person(3, “loves”, 1) = 2 ^Sample.Person(3, “loves”, 2) = 1 Vícerozměrná pole v Caché (globály) ^Sample.Person = 3 ^Sample.Person(1) = $LB(“Alice”, 24) ^Sample.Person(1, “loves”) = $LB(2) ^Sample.Person(2) = $LB(“Bob”, 26) ^Sample.Person(2, “loves”) = $LB(3) ^Sample.Person(3) = $LB(“Cindy”, 24) ^Sample.Person(3, “loves”) = $LB(2, 1) Vícerozměrná pole v Caché (globály) ^Sample.Person = 3 ^Sample.Person(1) = $LB(“Alice”, 24) ^Sample.Person(1, “loves”) = $LB(2) ^Sample.Person(2) = $LB(“Bob”, 26) ^Sample.Person(2, “loves”) = $LB(3) ^Sample.Person(3) = $LB(“Cindy”, 24) ^Sample.Person(3, “loves”, ”a bit”) = $LB(1) ^Sample.Person(3, “loves”, ”a lot”) = $LB(2) Vícerozměrná pole v Caché (globály) ^Sample.Person = 3 ^Sample.Person(1) = $LB(“Alice”, 24) ^Sample.Person(1, “loves”) = $LB(2) ^Sample.Person(2, “loves”) = $LB(3) ^Sample.Person(3) = $LB(“Cindy”, 24) ^Sample.Person(3, “loves”, ”a lot”) = $LB(2) ^Sample.Person(3, “loves”, ”a bit”) = $LB(1) • Žádná schémata ani omezení Manipulace s globály • Knihovny pro rozšířené jazyky/pla|ormy – C++, Java, .Net, JavaScript, … • Integrovaná VM pro vlastní jazyk Caché Object Script (COS) – Objektový – Dynamicky typovaný – Explicitní příkazy (do, set, for, while, …) – PoužiH jako samostatný aplikační server Caché Object Script set a = "hello world" do obj.method() set b = ##class(pkgName.clsName).clsMethod() for i = 1:1:5 { set a(i) = i + 2 } write a write $NOW // systémová funkce write "bye" Manipulace s globály -‐ COS • Příkazy – set ^global = 1 – kill ^global • Reference -‐ funkce – set local = ^global // výjimka, pokud není nastaven – set local = $GET(^global) // bezpečné – set globalExists = $DATA(^global) // test • Iterace -‐ funkce – $ORDER(^global(“”)) // na jedné úrovni v hierarchii – $QUERY(^global(“”)) // zanořování do hierarchie • Sekvence – funkce – $SEQUENCE(^global) // o jedničku – $INCREMENT(^global, increment) // o increment $ORDER vs. $QUERY ^P = 2 ^P(1) = “Alice” ^P(1, “loves”) = 2 ^P(2) = “Bob” $ORDER(^P(“”)) = 1 $ORDER(^P(1)) = 2 $ORDER(^P(1, “loves”)) = “” $ORDER(^P(2)) = “” $QUERY(^P(“”)) = ^P(1) $QUERY(^P(1)) = ^P(1, “loves”) $QUERY(^P(1, “loves”)) = ^P(2) $QUERY(^P(2)) = “” Transakce • Klasická transakční primi$va – Příkazy TSTART, TCOMMIT, TROLLBACK – Vnořené transakce (funkce $TLEVEL) • Zamykání – Příkaz LOCK – Exkluzivní (write), shared (read) – Zámky jsou uvolněny až na konci transakce Persistence globálů • Stromy (≈ B+ stromy) bloků o velikos$ 8kB – Operace s globály v (pseudo) O(1) • Přesněji O(log N) s obrovským základem • Nad 1 TB dat navšHvím maximálně 4 bloky • Bufferování do sdílené pamě$ • Transakční log • Online zrcadlení globálů mezi dvěma instancemi Caché – Jednoduché a robustní řešení pro vysokou dostupnost Objekty v Caché • Typované – Předem dané schéma – Pomocí tříd • Dědičnost – Vícenásobná – Polymorfismus • Dynamické – Bez schématu – Dokumentový model Třídy v Caché Class Sample.Person Extends %Persistent { Property Surname As %String; Property GivenNames As %String; Index SurnameIdx On Surname; Method GetFullName() As %String { … } Storage Default { … } } Třídy v Caché • Balíková strkuktura (Package) – PackageName1.PackageName2.ClassName • Vlastnos$ (Property) – Persistentní – Pouze v pamě$ – Vypočítávané • Vztahy (Rela$onship) – Referenční integrita • Metody – Instance (Method) – Třídy (ClassMethod) • Parametry (Parameter) – ≈ konstanty Základní bázové třídy • %RegisteredObject -‐ Mohou existovat v pamě$, nemohou být uloženy do DB -‐ Metoda %New() -‐ %Persistent -‐ Samy o sobě mohou být uloženy do DB -‐ Automa$cky generovaná ID -‐ Dědí od %RegisteredObject -‐ Metody %OpenId() a %Save() -‐ %SerialObject -‐ Mohou bý uloženy do databáze jako součást persistentního (%Persistent) objektu Persistentní třídy • Indexy – Pro vyhledávání objektů podle jiných atributů než automa$cky generovaného ID • Možnost definice vlastního primárního klíče, unikátních klíčů – Klasické, bitmapy, bitslice, vlastní (API) • Storage – Mapování persistentních vlastnosH a indexů na globál(y) – Generované automa$cky podle definice třídy nebo definované ručně • Triggery – později Mapování objektových dat na globály • Datový globál (primární index) ^PkgName.ClsNameD(ID) = $LB(Prop1, Prop2, …) – Reference na jiné objekty / vztahy – ID • Indexový globál – Klasický ^PkgName.ClsNameI(IdxName, IdxProp1, ..., ID) = $LB(DataProp1, …) – Bitmapa ^PkgName.ClsNameI(IdxName, IdxVal1, …) = bitstring – Bitslice ^PkgName.ClsNameI(IdxName, bit) = bitstring Objekty a transakce • Viz COS práce s tranakcemi • Navíc možnos$ izolace na úrovni objektů – Pro všechny objekty stejná výchozí úroveň – Individuální nastavení při %New() / %OpenId() – 5 úrovní • None • Atomic – pokud je objekt uložen do více globálů, shared lock během otevření a exclusive lock během uložení • Shared -‐ vždy shared lock během otevření a exclusive lock během uložení • Shared & Retained – shared lock od otevření do uvolnění z pamě$, exclusive lock během uložení • Exclusive – exclusive lock od otevření objektu po uvolnění z pamě$ Vyhledávání objektů • Žádný dotazovací jazyk nad objekty • Pouze otevírání objektů podle jejich primárního či unikátního klíče • Vyhledávání podle jiných vlastnosH – Přímý přístup k datovým/indexovým globálům Vyhledávání objektů • Žádný dotazovací jazyk nad objekty • Pouze otevírání objektů podle jejich primárního či unikátního klíče • Vyhledávání podle jiných vlastnosH – Přímý přístup k datovým/indexovým globálům – SQL Caché SQL • Kompilace třídy -‐> vytvoření SQL projekce (tabulky) a mapování na globály – Název tabulky: PkgName1_PkgName2.ClsName • DML – SQL engine při vyhodnocování dotazů prochází datové/indexové globály dle vytvořeného mapování • DDL – Vygenerování odpovídající třídy Specifika Caché SQL • Ve třídach lze vytvářet předdefinované dotazy – Pomocí SQL – Ručně (metody pro execute, fetch a close) • Žádné procedurální rozšíření SQL • Metody/dotazy tříd mohou být volány jako stored procedures / func$ons • Implicitní JOIN (-‐>) pro vztahy SELECT * FROM Sample.Person WHERE Friend-‐>Name = ... Transakce a Caché SQL • SQL příkazy – START/SET TRANSACTION – COMMIT – ROLLBACK – LOCK TABLE • Úrovně izolace – READ UNCOMMITTED – READ COMMITTED Trigerry • V definici třídy – Spuštění pro objekty / tabulky nebo oboje • SQL CREATE TRIGGER – Spouštěno pouze pro SQL • Neexistují triggery pro přímý přístup ke globálům Vytváření schématu • Vytvořím třídu – Mapování na globály a SQL projekce se vytvoří automa$cky • SQL DDL – Odpovídající třída a mapování na globály se vytvoří automa$cky • Navrhnu strukturu globálů – Musím vytvořit třídu a definovat mapování na globály ručně – SQL projekce se vygeneruje automa$cky Caché jako aplikační server • Integrovaná VM pro jazyk COS – Práce s globály a objekty – Objektová (de)serializace z/do XML a JSON – API pro běh SQL – Bohatá aplikační knihovna • REST/SOAP klient & server • Framework pro dynamické HTML & AJAX • Možnost architektury klient (JS) – REST server (Caché) Caché a OLAP • Vestavěný BI Engine DeepSee • Tvorba vícerozměrných kostek – Extrakce dat ze zdrojových tříd/tabulek/globálů – Pravidelná synchronizace dat • Až pseudo real-‐$me BI • Prostředí pro tvorbu pivotů, grafů a reportů • MDX dotazování a REST API • Vyhodnocování PMML modelů Caché a nestrukturovaná data • Vestavěná technologie iKnow • Extrakce konceptů a vztahů mezi nimi bez nutnos$ použiH slovníku • Vhodné pro první krok analýzy dat Caché a integrace • Produkt Ensemble – Nadstavba Caché – Knihovny a uživatelské rozhranní pro správu ESB • REST, SOAP, JMS, HTTP, … – Modelování business procesů – Grafický návrhář datových transformací – Jednododuchý ucelený design Přístup k datům v Caché • Globálové API • En$ty Framework • Hibernate • JDBC, ODBC, ADO.Net • Proxy třídy pro C++, Javu, .Net, Python, Perl – Je důležitá znalost specifik objektů Caché Budoucnost Caché • Sharding – Plnohodnotný SQL a objektový přístup – Podpora transakcí • Podpora dalších modelů – Integrace s SQL – Dokumentový, grafový, key-‐value • Integrace s R • Integrace s UIMA Dokumentový model • Ukládání JSON dokumentů v kolekcích – Dokumenty jsou objekty nebo pole – Přidělené sekvenční ID • Indexování dokumentů – Klasické, bitmapy, vlastní (API) • • • • API pro COS, REST, (Javu, .Net) Integrace JSON do COS SQL/JSON Mapování do globálů je binární – Nelze s nimi přímo manipulovat – Kromě vlastních indexů • Verzování Integrace JSON do COS set obj = { “name” : “Alice” } write obj.name, obj.$get(“name”) set array = [ “Alice”, 1, obj ] write array.$get(1) • Dynamické objekty a pole – Instance %Object a %Array SQL/JSON • Standard v pracovní verzi • JSON_OBJECT, JSON_ARRAY – Vytvoření JSON objektu/pole z tabulky SELECT JSON_OBJECT('FullName': Name, 'DateOfBirth': DOB) FROM Table SELECT JSON_ARRAY(Name, DOB) FROM Table • JSON_TABLE – Dotazy nad kolekcí dokumentů – Vytváří tabulku JSON_TABLE • Kolekce People obsahuje dokumenty ve tvaru { “Name” : String, “Age” : Number} SELECT Name, Age FROM JSON_TABLE('People', '$' COLUMNS (Name VARCHAR(50) PATH '$.Name', Age SMALLINT(3) PATH '$.Age' )) WHERE Age >16 API pro COS, REST Vytváření, mazání a výpis kolekcí Vytváření, úprava a mazání indexů pro kolekce Vytváření dokumentů Úprava, nahrazování a mazání dokumentů dle ID • Dotazování dokumentů s podmínkami alá JSON_TABLE • • • • – Vrací celé dokumenty, ne tabulku Databáze Caché • Úložiště vícerozměrných polí (globálů) • Jednotné mapování pro objekty a SQL • Separátní mapování pro dokumenty – Integrace dokumentů v SQL (SQL/JSON) – Dynamické objekty • • • • Podpora transakcí a různých úrovní izolace Vestavěný aplikační server (REST rozhraní, …) Vestavěný (pseudo) real-‐$me BI modul Integrační pla|orma Ensemble jako nadstavba Caché Kdy použít Caché • Řídká vícerozměrná pole vys$hují charakter ukládaných dat – Hierarchie – Hodně vztahů mezi en$tami • Je třeba využít různé modely pro ukládání dat a eventuelně zaručit transakční zpracování • Dokážu využít vysokou míru přizpůsobení – Nízkoúrovňový přístup k datům, vlastní indexy • Chci zaručit vysokou dostupnost databáze • Zjednodušení architektury aplikace – Caché jako aplikační server Děkuji za pozornost • Ondřej Hoferek – [email protected] – +420 244 466 773 • docs.intersystems.com • community.intersystems.com • learning.intersystems.com
Podobné dokumenty
e-book - Smartsupp
zákazníky na webových stránkách. Později si ale uvědomí, že ne všichni zákazníci chtějí na chatu
komunikovat anebo je dotazů zase příliš mnoho a nestíhají na ně reagovat. V nejhorším případě chat
z...
Kolonie
Našetřit své žalostné úspory ho stálo sedmnáct let poctivé šetrnosti a
lakotného sebezapření. O všechno přijít se mu podařilo za podstatně méně než
sedmnáct minut.
Takže Eddie O'Hare je v hotelovém...
Dodatek č. 1/2013/1 - Státní fond dopravní infrastruktury
d) na úhradu ostatních výdajů jmenovitých akcí, u nichž je uzavřena Rámcová smlouva,
nebo jmenovitých akcí připravovaných ke spolufinancování z fondů EU v rámci
OPD, pro něž není ještě uzavřena Rám...
Dodatek č. 1/2014/2 - Státní fond dopravní infrastruktury
Rámcová smlouva, nebo jmenovitých akcí připravovaných ke spolufinancování
z fondů EU v rámci OPD2, pro něž není ještě uzavřena Rámcová smlouva, ale jsou
zařazeny do akcí spolufinancovaných z fondů ...
média ve věku globalizace: náhled do diskurzu
hmatatelný, více méně kompaktní a historicky distinktivní fenomén, který radikálně mění
dosavadní struktury ekonomických, politických i sociálních vztahů. Sociologie globalizace
v této souvislosti ...
131219_text Smlouva 1-2014 - Vyplňování Kontrolních zpráv a
předfinancování výdajů, které mají být kryty prostředky z fondů EU ve výši
odpovídající podílu dotací z fondů EU na spolufinancované akce. Seznam těchto
akcí, u nichž je dotace z fondů EU již schvá...
Medikamentózní léčba kastračně rezistentního karcinomu - I-COP
chemoterapie
kabazitaxel
+
prednison
– prokázáno
prodloužení
celkového
přežiH
a
paliaVvní
efekt
ve
srovnání
s
CT
mitoxantron
+
prednison
...
Stáhnout - Trilobit
Principem checkpointingu je snímkování aktuálního stavu procesu a jeho zaznamenávání
do nezávislého úložiště - žurnálu procesů. V případě, že vznikne jakákoliv porucha, systém dokáže
provést rollba...