SDGNnr80 zonder adv.id

advertisement
a u t e u r
Chris Schaeffer &
Joek Hondius
The elephant
never forgets
Al enige jaren leveren wij een urenverantwoordingsysteem dat draait op Oracle of Microsoft SQL Server.
Omdat alle medewerkers binnen een organisatie
gebruik maken van dit systeem dient de klant dus te
beschikken over veel userlicenties. De bedragen die aan
b.v. Oracle voor licenties betaald moeten worden, overstijgen de kosten van ons systeem verre. Om e.e.a ook
voor kleinere organisaties betaalbaar te houden gingen
we op zoek naar een goedkopere, liefst gratis database. Deze database moest zich qua stabiliteit, performance en functionaliteit kunnen meten met Oracle en
MsSQL. Na uitgebreid onderzoek kwamen wij uiteindelijk terecht bij PostgreSQL als de database die volledig
aan onze eisen voldeed.
Historie
Het PostgreSQL project werd in 1986 gestart bij de
Universiteit van California op het roemruchte Berkeley,
oorspronkelijk onder de naam Postgres en gesponsord
door het Amerikaanse leger. Via Postgres95 werd dit
uiteindelijk PostgreSQL. PostgreSQL is beschikbaar voor
bijna alle moderne Unix systemen (34 platforms bij de
laatste release) en via Cygwin ook voor Windows.
Functionaliteit
Een volledig overzicht van de functionaliteit, vergeleken
met andere systemen, kunnen we hier, wegens plaatsgebrek, niet geven. Op de MySql website (1) kun je zelf
allerlei databases met elkaar vergelijken. Wat opvalt, is
dat PostgreSQL zeer volledig de ANSI SQL standaards ondersteunt en volledig ACID compliant is. Verder heeft
PostgreSQL alles wat je van een volwassen RDBMS mag
verwachten zoals referentiële integriteit, views, triggers,
sequences, stored procedures, transacties, outer joins en
nog veel meer.
De liefst gratis database moest
zich qua stabiliteit, performance
en functionaliteit kunnen meten
met Oracle en MsSQL
Documentatie
De documentatie bij PostgreSQL is in één woord uitmuntend. Op de site van PostgreSQL (2) valt het niet vanzelf
op, maar je kunt er werkelijk alles vinden over dit systeem
12
februari 2004
tot aan de specificaties van de datafiles en het netwerkprotocol. Er is ook een aantal boeken over PostgreSQL geschreven, onder meer door één van de leading developers,
Bruce Momjian. Het boek, PostgreSQL: Introduction and
Concepts (3) is, hoe kan het ook anders, in z’n geheel
online beschikbaar.
i e tie
Lc n
PostgreSQL wordt geleverd met BSD licentie, wat erop
neerkomt dat je zonder kosten de software en documentatie mag gebruiken, wijzigen, kopiëren en verspreiden,
al dan niet tegen betaling, als je het maar onder dezelfde
voorwaarden doet en de gebruikelijke disclaimer terug te
vinden is. Het copyright blijft bij de makers. Deze licentie
is dus minder restrictief dan de beroemde GNU GPL,
waarbij het mee linken van libraries erin resulteert dat je
hele applicatie open source is geworden.
I
nstallatie
De installatie van PostgreSQL is natuurlijk afhankelijk
van het platform. Wij beperken ons tot Linux en Windows;
voor de exotischer besturingssystemen of installatie van
de source kun je beschrijvingen vinden op de PostgreSQL
site (4).
De meeste Linux distributies hebben een installatiebestand voorhanden in de directory (5) waar deze bestanden zich bevinden. Voor RedHat Linux zijn er b.v. RPM’s.
PostgreSQL is vanaf de volgende versie ‘’native” voor
Windows beschikbaar. Dat wordt naar verwachting
medio 2004. Tot die tijd draait PostgreSQL op Windows
via Cygwin, een library die een laag tussen Windows en
PostgreSQL vormt. Wel stabiel, maar trager dan absoluut
noodzakelijk, en PostgreSQL is dan gebonden aan een
maximum van 60 gelijktijdige connecties.
Voor de installatie op Windows (alleen NT4, W2000, XP)
is een eenvoudige installer beschikbaar op onze web site (6). Downloaden, starten, de bekende vragen beantwoorden, en vervolgens zijn er twee extra services
beschikbaar: postmaster en ipc-deamon.
Tools
De database benaderen kan via de commandline-client
“psql”. Dit is een krachtige tool, maar je moet er wel aan
wennen. Grafische beheerstools a la TOAD zijn er in
soorten en maten, freeware en commercieel. Aanraders
onzerzijds zijn PgAdminIII (7) en EMS PostgreSQL Manager (8).
Fig. 1 EMS PostgreSQL Manager
Dan moeten we nog wel gebruiker larry en de sterrendatabase aanmaken:
Users, Rechten en Toegang
Op elke PostgreSQL server kunnen vele databases draaien. Standaard zijn er altijd 2 aanwezig, waarvan er een
benaderbaar is: template1. Hiermee moet je in eerste instantie verbinding maken op een nieuwe server. Als je
bent ingelogd kun je users en databases aanmaken.
PostgreSQL users zijn niet dezelfde users als die van je
besturingssysteem, ze bestaan alleen binnen PostgreSQL.
Er is altijd een database superuser genaamd postgres.
De authenticatie wordt geregeld door middel van het
bestand pg_hba.conf in de datadirectory van de installatie. Vaak is dat: /var/lib/pgsql/data. Er is een veelheid
aan mogelijkheden. Per database kun je dit opgeven.
Standaard heb je vanaf localhost toegang tot template1.
Dat is te zien in de 1e regel van de tabel hieronder.
In de 2e regel is te zien dat het locale netwerk met een
versleuteld wachtwoord toegang krijgt tot template1 en
larry van overal ter wereld met wachtwoord in de sterrendatabase mag.
CREATE USER larry PASSWORD secret;
CREATE DATABASE sterren;
Door achter CREATE USER larry etc. CREATEUSER en/of
CREATEDB te zetten kunnen we larry rechten toekennen
om respectievelijk users en/of databases aan te maken.
Zoals je ziet wordt de nieuwe database aangemaakt op
basis van het sjabloon template1. Je kunt met dit laatste
commando overigens ook heel makkelijk een kopie van
een reeds draaiende database maken, inclusief data.
Elk database object heeft een OWNER. Dat is de user die
dat object gecreëerd heeft. Wijzigen kan met ALTER USER.
De owner heeft alle rechten op een object; als andere
users iets met het object willen, hebben ze hiertoe privileges nodig. Er zijn er 12: SELECT, INSERT, UPDATE, DELETE,
RULE, REFERENCES, TRIGGER, CREATE, TEMPORARY, EXECUTE, USAGE, and ALL PRIVILEGES.
# TYPE
DATABASE
USER IP-ADDRESS IP-MASK
METHOD
Local
all
all
trust
Host
template1
all
Host
sterren
Larry 0.0.0.0
Voorbeeld van pg_hba.conf
192.168.0.0
255.255.255.0
md5
0.0.0.0
password
Back-up/Restore
Er zijn 2 manieren om een back-up van
PostgreSQL te maken, Online en Offline. Offline houdt in dat je de database server stopt,
en de datafiles kopieert. Alles zit mooi in
één map.
sdgn magazine
februari 2004
13
Online backuppn gaat zo:
pg _ dump -U username -h hostname databasename >
bakfile.sql
Je ziet dat de back-up gemaakt wordt naar standaard uit.
Het file bestaat uit SQL commando’s.
Terugzetten gaat als volgt:
psql [opties] databasenaam < bakfile.sql
Er zijn veel dingen mogelijk: terugzetten per tabel, alles
leegmaken, comprimeren, scheiden schema/data en bijvoorbeeld overzetten van de ene naar de andere server
met een commando:
pg _ dump -h host1 dbname | psql -h host2 dbname
In onze ervaring zijn de backup-bestanden die PostgreSQL
maakt erg klein, maar flexibel in vergelijking met de commerciële alternatieven.
Performance
Performance heeft twee kanten, namelijk de vergelijking
met andere databases, ofwel benchmarks, en wat je kunt
doen om de performance te verhogen, ofwel tuning. Dit
laatste komt verderop aan de orde. Helaas mogen we
volgens de licenties van de grote database leveranciers
geen benchmarks publiceren waarin hun product genoemd wordt. Daarom zien de resultaten er iets anders
uit dan je zou verwachten.
PostgreSQL heeft niet de naam een snelle database te
zijn. PostgreSQL 6.4 was ook traag (eind 1998). Intussen
(versie 7.4/2004) is er heel veel veranderd. PostgreSQL
heeft zichzelf in de vingers gesneden door standaard
zeer bescheiden instellingen toe te passen, zodat het op
elke machine draait, maar wel traag.
Over het algemeen wordt MySQL geroemd om z’n snelheid en Oracle wordt over het algemeen ook gezien als
een snelle database. Straks komen we bij de cijfers, maar
eerst is het tijd voor de gebruikelijke waarschuwing
vooraf. Hoe kun je eigenlijk MySQL vergelijken met
PostgreSQL? Een database die niet aan views, transacties,
subselects of integriteitschecks doet, moet wel sneller
zijn dan een database die dat wel kan. We zullen zien.
Oracle heeft natuurlijk het voordeel dat het meestal
goed beheerd wordt en aan hardware is in dat kamp
meestal ook geen gebrek. PostgreSQL heeft een slimme
planner en doet row level locking bij writes en geen
locking voor simultane reads. Het resultaat is een database die zelfs bij een grote wirwar van queries soepel
blijft reageren, ook met honderden connecties.
Het onderling vergelijken van databases op snelheid
moet je eigenlijk sowieso niet doen, maar omdat wij
identieke databases kunnen creëren op PostgreSQL en
Larry die zo uit een productieomgeving komen en die we
onder grote realistisch gesimuleerde druk kunnen zetten,
advertentie
konden we het toch niet laten. MySQL is echter totaal
ongeschikt voor ons database schema, Interbase ondersteunen we niet, want PostgreSQL was makkelijker te
porten en gratis.
Er zijn ook anderen die tests hebben uitgevoerd, zoals de
firma GreatBridge die enkele jaren door een onafhankelijk instituut de TPC-C hebben laten uitvoeren op Larry
en Bill, en Interbase, MySQL en PostgreSQL. PostgreSQL
kwam eruit als de grote winnaar, zij aan zij met Larry,
zowel m.b.t. performance als schaalbaarheid. Deze tests
raakten echter zeer omstreden, en de validiteit is nooit
vast komen te staan. Verder lopen de meldingen uiteen
van MySQL 3x sneller tot even snel als PostgreSQL.
Fig. 2 PGAdmin-III
Dan nu onze eigen test:
De database is een kopie van een productiedatabase van
ons client/server urenverantwoording systeem Big Ben.
Deze database kan 1 op 1 worden overgezet van PostgreSQL op Larry en vice versa. Voor het maken van de testprogrammatuur hebben we de queries die een gebruiker
in een standaardsessie naar de database verstuurt gelogd. In deze test werden hiermee na wat aanpassingen
6 concurrent users gesimuleerd die elk 200 maal achter
elkaar inloggen. Totaal 1200 sessies per database dus. Let
wel: een standaard sessie duurt normaal ongeveer 10
minuten, in deze test is dat 4 seconden! De users werden
asynchroon opgestart om enige spreiding aan te brengen. De spreiding werd overigens tijdens de test vanzelf
groter. Tussen elke gesimuleerde sessie zat een pause
van 1 sec. Er werden per gesimuleerde sessie 80 queries
afgevuurd waarvan 10% insert/update/delete, 74
(sub)selects waarvan 46 op complexe (gestapelde) views.
Door de server werden 2000 records per sessie geretourneerd, totaal 12000 x 2000 = 24.000.000 records per database over de gehele test. De testdatabases bevatten 48
tabellen met 179 indexen en 77 foreign key’s, alsmede 30
sequences met bijbehorende triggers en 138 views. In totaal bevatten de databases 211.117 records, in grote en
kleine tabellen.
De specificatie van de testservers was als volgt:
• Larry 8.0.6: Pentium 4 2.0 Ghz, 512 Mb,
SCSI - Windows 2000 Adv. Server
• PostgreSQL 7.3.2: Pentium 4 2.0 Ghz, 512 Mb,
SCSI - RedHat Linux 9
Resultaten: Beide databases komen op een gemiddelde
van 4 seconden per sessie, PostgreSQL deed over de 200
sessies ruim 14 min, Larry had ruim 16 min nodig. Hierbij
moet opgemerkt worden dat Larry een kleinere variatie
in de responstijden per sessie vertoonde dan PostgreSQL.
Larry gebruikte minder CPU maar meer geheugen dan
PostgreSQL.
sdgn magazine
februari 2004
15
Het 100mb netwerk werd maximaal 5% bezet, de testclient kwam nooit boven 75% CPU.
De resultaten van anderen:
GreatBridge
Tim Perdue
sqlite
TCP-C: PostgreSQL komt als snelste
uit de bus naast Larry, Bill, Interbase,
en MySQL. Echter via ODBC getest,
mede hierdoor omstreden.
Test met een productiedatabase voor
de SourceForge website: MySQL is 2 a
3x sneller (database was echter
geschreven voor MySQL, geen
gebruik gemaakt van views bv), koos
toch voor PostgreSQL vanwege de
stabiliteit en schaalbaarheid
Na juiste instellingen van PostgreSQL
geen snelheidsverschil met MySQL
op pure insert en update tests. Deze
resultaten hebben wij overigens niet
kunnen repliceren.
Tuning
De factoren die van invloed zijn op de performance van
een database zijn enerzijds het databaseontwerp en de
queries en anderzijds de hardware en het gebruik van
systeembronnen. Bij PostgreSQL is met betrekking tot
het laatste met een aantal eenvoudige maatregelen
grote winst te boeken, maar verder heeft PostgreSQL dan
ook weinig aandacht meer nodig. Verder kan de databasedriver ook verschil opleveren.
Ten eerste is het van groot belang om het shared memory
en de buffers aan te passen. Standaard is dit zeer laag
ingesteld. Dit geheugen wordt gebruikt om de tabellen
erin te laden. Bij kleine databases is dit dus niet zo belangrijk, bij grotere kan het zomaar een factor 10 schelen.
Om de kernel in te stellen gebruik je:
echo 268435456 > /proc/sys/kernel/shmall
echo 268435456 > /proc/sys/kernel/shmmax
Om dit permanent te maken m.b.t. het rebooten:
echo “kernel.shmall = 268435456” >> /etc/sysctl.conf
echo “kernel.shmmax = 268435456” >> /etc/sysctl.conf
Nu heeft je systeem voldoende shared memory beschikbaar en kunnen we de buffers aan PostgreSQL toekennen. PostgreSQL werkt met buffers van 8Kb, dus in bytes:
268435456 / 8192 = 32768 buffers, wat we naar beneden
afronden tot 30000. En passant passen we nog het sort
memory aan, ook van belang bij group by clausules. De
ingestelde hoeveelheid wordt voor elke query gebruikt.
Het instellen gaat in het bestand postgresql.conf. In hetzelfde bestand kun je afhankelijk van de behoefte ook het
maximum aantal connecties opgeven, en als je een UPS
hebt of veel vertrouwen in je stroomleverancier kun je de
16
februari 2004
optie fsync op false zetten, wat erg veel uitmaakt voor
INSERTS en UPDATES. Wij vullen onze standaard testdatabase dmv INSERTS. Dat duurt 2 uur met fsync=on en
6:30 minuten met fsync=off op een Compaq Proliant
320DL met SCSI. Na wijziging van postgresql.conf nog wel
even de database herstarten.
postgresql.conf:
shared _ buffers = 30000
sort _ mem = 12288 # 12Mb
max _ connections = 512
#fsync = false # uncomment this for speed.
Only use with UPS
In de tweede plaats is het van groot belang om regelmatig, bijvoorbeeld eens per dag of zelfs per uur, het SQL
commando VACUUM ANALYZE te geven. Dit ruimt niet
alleen oude records op, maar stelt ook de instellingen van
de optimizer in op het gebruik en ontwerp van jouw
database. Op de langere duur is dit goed merkbaar.
Dit kan bijvoorbeeld door middel van een cronjob of een
scheduled task.
Het is van groot belang om
regelmatig, bijvoorbeeld eens
per dag of zelfs per uur het SQL
commando VACUUM ANALYZE
te geven
Over performance by design (9) valt veel te zeggen, maar
wij houden het op de volgende hints:
1. Gebruik de juiste datatypen.
2. Zoek naar de 20% queries die het meest gebruikt worden en optimaliseer die.
3. Gebruik het explain commando om meer over een
trage query te weten te komen. De query planner van
PostgreSQL berekent het snelste plan als het aantal
mogelijke plannen laag is. Bij complexe queries met
meer tabellen wordt het aantal mogelijke oplossingen
al snel te groot, en worden geavanceerde genetische
algoritmes gebruikt om een schatting te maken van
het beste plan. Soms is dit echter helaas niet de snelst
mogelijke oplossing. Met EXPLAIN krijg je inzicht in
het plan, en door de query te herschrijven kun je het
plan beïnvloeden.
4. Zorg voor een juist gebruik van indexen.
Drivers
Hoewel ongeveer alle drivers uiteindelijk gebruik maken
van de client library die met PostgreSQL wordt meegeleverd, is in de praktijk gebleken dat de driverkeuze veel uit
kan maken op het gebied van performance. Het is overigens ook mogelijk om zelf het netwerkprotocol te implementeren, want dit is zeer nauwkeurig beschreven, maar
wij zouden het niet aanraden.
De gratis ODBC driver (10) kan, hoewel bekend als snel,
toch tegenvallende resultaten geven als je veel kleine,
losse queries afvuurt. Een ODBC driver heeft wel het nadeel dat die op alle client computers moet worden geïnstalleerd en geconfigureerd, terwijl de andere drivers in
de applicatie mee gecompileerd kunnen worden.
Zeos Delphi driver (11) voor PostgreSQL is onverslaanbaar
(t.o.v. b.v. MDAC) met grote datasets, maar relatief traag
met kleine. Zeos ondersteunt ook vele andere databases.
De commerciële Delphi/C builder driver van vitavoom (12)
voor DBX is snel, maar kan, als de lengte van een veld niet
vaststaat, enorm veel geheugen aan de client kant gaan
gebruiken, wat de zaak weer kan vertragen. Dit kan voorkomen bij selecties op stapelingen van views.
Als je de client library (13) van PostgreSQL gebruikt, heb je
alles natuurlijk zelf in de hand, maar wordt het wel meer
bare-bones programmeren.
Links
1
2
3
4
5
6
7
8
9
10
11
12
13
http://www.mysql.com/information/features.html
http://www.postgresql.org/docs/current/interactive/
http://www.postgresql.org/docs/awbook.html
http://www.postgresql.org/docs/current/static/installation.html#INSTALL-SHORT
ftp://ftp.eu.postgresql.org/pub/unix/db/postgresql/
http://www.rem.nl/postgresql/
http://www.pgadmin.org/
http://www.ems-hitech.com/pgmanager/
http://www.postgresql.org/docs/current/static/performance-tips.html
http://techdocs.postgresql.org/techdocs/pgsqldbtuning.php
ftp://ftp.eu.postgresql.org/pub/unix/db/postgresql/odbc/versions/full/
http://www.zeoslib.net/
http://vitavoom.com/
http://www.postgresql.org/docs/current/static/libpq.html
Nawoord
PostgreSQL heeft de olifant als zinnebeeld gekozen. Niet
omdat het log en traag zou zijn (wel eens een kudde boze
olifanten gezien?), maar om de stabiliteit. Ondanks een
relatief klein brein (laag geheugen gebruik) kan hij de
data moeiteloos oplepelen, ook bij veel gelijktijdige connecties. Deze olifant is zeker geen allemansvriendje, maar
onder professionele begeleiding is hij tot grootse dingen
in staat.
Chris Schaeffer, geboren in 1955, DBA, is
sinds 1996 werkzaam bij REM automatisering, Research en Development. Zijn
interesses liggen bij database ontwikkeling, user interfaces en Delphi.
Joek Hondius, geboren in 1972, studie
psychnomie/neurale netwerken, is eveneens werkzaam bij REM automatisering,
Research en Development. Zijn interesses
liggen vooral bij Java, security/encryptie,
linux en databases.
advertentie
17
Download