Több irányból is érkeznek a hírek, hogy nagyobb tartalom-szolgáltatók sorra lecserélik adatbázis megoldásaikat Cassandrára. A Cassandra program arany fokozatú Apache projektté nőtte ki magát, melyet kezdetben a Facebook fejlesztett és tett közzé nyílt forrással. Az adatbázis egy jól skálázható, második generációs, strukturált kulcs-érték tárolására alkalmas Java nyelven írt eszköz, amit kifejezetten több-gépes, clusterezett rendszerekre terveztek.
Néhány alap fogalom:
Néhány alap fogalom:
- Column: Az oszlop, a legkisebb egysége az adat-tárolásnak, melyben kulcs, érték,és egy idő-bélyeg található.
- ColumnFamily: Adattábla, mely az oszlopokat fogja össze.
- SuperColumns: Olyan oszlopokat tartalmaz, melyek értékei további oszlopok.
- Row: Minden adattábla elszeparált fájlban tárolódik, és ezek a fájlok tárolódnak az un.: Row-ban. Minden Row-nak van egy kulcsa, amivel hivatkozni lehet rá.
- Keyspace: Lényegében az adatbázis név-tér az adattábláknak, tipikusan egy alkalmazáshoz egy név-tér tartozik.
- Cluster: A cluster kezeli az elosztott név-tereket.
Ez az egyszerű JSON példa jól szemlélteti a Row, ColumnFamily, és Column struktúráját:
{ "mccv":{ "Users":{ "emailAddress":{"name":"emailAddress", "value":"foo@bar.com"}, "webSite":{"name":"webSite", "value":"http://bar.com"} }, "Stats":{ "visits":{"name":"visits", "value":"243"} } }, "user2":{ "Users":{ "emailAddress":{"name":"emailAddress", "value":"user2@bar.com"}, "twitter":{"name":"twitter", "value":"user2"} } } }
Az adat-szerkezet részletesebb leírása megtalálható itt.
Fontos különbség a relációs adatbázisokhoz képest, hogy míg utóbbiakban az entitások és a közöttük fennálló kapcsolat alapján keresünk, és a keresést index-ek tesszük élhetővé, addig a Cassandra fordított paradigmát igényel, és a tervezésnél azt kell figyelembe vennünk, hogy milyen lekérdezéseket szeretnénk kiszolgálni, mert mert egy adattábla lényegében egy lekérdezésnek "felel meg".
Nézzük, hogyan is működik.
A telepítést részletesen leírja a wiki, ezért arra nem térnék ki. Miután sikeresen feltelepítettük a lánykát a conf/storage-conf.xml állományban tudjuk hangolni a rendszert, illetve itt van lehetőség Keyspace-k és ColumnFamily-k létrehozására, az alábbi módon.
A telepítést részletesen leírja a wiki, ezért arra nem térnék ki. Miután sikeresen feltelepítettük a lánykát a conf/storage-conf.xml állományban tudjuk hangolni a rendszert, illetve itt van lehetőség Keyspace-k és ColumnFamily-k létrehozására, az alábbi módon.
<Keyspaces> <Keyspace Name="testKeyspace"> <KeysCachedFraction>0.01</KeysCachedFraction> <ColumnFamily CompareWith="UTF8Type" Name="testColumnFamily"/> </Keyspace> </Keyspaces>
Mentsük el az XML-t indítsuk el a Cassandrát, majd a "cassandra-cli -host localhost -port 9160" paranccsal csatlakozzunk az adatbázishoz. Ha minden jól ment a cassandra> felirat jelenik meg a képernyőn jelezve, ahol is megkezdhetjük a munkát. Első kérésként ellenőrizzük, hogy sikeresen létre hoztuk-e a Keyspace-t.
cassandra>show keyspaces testKeyspace systemNe lepődjünk meg van egy system Keyspace, amit a rendszer maga használ. Jelen esetben létrehoztuk egy testColumnFamily-t amiben az adatokat szeretnénk tárolni UTF-8 string formában, de van mód ASCIIType, BytesType, TimeUUIDType, Super tárolási formákra.
Következő lépésként helyezzünk be egy Column-ot a familybe.
cassandra>set testKeyspace.testColumnFamily ['testUser']['foo'] = 'bar' Value inserted.
És végül kérdezzük le a felvitt értéket.
cassandra>get testKeyspace.testColumnFamily ['testUser']['foo'] => (column=foo, value=bar, timestamp=1268818855201)
Mivel leggyakrabban nem parancssorból szeretnénk használni az adatbázist, számtalan programozási nyelvhez létezik már implementáció, köztük természetesen Java-hoz is. Az említett kliensben az előbbi példa e-képpen valósítható meg:
CassandraClient cl = pool.getClient(); KeySpace ks = cl.getKeySpace("testKeyspace"); //insert value ColumnPath cp = new ColumnPath("testColumnFamily" , null, "testUser".getBytes("utf-8")); ks.insert("foo", cp , "bar".getBytes("utf-8")); //get value Column col = ks.getColumn("foo", cp); String value = new String(col.getValue(),"utf-8"); pool.releaseClient(cl); pool.close();
Összegzésként elmondható, hogy Cassandra sem váltja meg a világot, mégis megvan a maga helye és szerepe az adatbázisok területén. Lényeges működésbeli sajátossága hátrány, ha bonyolult adastruktúrákban gondolkozunk, viszont előnye, hogy rendkívül gyorsan képes kiszolgálni a kéréseket. Véleményem szerint relációs adatbázissal vegyesen, mindkettő erősségét (ki)használva optimális megoldáshoz jutunk.
Nincsenek megjegyzések:
Megjegyzés küldése