Changes

Jump to: navigation, search

Cassandra -NoSQL database

2,596 bytes added, 21:51, 16 February 2019
Partíció mérete
=Architektúra=
==Node-ok csoportosításaAlapfogalmak==Cassandrában a node-okat két szinten csoportosíthatjuk: Rack és Data Cener. ===Gossip (pletykák)===  
* '''Rack''': ===Snitches===A rack-ben olyan nodo-kat csoportosítunk, amik tényleg snitch protokoll segítségével térképezi föl egy fizikai rack-ben vannaknode, tehát ezek hogy milyen messze vannak a "legközelebb" egymáshoz. * '''Data Center''': Egy datacenter-ben azokat Racktőle az általa ismert node-eket csoportosítjukok, amik fizikailag hogy ha egy szerverfarmon vannak. :[[File:ClipCapItműveletben koordinátor node-181106-205504.PNG]]Alapértelmezetten minden ként vesz részt, meg tudja határozni hogy melyik node-unk okról olvasson (a '''RACK1'''legközelebbi) és melyik node-be fog tartozni, és a '''DC1''' datacenterbeokra írjon.
==Gossip (pletykák)==
===Lightweight Transactions (check-and-set)===
Cassandra-ban nem létezik a hagyományos értelembe vett tranzakció kezelés, csak az úgynevezett pehelysúlyú tranzakció (LWT) ami azt biztosítja, hogy egy olvasás és az azt követő írás egy tranzakcióban lesz ('''linearizable consistency'''). Az olvasással ellenőrizzük, hogy az adott adat szerepel e már az adatbázisban, és ha nem, akkor bírjuk. Ez LWT csak egy partíción belül működik és elég költséges művelet, mivel a végrehajtásához a Cassandra a Paxos nevű konszenzus algoritmust futtatja. A konszenzus kialakításához a partíciót tároló replikák többségének konszenzusra kell jutnia az adott tranzakciót illetően.
==Snitches==
A snitch protokoll segítségével térképezi föl egy node, hogy milyen messze vannak tőle az általa ismert node-ok, hogy ha egy műveletben koordinátor node-ként vesz részt, meg tudja határozni hogy melyik node-okról olvasson (a legközelebbi) és melyik node-okra írjon.
==Node-ok csoportosítása==
Cassandrában a node-okat két szinten csoportosíthatjuk: Rack és Data Cener.
==Lightweight Transactions (check* '''Rack''': A rack-ben olyan nodo-kat csoportosítunk, amik tényleg egy fizikai rack-ben vannak, tehát ezek vannak a "legközelebb" egymáshoz. * '''Data Center''': Egy datacenter-ben azokat Rack-eket csoportosítjuk, amik fizikailag egy szerverfarmon vannak. :[[File:ClipCapIt-and181106-set)==205504.PNG]]CassandraAlapértelmezetten minden node-ban nem létezik unk a hagyományos értelembe vett tranzakció kezelés'''RACK1'''-be fog tartozni, csak az úgynevezett pehelysúlyú tranzakció (LWT) ami azt biztosítja, hogy egy olvasás és az azt követő írás egy tranzakcióban lesz (a '''linearizable consistencyDC1''')datacenterbe. Az olvasással ellenőrizzük ===Seed Nodes===Minden egyes node-nak amit hozzáadnunk a cluster-hez szüksége van egy referencia node-ra, hogy az adott adat szerepel e már az adatbázisbanamitől le tudja kérdezni a cluster topológiáját (élő és halott node-ok, és ha távolság..). Ezeket hívják seed-node-nak.  Minden egyes data-center-ben legalább két seed-node-ot kell létrehozni. A nem, akkor bírjukseed-node -knak a seed-nodeokat a cassandra.yaml fájlban kell statikusan beállítani. Ez LWT Alapértelmezetten csak egy partíción belül működik és elég költséges művelet, mivel a végrehajtásához localhost van hozzáadva a Cassandra a Paxos nevű konszenzus algoritmust futtatjalistához: <pre>- seeds: "127.0. A konszenzus kialakításához a partíciót tároló replikák többségének konszenzusra kell jutnia az adott tranzakciót illetően0.1"</pre>
=Telepítés=
Minél szélesebb egy tábla annál egyszerűbb ezt a korlátot elérni még relatíve kevés adattal is.
 
 
=Java kliens=
 
 
 
<source lang="java">
public class CassandraConnector {
 
private static CassandraConnector instance;
 
private Cluster cluster = null;
 
private Session session = null;
 
private MappingManager manager = null;
 
private CassandraConnector() {
initConnection();
}
 
public static CassandraConnector getInstance() {
 
if (instance == null) {
 
synchronized (CassandraConnector.class) {
if (instance == null) {
// if instance is null, initialize
instance = new CassandraConnector();
}
}
}
 
return instance;
}
 
private void initConnection() {
 
String host = System.getProperty("cassandra.default.host", "localhost");
String port = System.getProperty("cassandra.default.port", "9042");
String keyspace = System.getProperty("cassandra.default.keyspace");
String username = System.getProperty("cassandra.user", "user");
String password = System.getProperty("cassandra.pwd", "pass");
boolean withSSL = Boolean.parseBoolean(System.getProperty("cassandra.needSSL", "false"));
 
connect(nodes, withSSL, username, password, keyspace);
}
 
private void connect(String host, String port, boolean withSSL, String username, String password, String keyspace) {
 
try {
 
Cluster.Builder b = Cluster.builder().withSocketOptions((new SocketOptions()).setReadTimeoutMillis(1800000))
.withQueryOptions((new QueryOptions()).setFetchSize(100000));
 
 
builder.addContactPoint(host).withPort(port);
 
if (withSSL) {
b.withSSL();
}
 
if (username != null && username.trim().length() > 0 && withSSL) {
b.withCredentials(username, password);
}
 
session = cluster.connect();
 
manager = new MappingManager(session);
 
} catch (Exception e) {
System.out.println(e);
throw e;
}
}
 
 
public Session getSession() {
 
return session;
}
 
public MappingManager getManager() {
 
return manager;
}
 
 
 
@Override
public void finalize() {
try {
session.close();
cluster.close();
} catch (Exception e) {
// ...
}
}
}
</source>

Navigation menu