Apache Cassandra - wprowadzenie do architektury, modelowania i narzędzi

8,845 views 131 slides May 25, 2016
Slide 1
Slide 1 of 131
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51
Slide 52
52
Slide 53
53
Slide 54
54
Slide 55
55
Slide 56
56
Slide 57
57
Slide 58
58
Slide 59
59
Slide 60
60
Slide 61
61
Slide 62
62
Slide 63
63
Slide 64
64
Slide 65
65
Slide 66
66
Slide 67
67
Slide 68
68
Slide 69
69
Slide 70
70
Slide 71
71
Slide 72
72
Slide 73
73
Slide 74
74
Slide 75
75
Slide 76
76
Slide 77
77
Slide 78
78
Slide 79
79
Slide 80
80
Slide 81
81
Slide 82
82
Slide 83
83
Slide 84
84
Slide 85
85
Slide 86
86
Slide 87
87
Slide 88
88
Slide 89
89
Slide 90
90
Slide 91
91
Slide 92
92
Slide 93
93
Slide 94
94
Slide 95
95
Slide 96
96
Slide 97
97
Slide 98
98
Slide 99
99
Slide 100
100
Slide 101
101
Slide 102
102
Slide 103
103
Slide 104
104
Slide 105
105
Slide 106
106
Slide 107
107
Slide 108
108
Slide 109
109
Slide 110
110
Slide 111
111
Slide 112
112
Slide 113
113
Slide 114
114
Slide 115
115
Slide 116
116
Slide 117
117
Slide 118
118
Slide 119
119
Slide 120
120
Slide 121
121
Slide 122
122
Slide 123
123
Slide 124
124
Slide 125
125
Slide 126
126
Slide 127
127
Slide 128
128
Slide 129
129
Slide 130
130
Slide 131
131

About This Presentation

Prezentacja z warsztatów wprowadzających do bazy Apache Cassandra - od podstaw teoretycznych, narzędzi, po model danych oraz architekturę.


Slide Content

Apache Cassandra
Wprowadzenie do architektury,
modelowania danych i narzędzi
Maciej Migacz ///// [email protected] ///// www.semantive.com
www.stacja.it, 20.05.2016

§RDBMS vs NoSQL
§Twierdzenie CAP
§Spójność, dostępność i odporność na
rozłączenie w sieci
§Rodzaje baz nierelacyjnych
§Czym jest Cassandra?
§Zastosowania bazy Cassandra
Plan

§NoSQL= Not OnlySQL
§Brak schematu –zbiory danych nie mają określonej
struktury
–np. każdy wiersz może wyglądać zupełnie inaczej –tzn.
mieć inne kolumny
§Architektura SharedNothing
–węzły są równorzędne i niezależne
–brak maszyn, których uszkodzenie powodowałoby awarię
systemu (no single point of failure)
§Replikacja –dane są zwielokrotnione na wielu
węzłach klastra (replikach)
§Sharding–podział danych na rozłączne partycje
Charakterystyka baz NoSQL

§ACID
–Atomicity(atomowość transakcji) –operacje zawarte w
transakcji wykonają się w całości albo wcale
–Consistency(spójność) –stan bazy danych po
zatwierdzeniu transakcji będzie spójny –tzn. zgodny ze
wszystkimi nałożonymi na niego ograniczeniami
–Isolation(izolacja) –jedna transakcja nie będzie widziała
przejściowego stanu bazy danych spowodowanego przez
niezakończoną inną transakcję
–Durability(trwałość) –kiedy dane zostaną zatwierdzone
przez transakcję będą one utrwalone
ACID vs BASE

§BASE –BasicallyAvailable, Softstate,
Eventuallyconsistent
–Większość danych dostępna przez cały czas
–Dane wystarczająco świeże
–Osiągnięcie spójność odsunięte w czasie, ale
osiągalne
ACID vs. BASE

ACID vs BASE
§ACID
–Silna spójność
–Izolacja
–Transakcje i
zagnieżdżone transakcje
–Pesymistyczne
podejście do
wielodostępu
–Schemat danych
§BASE
–Słaba spójność
–Wysoka dostępność
–Przybliżone odpowiedzi
–Optymistyczne
podejście do
wielodostępu
–Szybsze i łatwiejsze
–Brak schematu

Twierdzenie CAP (Brewer'a)
C
A P
Consistency
(spójność) -wszystkie
węzły mają jednakowe
dane
Partitiontolerance-
odporność na utratę
części węzłów
Availability
(dostępność) –każde
żądanie doczeka się
odpowiedzi

Twierdzenie CAP (Brewer'a)
C
A P
Te trzy cechy nie mogą
współistnieć w jednym,
rozproszonym,
systemie przetwarzania danych
–optymalizuje się dwie z nich

Określenie priorytetów baz NoSQL
§Wydajny zapis
§Wydajny odczyt
§Wysoka spójność
§N –liczba replik
przechowujących te
same dane
§R –liczba replik, z
których pobierane są
dane podczas żądania
odczytu
§W –liczba replik, do
których zapisywane są
dane podczas żądania
zapisu

§Wysoka spójność, bardzo szybki odczyt
–R = 1, W = N
§Wysoka spójność, bardzo szybki zapis
–R = N, W = 1
§Niska spójność, bardzo szybki odczyt i zapis
–R = 1, W = 1
§Spójność jest zachowana gdy
–R + W >= N + 1
Przypadki charakterystyczne

Rodzaje baz NoSQL
§Bazy danych oparte o
model ColumnFamilly
(BigTable)
–Cassandra
–Hbase
–AzureTables
–BigTable
§Dokumentowe bazy
danych
–CouchDB
–MongoDB
–Riak
§Bazy typu klucz-wartość
–Memcached
–Redis
–BarkeleyDB
–DynamoDB
–Riak
§Bazy grafowe
–Neo4J
–OrientDB
–Allegro Graph
–Titan(bazuje na
Cassandra)

Bazy NoSQLi CAP
12
Consitency
Availability
Partition
tolerance
MySQL
PostgreSQL
Neo4J
Hbase
BigTable
MongoDB
Redis
BarkeleyDB
Cassandra
Voldemort
Dynamo
CauchDB
Riak
Typy baz danych:
■Relacyjne
■Grafowe
■Klucz-wartość
■Dokumentów
■ColumnFamilly

§Wysokoskalowalna, zdecentralizowana i rozproszona
baza danych NoSQL
§Obsługa dowolnej liczby węzłów, dowolnej liczby
centrów danych
§Automatyczna replikacja danych
§Obsługa heterogenicznej infrastruktury
§Napisana w języku Java
§Opensourcez bardzo aktywną społecznością, topowy
projekt fundacji Apache
§Współpraca z Hadoopi Spark, możliwość
wykonywania algorytmów opartych o MapReduce
Czym jest Cassandra

§Wysokoskalowalna, zdecentralizowana baza danych NoSQL
–Rozproszona, „No Single Point of Failure”
–Liniowe skalowanie przepustowości
Cassandra-cechy

§Skalowanie horyzontalne klastra
–No Single Point of Failure
–Liniowe skalowanie przepustowości
–Odczyt/zapis w dowolnym węźle
Cassandra-cechy
Źródło: http://docs.datastax.com/

§Model danych oparty o BigTable
–Tabele z wierszami, w których komórki są
uporządkowane po nazwie
–Wiersze są od siebie niezależne i każdy wiersz może
mieć zestaw komórek o innych nazwach
–Brak schematu
§Spełnia wymagania Dynamo (zbiór technik)
–Skalowanie horyzontalne
–Symetryczna
–Decentralizacja
–Dostosowana do niejednorodnego środowiska
Cassandra= BigTable+ Dynamo

Cassandra-Distributed HashTable
§Distributed Hash
Table
–O(1) –
wyszukiwanie
węzła
–Replikacja
–Liniowe
skalowanie

§RowType
–SortedMap<String, Tuple>
§TableType
–Map<String, RowType>
§KeySpaceType
–Map<String, TableType>
§ClusterType
–Map<String, KeySpaceType>
Cassandra–model danych

§Konfigurowalny poziom spójności przy każdej instrukcji
odczytu i zapisu (ustawiany na poziomie sterownika –
pojedynczy statement)
§Zmiany na pojedynczym fizycznym wierszu są
wykonywane atomowo i w izolacji (od wersji 1.2)
§Wsparcie dla lekkich transakcji opartych na protokole
Paxos, umożliwiających operację porównaj -i-zmień (CAS,
od wersji 2.0)
§Uwzględnienie lokalizacji węzłów –Cassandrabierze pod
uwagę czy poszczególne węzły są umieszczone w tej
samej szafie, w tym samym centrum danych, czy w
zupełnie różnych lokalizacjach geograficznych (replikacja
NetworkTopologyStrategy)
Spójność w bazie Cassandra

§Cassandrasprawdza się, gdy wymagany jest
–Bardzo szybki zapis danych w czasie rzeczywistym
–„No single point of failure”
–Elastyczny, łatwy w zmianie model danych
–Wysoka skalowalność
–Replikacja danych w różnych centrach danych
§RDBMS radzi sobie lepiej niż Cassandra, gdy
wymagane jest:
–Wsparcie dla transakcji ACID (np. transfery
bankowe)
Kiedy stosować Cassandrę ?

§Listy i kolekcje (Spotify)
§Systemy rekomendacji (eBay)
§Obsługa wiadomości i powiadomień w czasie
rzeczywistym (Istagram)
§Systemy analityczne, np. do wykrywania oszust
finansowych
§Dane z sensorów –internetrzeczy (Zonar)
§Rozwiązania grafowe (TITAN )
§…
§Więcej na
–http://planetcassandra.org/apache-cassandra-use-cases/
Do czego stosować Cassandrę ?

INSTALACJA, KONFIGURACJA I
URUCHAMIANIE CASSANDRY

§Wymagania i przygotowanie instalacji
§Wybór i instalacja dystrybucji Cassandry
§Konfiguracja Cassandrydla pojedynczego
węzła
§Uruchamianie i zatrzymywanie Cassandry
Plan

§Najnowsza wersja Java 7 (min 1.7.0_25) lub 8 (min 1.8.0_40)
–Rekomendowana OracleJava 7+, 64bit
–OracleJDK 1.7+ wymagane dla Cassandra2.0+
§Konfiguracja JAVA_HOME
§Instalacja Java Native Access (JNA), dla wcześniejszych niż C*2.1
–Wymagane dla systemów produkcyjnych
§Python2.7.x –wymagany m.in. przez cqlsh, nodetool
§Wyłączyć swap(sudoswapoff-all)
–Lepiej pozwolić Cassandrzena zamknięcie z powodu braku pamięci -
„mniejsze zło ”
§Synchronizacja czasu na wszystkich węzłach (np. NTP )
Przygotowanie systemu operacyjnego

Sprawdzić dostępność portów
§Publiczne
–22 –ssh
–8888 –Interfejs webowy OpsCenter
§Wewnątrz klastra
–7000 –komunikacja pomiędzy węzłami klastra
–7001 –komunikacja sslpomiędzy węzłami
–7199 –JMX dla Cassandra
§Porty klienckie
–9042 –protokół natywny ( cqlsh)
–9160 –Thrift, (cassandra-cli)
Konfiguracja portów

§Apache Cassandra
–http://cassandra.apache.org/download/
§DataStaxCommunityEdition (DSC)
–Najnowsza, najbardziej stabilna wersja C*
–OpsCenter
–Przykłady, instalator
–http://planetcassandra.org/cassandra/
§DataStaxEnterprise Edition (DSE), OpsCenter, Drivers,
DevCenter
–Najbardziej stabilna, certyfikowana wersja C*
–Integracja z M-R (Hadoop, Spark)
–Indeksy tekstowe (Solr)
–http://www.datastax.com/download
Wybór dystrybucji

§Open Source vs.
DSE
–http://www.datastax.com/products/products-
index#details
Wybór dystrybucji

§DSC i DSE może być zainstalowane z pakietów (RPM
–yum, DEB –apt-get, MSI –Windows)
§Struktura instalacji:
–/var/lib/cassandra-dane (SSTable, CommitLog)
–/var/log/cassandra–logi
–/var/run/cassandra–runtime
–/usr/share/cassandra/lib–biblioteki JAR
–/etc/cassandra–pliki konfiguracyjne (cassandra.yaml)
–/etc/init.d–skrypt do uruchomiania usłgi
–/etc/security/limits.d–limity dla użytkownika
–/etc/default–domyślna konfiguracja
Instalacja Cassandryz pakietu

§Wszystkie foldery w jednej
lokalizacji
–/bin –pliki wykonywalne (cassandra,
cqlsh, nodetool)
–/conf–pliki konfiguracyjne
(cassandra.yaml)
–/javadoc–javadockodu C*
–/lib–biblioteki *.jar
–/pylib–biblioteki Python(wymagane
np. przez cqlsh)
–/toos–dodatkowe narzędzia (np.
cassandra-stressdo testowania
klastra)
Instalacja Cassandryz archiwum

§cassandra.yaml–najważniejszy plik
konfiguracyjny (np. katalogi danych)
§cassandra-env.sh–konfiguracja JVM
(MAX_HEAP_SIZE, JMX_PORT)
§logback.xml–konfiguracja logowania
§cassandra-rackdc.properties–
przypisanie węzła do szafy i centrum
danych
§cassandra-topology.properties–
konfiguracja adresów szaf i centrów
danych w klastrze
§/bin/cassandra.in.sh–JAVA_HOME,
CASSANDRA_HOME,
CASSANDRA_CONF
Konfiguracja

§cluster_name(domyślnie: „Test Custer”)
–Wszystkie węzły w jednym klastrze muszą mieć tą samą
nazwę
§listen_address(domyślnie: localhost)
–Adresy IP lub nazwy innych węzłów, używane do
ustalenia klastra (nie muszą być wszystkie, min. zbiór,
który pozwala na wykrycie połączeń peer-to-peer)
§rpc_address/ rpc_port(domyślnie: localhost/ 9160)
–Port protokołu Thrift
§native_transport_port(domyślnie: 9042)
–Port dla protokołu binarnego (Native Java Driver),
używany przez sterownik, cqlshitd.
cassandra.yaml–kluczowe parametry

§commitlog_directory(domyślnie:
/var/lib/cassandra/commitloglub
$CASSANDRA_HOME/data/ commitlog)
–Zalecane montowanie na oddzielnym dysku, szczególnie jeżeli
nie jest to dysk SSD
§data_file_directories(domyślnie: / var/lib/cassandra/data
lub $CASSANDRA_HOME/data/data)
–Katalog na pliki tabel (SSTable)
§saved_caches_directory(domyślnie:
/var/lib/cassandra/saved_cacheslub
$CASSANDRA_HOME/data/ saved_caches)
–Katalog na cache kluczy i wierszy
cassandra.yaml–kluczowe parametry

§{install_dir}/bin/cassandra
§Parametry
–-f
§Uruchamia Cassandrę w pierwszym planie (domyślnie
w tle)
–-p <nazwa_pliku>
§Zapisuje PID w pliku, wykorzystywany do zatrzymania
za pomocą PID
–-v
§Wyświetla wersje Cassandrybez jej uruchamiania
Uruchamianie Cassandry

§Instalacja z archiwum
–sudo{install_dir}/bin/cassandra-f
§Uruchamia w pierwszym planie, logi na ekranie
§Instalacja z pakietu
–sudoservice cassandrastart
Uruchamianie Cassandry

§Instalacja z archiwum
–Cassandrauruchomiona w pierwszym planie
§ctrl+ c
–Cassandrauruchomiona w tle –należy
sprawdzić PID
§psauxw| grepcassandra
§sudokill<pid>
§Instalacja z pakietu (serwis)
–sudoservice cassandrastop
Zatrzymywanie Cassandry

NARZĘDZIA

§cqlsh
§nodetool
§ccm–CassandraCluster Manager
§cassandra-stress
§Pozostałe narzędzia
Plan

§Interaktywny, działający z linii poleceń, klient CQL
–Domyślnie łączy się do lokalnej instancji
–Uzupełnia komendy (TAB)
–{install_dir}/bin/cqlsh
–Opcje:
§-k [keyspace] –uruchamia cqlshdla wybranej przestrzeni kluczy
§-f [file_name] –uruchamia komendę CQL ze skryptu i kończy pracę
§-u [user] –p[password] –autentykacja użytkownika
§-h –wyświetla pomoc
§…
cqlsh
cqlsh[options] [host [port]]

§cqlshpozwala na:
–Wykonywanie komend CQL
§Uniwersalny język zapytań Cassandry
–Wykonywanie poleceń cqlsh
§Pomocne do wykonywania poleceń CQL
§Polecenia dostępne tylko z cqlsh
§Bardzo bogata pomoc
–cqlsh>help; -lista tematów
–Cqlsh>help[nazwa_tematu]; -pomoc dot. komend
Możliwości cqlsh

Polecenie cqlsh opis
CAPTURE Zapisuje wynik zapytania do pliku
CONSISTENCY Wyświetlai ustawia poziomspójności na czas sesji
COPY Import/exportdanych z tabeli do pliku CSV
DESC/DESCRIBE Wyświetlainformacje na temat klastra, przestrzeni kluczy, czy
tabel
EXIT Kończy pracę konsoli
EXPAND Wyświetla wynikzapytań w strukturze drzewiastej
HELP Zwracalistę pomocy, pobierapomoc dla wybranej komendy
cqlshlub CQL
LOGIN Przelogowanie użytkownika bez zamykaniasesji
PAGING Włącza/wyłącza paginację zapytań
SHOW Wyświetla informację dla o aktualnej sesji
SOURCE Wykonuję polecenie CQL z pliku
TRACING Włącza/wyłączaplan zapytań

§Funkcje
–Informacyjne
–Zmieniające parametry pracy
–Utrzymania
–Naprawy
–Kopii bezpieczeństwa
Narzędzie nodetool

§Narzędzie do zarządzania klastrem z linii poleceń
–{install_dir}/bin/nodetool
§Umożliwia podłączenie się do zdalnego węzła
–JMX_PORT –konfigurowany w cassandra-env.sh
–Domyślnie JMX_PORT = 7199
42
Narzędzie nodetool
nodetool-h HOSTNAME [-p JMX_PORT -u JMX_USERNAME -pw
JMX_PASSWORD ] COMMAND

§nodetoolstatus
–zwraca informacje o węzłach pracujących w
klastrze
Funkcje informacyjne

§nodetooldescribecluster
–wyświetla podstawowe informacje o klastrze,
takie nazwa, snitch, czy partitioner
Funkcje informacyjne

§nodetoolinfo
–wyświetla podstawowe informacje o wybranym węźle, takie jak
ilość danych, czas działania, lokalizacja (centrum danych,
rack), ilość wolnej pamięci oraz stan cache
Funkcje informacyjne

§Szybkie tworzenie klastrów z wielu węzłów
na lokalnej maszynie
–Przydatne do dewelopmentui testów (tylko)
–Komunikacja tylko z localhost
§Narzędzie OpenSource
–https://github.com/pcmanus/ccm
–Wymagania: Python2.7, pyYAML, six, ant, psutil
CCM -CassandraCluster Manager

§Tworzenie klastra
–ccm create–v 2.1.6 –n 3 –s
§Tworzenie klastra –szczegółowo
–ccm create–v 2.1.6
–ccm populate–n 3
–ccm start
CCM –podstawowe funkcje

§ccm list
§ccm switch
§ccm create/remove
§ccm populate
§ccm start/stop
§ccm flush/compact
CCM -klastry

§ccm node1 start/stop
§ccm node1 status
§ccm node1 showlog
§ccm node1 ring
§ccm node1 flush/drain/compact
§ccm node1 cqlsh
§ccm node1 hadoop/hive/spark
CCM –węzły

§Narzędzie z linii poleceń do generowania
testu obciążeniowego
–Tworzy: Keyspace1 z tablicami Standard1,
Super1, Counter3
–install/tools/bin/cassandra-stress
cassandra-stress
cassandra-stress[command] [options]

§Używana tylko jedna opcja naraz
–read–wiele równoległych odczytów wcześniej zapisanych
danych
–write–wiele równoległych zapisów do klastra
–mixed–interwałowy zapis i odczyt, parametry konfigurowalne
–counter_write–wiele równoległych zapisów do tablilicznikowej
–counter_read–równoległe odczyty liczników
–user–przeplatanie zapytań zdefiniowanych przez użytkownika
–help–pomoc
–print–wyświetla parametry rozkładów testu
§Komendy mogą mieć dodatkowe opcje konfiguracyjne
cassandra-stress

§Linie są raportowane co -log interval=?
–totalops–całkowita liczba operacji od początku testu
–adjrow/s –przybliżona prędkość zapisu wierszy w interwale
–op/s –prędkość operacji w interwale
–pk/s –prędkość zapisu partycji
–row/s –prędkość zapisu wierszy w interwale
–mean–średnie opóźnienie operacji w interwale
–med–mediana opóźnienia operacji
–.95 –95% przypadków, gdy opóźnienie było mniejsze niż liczba wyświetlona w kolumnie
§.99, .999
–max –maksymalne opóźnienie w ms
stress-test –interpretacja loga

§sstablekeys–wyświetla klucze partycjonujące z pliku
SSTable
§sstableloader–masowe ładowanie danych do klastra
§sstablescrub–używane razem z nodetooldo naprawiania
klastra
§sstable2json, json2sstable–import/eksport danych z/do
JSON
§sstableupgrade–migracja SSTabledo aktualnej wersji C*
§sstablemetadata–informacje o SSTable
§sstablerepairedset–oznacza SSTablejako naprawioną
§sstablesplit–dzieli duże pliki SSTable
§token-generator–ręczne generowanie tokenówdla C*
Pozostałe narzędzia

§{install_dir}/bin/cassandra-cli
–Klient Thriftdo C*
–Deprecated–usunięty w C* 2.2
–Lista komend zbliżona do cqlsh
–Operuje na modelu natywnym
§Użyteczny do podglądu struktury mapowania CQL na model natywny
Pozostałe narzędzia

NATYWNYMODEL DANYCH

§W bazie danych Cassandradane
zorganizowane są w następujący sposób:
–Przestrzenie kluczy (keyspaces)
–Rodziny kolumn (columnfamilies)
–Wiersze (rows)
–Krotki(tuples) –nazywane także kolumnami
§Uwaga: w natywnym modelu danych Cassandra
znaczenie kolumny jest zupełnie inne niż w
bazach SQL
Model danych

57
Komórki, krotki(cell, tuple, column)
Nazwa
Wartość
Czas modyfikacji
Czas życia
Komórka
Podstawowajednostka
przechowywaniadanych
wbazieCassandra

58
Nazwa komórki
Nazwa
Wartość
Czas modyfikacji
Czas życia
Nazwakomórki
Stanowiczęśćklucza,
potrzebnegodoznalezienia
konkretnejkomórki
Typdanychnazwykomórki
musiumożliwiać sortowanie
liniowewartości, ponieważ
komórkisąposortowane
ponazwie.

59
Wartość komórki
Nazwa
Wartość
Czas modyfikacji
Czas życia
Wartość komórki
Właściwe dane
przechowywane w komórce.
Wielkość danych w komórce
nie może przekraczać 2 GB.
Zaleca się, żeby nie
przekraczała kilku MB.

60
Czas modyfikacji komórki
Nazwa
Wartość
Czas modyfikacji
Czas życia
Czasmodyfikacjikomórki
Dataiczasostatniegozapisu
danychwkomórce.
Fizyczniejestto64-bitowa
liczbazawierającaczasjaki
upłynąłod01.01.1970z
milisekundowąrozdzielczością

61
Czas życia komórki
Nazwa
Wartość
Czas modyfikacji
Czas życia
Czasżyciakomórki
Jesttoczas[s]pojakimkomórka
mazostaćautomatycznie
usuniętazbazydanych.
Niemusibyćokreślony–tzn.
komórkimogąbyćpermanentne.

62
Wiersze
Klucz wiersza Komórka Komórka Komórka . . .
Kluczwiersza
Wartośćpoktórejidentyfikowanyjest
każdywiersz.

63
Wiersze
Klucz wiersza Komórka Komórka Komórka . . .
Komórkiwwierszu
Liczbakomórekwwierszuniemożeprzekraczać2miliardów,
arozmiarcałegowierszamusisięzmieścićnapojedynczejinstancji.
Komórkisąposortowaneponazwach.

64
Partycje
Wiersz 1
Wiersz 2
Wiersz 3
Wiersz 4
. . .
K1
K2
K3
K4
Partycja
Zbiórwierszy,którychtokenyzawierają
sięwpewnymprzedziale–tokenrange.
Tokenjestwynikiemprzekształcenia
kluczawierszazapomocąfunkcji
mieszające–typowojesttoMurmur3.
Wpojedynczejpartycjimożesięzmieścić
sumaryczniedo2miliardówkomórek.
K1

65
Tabele
. . .
Tabela
Tabelatozbiórpartycji.
Każdatabelamaswojąnazwę.
Partycjeskładającesięnatabelę
pokrywającałądziedzinętokenów.
00...-1f...
20...-3f...40...-5f...
60...-7f...
80...-9f...
a0...-bf... c0...-df...

66
Przestrzenie kluczy
Przestrzeńkluczy
Przestrzeńkluczytoodpowiednik
pojedynczejbazydanych.
Przestrzeńkluczyzawierazbiórtabel
dostępnychpoichnazwach.

§classTuple<KeyType, ValueType> {
§ KeyTypekey;
§ ValueTypevalue;
§ longtimestamp;
§ intttl;
§}
67
Model danych -analogia

RowType= SortedMap<String,Tuple>
TableType= Map<String,RowType>
KeySpaceType= Map<String,TableType>
ClusterType= Map<String,KeySpaceType>
68
Model danych -analogia

§Dostęp do danych realizowany jest na poziomie
komórek
§Możliwe jest pobranie:
–Pojedynczej komórki
–Zakresu komórek
–Zbioru zakresów komórek
§Zakres komórek jest uporządkowaną kolekcją
następujących po sobie komórek w
pojedynczym wierszu
–Komórki w wierszu posortowane są według nazw
Metody dostępu do danych

§Pobranie jakichkolwiek danych wymaga podania
przestrzeni kluczy, nazwy tabeli (rodziny kolumn) oraz
klucza wiersza
§Pobranie pojedynczej komórki wymaga podania
dodatkowo:
–nazwy komórki
§Pobranie zakresu komórek wymaga podania dodatkowo:
–dolnego i górnego ograniczenia zakresu komórek
§Pobranie zbioru zakresów komórek wymaga podania
dodatkowo:
–zbioru par dolnych i górnych ograniczeń komórek
§Można także określić maksymalną liczbę komórek, która
może być zwrócona (umożliwia to np. paginację)
Metody dostępu do danych

§Jak w takim modelu danych przechować
typowe zbiory danych, takie jak?
–Dane użytkowników
–Dzienniki zdarzeń
–Lista zamówień
–Hierarchia produktów
Przechowywanie typowych danych

§Najpierw należy określić w jaki sposób będzie
uzyskiwany dostęp do tych danych –od tego
zależy jak zostaną one zamodelowane
Przechowywanie typowych danych

§Cel:
–Przechowywanie danych o użytkownikach
serwisu internetowego
(login, email, imię -opcjonalnie, nazwisko,
hasło)
–Możliwość wyszukiwania użytkowników po
loginie
Przykład 1: Dane użytkowników

§Realizacja:
–Tabela, w której kluczem wiersza jest login
użytkownika, a komórki w wierszu przechowują
pozostałe atrybuty
Przykład 1: Dane użytkowników

§Rezultat:
–Można uzyskać dostęp do każdej informacji o
użytkowniku niezależnie
–Użytkownicy są równomiernie dystrybuowani po
partycjach
75
Przykład 1: Dane użytkowników
akowalski
jnowak
...
email
Kowalski@...
imię
Jan
nazwisko
Kowalski
hasło
qaz123
email
Nowak@...
hasło
1q2w3e
nazwisko
Nowak

§Cel:
–Przechowywanie informacji o zdarzeniach w
systemie (data i czas, typ, rezultat, użytkownik)
–Zdarzenia można wyszukiwać na podstawie
zakresu daty i czasu oraz typu zdarzenia
Przykład 2: Dziennik zdarzeń

§Realizacja 1:
–Tabela, której kluczem wiersza jest typ zdarzenia
–Nazwy poszczególnych komórek w danym
wierszu są datą i czasem zdarzenia
–Komórka zawiera zserializowaną informację o
użytkowniku i rezultacie zdarzenia
Przykład 2: Dziennik zdarzeń, realizacja 1

§Zalety
–Kompaktowe przechowywanie danych –brak redundancji
–Możliwość zapełniania wierszy równomiernie
§Wady
–Nieco utrudniony dostęp przez serializację
–Jeżeli typów zdarzeń jest mało, dane mogą trafiać do małej liczby partycji
–Jeżeli zdarzenia poszczególnych typów nie są generowanie w równych
ilościach, to partycje mogą być zapełniane nierównomiernie
78
Przykład 2: Dziennik zdarzeń, realizacja 1
TYP_A
TYP_B
2009-01-01 12:14:17
User1 / success
2009-05-01 17:11:14
User2 / fail
2006-06-03 10:11:12
User1 / success
2007-09-03 18:16:14
User3 / success

§Cel (przypomnienie):
–Przechowywanie informacji o zdarzeniach w
systemie (data i czas, typ, rezultat, użytkownik)
–Zdarzenia można wyszukiwać na podstawie
zakresu daty i czasu oraz typu zdarzenia
Przykład 2: Dziennik zdarzeń, realizacja 2

§Realizacja 2:
–Tabela, której kluczem wiersza jest typ zdarzenia
–Nazwy poszczególnych komórek w danym
wierszu są konkatenacją daty/czasu zdarzenia i
nazwy atrybutu (użytkownik/rezultat)
–Komórka zawiera wartość danego atrybutu dla
danego zdarzenia
Przykład 2: Dziennik zdarzeń, realizacja 2

§Zalety
–Łatwy dostęp do poszczególnych pól każdego zdarzenia
–Możliwość zapełniania wierszy równomiernie
§Wady
–Redundancja danych –data zdarzenia jest powtarzana
–Jeżeli typów zdarzeń jest mało, dane mogą trafiać do małej liczby partycji
–Jeżeli zdarzenia poszczególnych typów nie są generowanie w równych
ilościach, to partycje mogą być zapełniane nierównomiernie
81
Przykład 2: Dziennik zdarzeń, realizacja 2
TYP_A
TYP_B
2009-01-01 12:14:17|R
success
2006-06-03 10:11:12|R
success
2009-01-01 12:14:17|U
User1
2009-05-01 17:11:14|R
fail . . .
2006-06-03 10:11:12|U
User1
2007-09-03 18:16:14|R
success . . .

§Cel (przypomnienie):
–Przechowywanie informacji o zdarzeniach w
systemie (data i czas, typ, rezultat, użytkownik)
–Zdarzenia można wyszukiwać na podstawie
zakresu daty i czasu oraz typu zdarzenia
Przykład 2: Dziennik zdarzeń, realizacja 3

§Realizacja 3:
–Tabela, której kluczem wiersza część daty i czasu
–np. rok lub miesiąc lub inna część daty i czasu
–Nazwy poszczególnych komórek w danym
wierszu są konkatenacją typu zdarzenia,
daty/czasu zdarzenia oraz atrybutu
–Komórka zawiera wartość danego atrybutu dla
danego zdarzenia
Przykład 2: Dziennik zdarzeń, realizacja 3

84
Przykład 2: Dziennik zdarzeń, realizacja 3
01
05
06
09
TYP_A|2009-01-01 12:14:17|R
success
TYP_B|2006-06-03 10:11:12|R
success
TYP_A|2009-01-01 12:14:17|U
User1
TYP_A|2009-05-01 17:11:14|R
fail
. . .
TYP_B|2006-06-03 10:11:12|U
User1
TYP_B|2007-09-03 18:16:14|R
success
. . .
. . .
. . .
TYP_A|2009-05-01 17:11:14|U
User2
TYP_B|2007-09-03 18:16:14|U
User3
Nrmiesiącajako
kluczpartycjonujący

§Zalety
–Łatwy dostęp do poszczególnych pól każdego zdarzenia
–Możliwość zapełniania wierszy równomiernie
–Umieszczenie cyklicznie zmieniającego się fragmentu
daty jako klucza partycjonującego umożliwia
równomierne wypełnianie poszczególnych partycji
§Wady
–Redundancja danych –data i typ zdarzenia są
powtarzane
–Nieco utrudniony dostęp do uporządkowanej kolekcji
zdarzeń –wymagane jest scalanie
Przykład 2: Dziennik zdarzeń, realizacja 3

§Wada wszystkich realizacji:
–Uniemożliwienie wstawienia więcej niż jednego
zdarzenia danego typu w ciągu danej jednostki czasu
§W celu rozwiązania wady można:
–Zwiększyć rozdzielczość przechowywanej daty i czas
do wystarczającej dla potrzeb systemu
–Dodać dodatkowy licznik cykliczny na poziomie
aplikacji
–Dodać identyfikator węzła jeżeli system jest
rozproszony
Przykład 2: Dziennik zdarzeń, podsumowanie

MODEL DANYCHCQL

§Język podobny do SQL, umożliwiający dostęp
do bazy danych Cassandra
§Pozwala na definiowanie i zarządzanie modelem
danych na wyższym poziomie abstrakcji w
stosunku do modelu natywnego (interfejs
relacyjny na nierelacyjnej bazie danych)
§Pozwala na wykonywanie zapytań
§Pozwala na zarządzanie danymi –wstawianie,
modyfikacja, usuwanie
§Umożliwia kontrolę spójności
CQL

§Model zdenormalizowany
–Modelowanie konkretnych zastosowań (zapytań),
a nie domeny
§Podczas modelowania należy koncentrować
się na modelu fizycznym
CQL –modelowanie

Model CQL
Klaster
Przestrzeń kluczy (keyspace)
Tabela (table)
Wiersz (row)
Kolumna_1
•Krotka(tupple)
Kolumna_2
•Krotka(tuple)
Kolumna_3
•…
Odpowiada
bazi danych w
RDBMS

§Przestrzenie kluczy to inaczej bazy danych
§Pojedyncza tabela zorganizowana jest w
pojedynczej rodzinie kolumn –pojedyncza
rodzina kolumn zawiera jedną tabelę
(mapowanie 1 -1)
§Przestrzeń kluczy (tak jak w modelu natywnym)
zawiera zbiór tabel (rodzin kolumn)
§Wiersze jednej kolumny są rozsiane po
strukturze klastra
Przestrzenie kluczy i tabele

92
Struktura tabeli
Kolumna 1
...
Kolumna n
Kolumna n+1
...
Kolumna n+m
Kolumna n+m+1
...
Kolumna n+m+k
Kolumny klucza
partycjonującego
(kolejność nieistotna)
Kolumny klucza
sortującego
(kolejność istotna)
Pozostałe kolumny
z danymi
(kolejność nieistotna)
Kolumny stanowiące
klucz główny

§Kluczem wiersza jest klucz partycjonujący.
–konkatenacja wartości kolumn klucza
partycjonującego
§Kolejnych k krotek w wierszu odpowiada k
kolejnym kolumnom danych
–Kluczem krotkijest konkatenacja wartości kolumn
klucza sortującego i nazwy jednej kolumny
danych
–Wartością krotkijest wartość kolumny danych,
której ta krotkaodpowiada
Odwzorowanie tabeli w rodzinie kolumn

94
Odwzorowanie –przykład 1
Login Imię Nazwisko
akowalski Andrzej Kowalski
jnowak Jan Nowak
Kolumny klucza
partycjonującego
Kolumny danych

95
Odwzorowanie –przykład 1
Login Imię Nazwisko
akowalski Andrzej Kowalski
jnowak Jan Nowak
Imię Nazwisko
akowalski Andrzej Kowalski
Imię Nazwisko
jnowak Jan Nowak

Odwzorowanie –przykład 1
Definicja tabeli
Dane w modelu
CQL
Model
natywny

97
Odwzorowanie –przykład 2
Rok MiesiącDzień GodzinaMinutaID Typ Dane
2004 03 4 11 15 1 A aaa
2004 03 9 6 44 2 B bbb
2005 07 5 7 13 3 C ccc
Kolumny klucza
partycjonującego
Kolumny klucza
sortującego Kolumny danych

98
Odwzorowanie –przykład 2
Rok MiesiącDzień GodzinaMinutaID Typ Dane
2004 03 4 11 15 1 A aaa
2004 03 9 6 44 2 B bbb
2005 07 5 7 13 3 C ccc
04|11|15|1|Dane04|11|15|1|Typ09|06|44|2|Dane09|06|44|2|Typ
2004|03 aaa A bbb B
05|07|13|3|Dane05|07|13|3|Typ
2005|07 ccc C

Odwzorowanie –przykład 2
Definicja tabeli
Dane w modelu
CQL
Model
natywny

§Dane są partycjonowane po kluczu
partycjonującym i równomiernie
dystrybuowane pomiędzy węzłami
§Dane o takim samym kluczu partycjonującym
są sortowane po wszystkich kolumnach z
klucza sortującego, w takiej kolejności, w
jakiej są zdefiniowane
§Dane o takim samym kluczu partycjonujący
można pobierać spójnymi fragmentami
Możliwości wynikające z odwzorowania

§Aby odczytać pojedynczy wiersz trzeba znać
cały klucz główny
§Aby odczytać jakiekolwiek dane potrzebny
jest przynajmniej klucz partycjonujący
§Dane mogą być sortowane tylko po
kolumnach zdefiniowanych jako klucz
sortujący podczas definiowania tabeli –nie
można tego zmieni
Ograniczenia wynikające z odwzorowania

Typ danych Dane Opis
ascii napisy Teksty US-ASCII
text/ varchar napisy Teksty UTF-8
bigint liczby całkowiteLiczba całkowita o 64-bitowej prezycji–
odpowiednik typu Long
int liczby całkowiteLiczba całkowita o 32-bitowej precyzji –
odpowiednik typu Integer
varint liczby całkowiteLiczba całkowita o dowolnej precyzji –odpowiednik
typu BigInteger
double liczby wymierneLiczba wymierna o 64-bitowej precyzji –
odpowiednik typu Double
float liczby wymierneLiczba wymierna o 32-bitowej precyzji –
odpowiednik typu Float
decimal liczby wymierneLiczba wymierna o dowolnej precyzji –
odpowiednik typu BigDecimal
Proste typy danych 1

Typ danych Dane Opis
blob dane Dowolne dane binarne
boolean prawda/fałsz Odpowiednik typu Boolean
counter licznik Rozproszony licznik całkowity, 64-bitowy
inet adres internetowyAdres internetowy IP4 lub IP6
timestamp data i czas Data i czas –odpowiednik Date.getTime()
uuid uuid Standardowy UUID
timeuuid uuid UUID typu 1
Proste typy danych 2

Typ danych Opis
list<typ prosty> Uporządkowana kolekcja wartości typu
prostego
set<typ prosty> Kolekcja unikalnych wartości typu prostego
map<typ prosty, typ prosty> Tablica asocjacyjna, gdzie klucze i wartości są
typu prostego
Złożone typy danych

§Od C* 2.1 CQL pozwala na definiowanie
własnych typów danych
105
Własne złożone typy danych w CQL

CQL

Dokumentacjadostępna na:
http://docs.datastax.com/en/cql/3.3/cql/cqlIntro.html
CQL

MECHANIZMY WEWNĘTRZNE

§Przechowywanie danych w Cassandrze
opiera się na logach
–Dane są sekwencyjnie dopisywane, a nie
wstawiane do ściśle adresowanej przestrzeni, jak
w RDBMS
Dlaczego zapis do Cassandryjest szybki?

§Plik na dysku, do którego zapisywane są
wszystkie zmiany dokonywane w bazie
§Dane do tego pliku są jedynie dopisywane –nic
nie jest zmieniane
§Jeżeli plik ten jest umieszczony na osobnym
dysku, to zapis nie wymaga losowego dostępu i
wykonywany jest sekwencyjnie →jest bardzo
szybki
§Wszelkie zmiany trafiają najpierw do Commit-
Logi do MemTable(odmiana SSTable, która jest
trzymana w pamięci jako cache)
CommitLog

§Tablica przechowywana pamięciowa, odpowiadająca tabeli CQL
–Dane w MemTablenie są trwałe
–Każdy węzeł posiada posiada MemTabledla każdej tabeli CQL w
przestrzeni kluczy
–Dane, które nie zostały zapisane ( flush) są modyfikowane i
odczytywane z MemTable
–Aktualizacje MemTabledotyczą partycji przechowywanych w pamięci
–W przypadku awarii i utraty MemTable, zmiany zapisane w Commit-
Log są odtwarzane na świeżym MemTable.
MemTable
pk1 age:40 name1:John name2:Doe
pk2 Age:30 name1:Michael

§SortedString Table
–Niemodyfikowalne pliki zawierające posortowane partycje
–Zapisywane szybko na dysk, sekwencyjne I/O
–Przechowuje MemTable, zrzucone podczas operacji flush
–Przechowuje część danych partycji
§Na aktualny stan danych tabeli składają się
–Dane z odpowiednich MemTable
–Wszystkie aktualne SSTable
§Pliki SSTablepodlegają okresowemu kompaktowaniu
SSTable

§SSTableskłada się z trzech elementów:
–Dane
§Uporządkowany zbiór par klucz -wartość
§Podzielony na bloki (typowo 64kb)
§Zapewnia operację wyszukiwania par i iteracji po parach
–Indeks (partitionindex)
§Zapewnia szybkie wyszukiwanie odpowiedniego bloku
§Mapa kluczy partycjonujących na pozycje początku wierszy w pliku
§Przechowywany na dysku
–Filtr Bloom'a
§Zapewnia błyskawiczne przybliżone sprawdzenie czy dany klucz znajduje się
w danym SSTable
–jeżeli filtr Bloom'astwierdzi, że obiektu nie ma w SSTable–wtedy nie ma go na pewno
–jeżeli stwierdzi, że jest –to może być, a może go nie być (błąd false-positive).
§Przechowywany w pamięci
SSTable

§ZapisujeMemTablena dysk jako kolejna,
niemutowalnaSSTable
–MemTablejest czyszczona –zwalnia pamięć na
JVM
–Powiązany CommitLogjest oznaczany jako
zapisany (flushed)
–Zapisanie danych z MemTabledo SSTablejest
sekwencyjne →szybkie
Flushing

§Każdorazowo kiedy wykonywany jest Flushing, powstaje
nowy SSTable
§Żeby odczytać aktualną wersję danych, należy uwzględnić
wszystkie SSTabledotyczące danego zbioru danych
§W plikach SSTablemoże być dużo nieaktualnych danych
–jeżeli jedna komórka była często aktualizowana, to występuje
wielokrotnie w plikach SSTable
–komórki, które zostały usunięte także występują w plikach
SSTable
§Im więcej plików SSTable, tym odczyt staje się bardziej
skomplikowany
Kompaktowanie

§W momencie zapisu klient łączy się do wybranego węzła
–koordynatora
–Każdy węzeł może być koordynatorem
–Brak „single point of failure”
§Klient wysyła żądanie zapisu do wszystkich replik
przechowujących dany wiersz
§Jeżeli wyspecyfikowana w poziomie spójności liczba
węzłów potwierdzi zapis, klient otrzymuje potwierdzenie
utrwalenia zmian
§W przypadku wielu centrów danych, wybierany jest jeden
węzeł z każdego zewnętrznego centrum i do niego jest
kierowane żądanie rozpropagowania żądania zapisu po
centrum danych do którego należy
Zapis danych

§Dane zapisywane są w pierwszej kolejności do
Commit-Log'a(dysk)oraz do MemTable
(pamięć)
§Kiedy MemTableosiągnie określony rozmiar
dane są Flush'owanena dysk do plików SSTable
–Zapisywana jest największa MemTable
§Pliki SSTablesą niemutowalnei są ostatecznie
łączone w większe pliki SSTablepodczas
procesu kompaktowania
Zapis danych –mechanizm wewnętrzny

§Podczas usuwania wierszy z tabeli, fizyczne komórki nie
są całkowicie usuwane
§Tworzone są na ich miejsce tzw. Tombstone'y
§Tombstonejest znacznikiem, informującym Cassandrę , że
komórka została usunięta
§Gdyby nie było Tombstone, to podczas synchronizacji
usunięta komórka mogłaby zostać przywrócona na
podstawie danych z repliki
§Dlatego Tombstonemusi pozostać w bazie tak długo
dopóki nie zostanie on zsynchronizowany ze wszystkimi
replikami w klastrze
§Przedawnione Tombstone'ysą usuwane podczas
kompaktowani
Usuwanie danych

§Czas pozostawania w bazie Tombstonejest
konfigurowalny przez użytkownika –domyślnie jest to
10 dni
§Konfiguruje się go per tabela, parametr nazywa się
gc_grace_seconds
§Aby zapobiec przywracaniu usuniętych danych,
administrator powinien regularnie uruchamiać
mechanizm naprawy (synchronizacji) węzłów
§Duży czas pozostawania Tombstonew bazie, w której
komórki są często usuwane, a na ich miejsce nie są
wstawiane nowe, może mieć znaczący wpływ na
rozmiar bazy danych na dysku
Usuwanie danych

§Klient wysyła żądanie odczytu danych z określonym
poziomem spójności
§Koordynator (węzeł, z którym jest połączony klient)
wysyła żądanie odczytu danych do tylu replik
przechowujących odczytywaną komórkę ile jest
wyspecyfikowane w poziomie spójności
–Jeżeli jakiś węzeł wolno odpowiada, koordynator może
przekierować żądanie do innej repliki ( eagerretries)
§Działa dla stopnia replikacji > 1, od C* 2.0
§Po otrzymaniu danych z replik, koordynator zwraca
klientowi najświeższą wersję danych
Odczyt danych

§Struktury pamięciowe biorące udział w odczycie:
–MemTable–tabela pamięciowa, przechowuje część danch
–Cache wierszy–ostatnio odczytane wiersze (opcjonalny)
–Filtr Bloom’a–sprawdzenie, czy klucz partycjonujący prawdopodobnie jest w
SSTable
–Cache kluczy–fragment indeksu kluczy, ostatnio odczytane klucze -
pozycja wiersza w pliku
–Podsumowanie indeksu partycji–próbka z indeksu kluczy
§Struktury plikowe w odczycie
–Indeks kluczy –mapuje klucz -> pozycja wiersza względem początku pliku
–SSTable
§Scalanie–używa klucza partycjonującego do wyszukania i pobrania
wartości z MemTablei powiązanych SSTable
–Przy każdym odczycie pobierane dane dla KP z pary MemTablei najnowszej
SSTable–pobierane najnowsze
–Nie występuje, gdy pobierany z Cache’awierszy
Odczyt –mechanizm wewnętrzny

§Współdzielony przez wszystkie węzły
–Dane w cache odpowiadają temu co jest w bazie
–Cache na uszkodzonym węźle może zostać
odtworzony z innego
–Przechowywane w pamięci
–Kopiowane na dysk
Cache wierszy i kluczy

Cache w odczycie danych
Źródło: http://docs.datastax.com/

§Jeżeli klucz nie zostanie znaleziony w cache’u
kluczy, wówczas odczyt musi szukać partycji na
dysku
§Podsumowanie indeksu, jest to struktura
pamięciowa, używana do przybliżenia pozycji
klucza w pełnym indeksie
–Domyślna wielkość próbki to 1 na 128 kluczy
partycjonujących w indeksie
–Ustawiane za pomocą parametrów tabeli
§min_index_interval–domyślnie 128
§max_index_interval–domyślnie 2048
Podsumowanie indeksu

ZADANIA

§Zaprojektować sposób przechowania następujących danych:
–pracowników wraz z przydziałem do odpowiedniego departamentu
§dla pracownika określone są następujące atrybuty: imię, nazwisko, adres
email, data zatrudnienia, zarobki, aktualny dział, w którym pracuje pracownik
§dla działu określone są następujące atrybuty: nazwa, opis, data powstania
–Pracownik:
§imię, nazwisko, adres email, data zatrudnienia pracownika są niezmienne,
natomiast zarobki i aktualny dział mogą się zmieniać
§email jest unikalny
–Dział
§nazwa działu jest unikalna
§nazwa działu jest niezmienna
Zadanie 1 –baza pracowników (1)

§Prezentacja danych
§Pracownicy: wyświetlani (imię, nazwisko, email,
data zatrudnienia, zarobki, nazwa aktualnego
działu):
§w porządku rosnącym po nazwisku i imieniu
§w porządku malejącym po zarobkach
§w porządku rosnącym po nazwach działów i
zarobkach
Zadanie 1 –baza pracowników (2)

Zadanie 1 –baza pracowników (3)

§Prezentacja danych
§Działy: wyświetlane (nazwa, opis, data powstania,
liczba pracowników)
§w porządku rosnącym po nazwie
Zadanie 1 –baza pracowników (4)

§Prezentacja danych
–historia przydziałów do działów:
§dla każdego przypisania pracownika do działu należy
zachować informację o tym kiedy pracownik został do
tego działu przypisany oraz kiedy został z niego
wypisany, oraz nazwę działu
§historia przypisania do działów będzie wyświetlana
(imię pracownika, nazwisko pracownika, data
przypisania, data wypisania, nazwa działu) dla:
–każdego pracownika z osobna po dacie przypisania
–każdego działu po dacie przypisania
Zadanie 1 –baza pracowników (5)

Zadanie 1 –baza pracowników (6)