Versio

Database-based filesystem

Overzicht Reageren

Pagina: 1 2 volgende »

Joren de Wit
Beheerder

Joren de Wit

23/05/2008 14:01:00
Quote Anchor link
Op dit moment ben ik bezig met het ontwikkelen van een database-based filesystem dat als basis zal gaan dienen voor een aantal andere projecten. Het uitdenken en opzetten van het datamodel dat gebruikt zal worden is geen probleem, maar ik vraag me nu alleen af wat de slimste manier is om de bestanden fysiek op de fileserver op te slaan.

Het plan is nu om dat zo plat mogelijk te doen en daarom bestanden enkel met een bestandsnaam (zonder extensie) op te slaan. Deze bestandsnaam wordt dan afgeleid van het id dat het betreffende bestand in de database krijgt tijdens het uploaden. Alle overige informatie (filename, extensie, mime-type, size, etc) wordt allemaal in de database opgeslagen.

Op de fileserver zou het er dan ongeveer als volgt uit komen te zien:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- /files
    - /0
        - 0
        - 1
        - ...
        - 999
    - /1
        - 1000
        - 1001
        - ...
        - 1999
    - /2
        - 2000
        - 2001
        - ...
        - 2999

Mijn kennis met betrekking tot (unix) bestandssystemen is niet bijzonder groot, dus zijn er een aantal dingen die ik me afvraag:

- Heeft het aantal bestanden in een map invloed op de snelheid waarmee een enkel bestand benaderd wordt (dat verwacht ik wel).
- En zo ja, wat is een mooi maximum aantal bestanden dat je per map zou willen opslaan.
- Heeft de bestandsgrootte hier ook invloed op en zo ja, wat zou je als maximum grootte per map aanhouden.

Mocht je zelf een hele andere aanpak gebruiken/aanraden, dan sta ik natuurlijk altijd open voor suggesties!

ps. In de mappen met bestanden zal tevens een xml file komen te staan met de meest belangrijke bestandsgegevens (extensie, eigenaar, etc). Als de link met de database om wat voor reden dan ook verbroken wordt, is op die manier altijd nog de meest basale informatie van de bestanden op het filesystem zelf beschikbaar.
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
PHP hulp

PHP hulp

24/05/2012 08:59:29
Gesponsorde koppelingen:
BHosted Hosting al vanaf € 1,- per maand

Controleer nu gratis jouw domeinnaam:

  
 
Frank -

Frank -

23/05/2008 14:11:00
Quote Anchor link
Quote:
In de mappen met bestanden zal tevens een xml file komen te staan met de meest belangrijke bestandsgegevens (extensie, eigenaar, etc). Als de link met de database om wat voor reden dan ook verbroken wordt, is op die manier altijd nog de meest basale informatie van de bestanden op het filesystem zelf beschikbaar.
Een goed datamodel en een backup voorkomen dit soort problemen. Ik zou je niet aanraden om een soort van backup in XML te gaan zetten, je bereikt daar weinig mee.

1) 2 stukken code => 2 stukken code die stuk kunnen gaan of bugs kunnen bevatten
2) 2 stukken code => extra bouw- en testtijd
3) Wat is leading in het geval van een crash? De XML of de database? Probleem...
4) Backup heb je toch al nodig, kost dus geen extra tijd om dit bouwen en te testen. Levert dus geen extra risico's op, integendeel.

En ik ben nog wel zo'n liefhebber van XML... Het is niet overal bruikbaar en het is een aanslag op de performance. Nu kost extra geheugen of een extra (snelle) processor niet zo veel, maar toch. XML lijkt mij hier niet op zijn plaats, het is geen goed backup/fallback mechanisme.
 
Joren de Wit
Beheerder

Joren de Wit

23/05/2008 14:14:00
Quote Anchor link
Oke, duidelijk. Als je het op die manier bekijkt is het ook eigenlijk wel logisch. Nog suggesties over het filesystem zelf?

ps. Dus dan met name met betrekking tot de aantallen/grootte van bestanden en structuur?
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
Frank -

Frank -

23/05/2008 14:31:00
Quote Anchor link
Nop, heb ik geen relevante kaas van gegeten.
 
Riemer

Riemer

23/05/2008 14:53:00
Quote Anchor link
Over wat voor bestand systeem hebben wij het over?
Meest reguliere bestandsystemen op de *nix bakken zijn ext2 en ext3.

Maar als je 1000 files/subdirectories per map aanhoudt moet dat geen probleem zijn. Problemen krijg je onder ext2 als je rond de 10.000 komt, dan begint alles wat langzamer te worden. in ext3 zal dit getal wel hoger liggen.

Verder als je wat literatuur wilt, google op inode, ext2 of ext3, zal vast wel wat interessants tussen liggen ;)
 
Joren de Wit
Beheerder

Joren de Wit

23/05/2008 15:38:00
Quote Anchor link
Thanks, heb even wat dingtjes doorgelezen en hier kan ik zeker wat mee.

Op dit moment is nog onzeker hoe de configuratie van de productie server eruit komt te zien, dus dat is even afwachten. In ieder geval lijkt een aantal van 1000 files/directories een mooi aantal om voor dit moment aan vast te houden.

Wat ik me dan alleen nog afvraag is of de bestandsgrootte nog invloed heeft op de performance. Ik vermoed van niet aangezien ik daar niets over heb kunnen terugvinden in de verschillende documentaties. En als het filesystem net als een database gebruik maakt van een soort indexen zou je helemaal niets te maken hebben met de bestandsgrootte. Of ga ik hier nu de mist in?
 
Riemer

Riemer

23/05/2008 17:00:00
Quote Anchor link
De enige manier waarop de grote van een bestand van enige performance drop kan leiden is, het lezen/schrijfen van het bestand. Denk erom dat je grote blokken leest en schrijft en deze in een buffer in het geheugen zet (of andersom in het geval van schrijfen). Hoe dat moet, hangt af van de gebruikte taal.

Verder is er een index ja, anders is het onmogelijk om in te denken hoe je efficient door een mappenstructuur heen moet navigeren. Hoe en wat precies hangt af van de gebruikte filesystem. Ik heb helaas ext2-3 weinig bestudeerd, maar ik meende mij te herinneren dat de index helemaal vooraan zat en de uiteindelijke data achteraan.

Als laatst wat ik wil toevoegen is, dat je misschien de optie eens moet overwegen om alles in 1 grote bestand op te slaan, je zit wel met 2 gig limiet misschien (signed int32 offset limiet) maar daar heb je of niks mee te maken of er zijn al lang oplossingen voor bedacht (hangt weer af van de gebruikte taal). Maar voordelen zijn er ook, je gebruikt de gehele ruimte van elk cluster die je opvult (inplaats van misschien een 1KiB bestand in een 4KiB cluster), en je kan bijv. compressie toepassen.
Gewijzigd op 01/01/1970 01:00:00 door Riemer
 
Hipska BE

Hipska BE

23/05/2008 17:12:00
Quote Anchor link
Dat van dat ene groot bestand zat ik net ook te bedenken..

Is het niet mogelijk om ook even de mogelijkheid te bekijken om de inhoud van het bestand ook in de DB op te slaan? Had vroeger es gehoord dat dat eig geen goed idee was, maar waarom precies is me ontgaan.
 
Joren de Wit
Beheerder

Joren de Wit

23/05/2008 17:14:00
Quote Anchor link
Quote:
Als laatst wat ik wil toevoegen is, dat je misschien de optie eens moet overwegen om alles in 1 grote bestand op te slaan
Dat is in dit geval waarschijnlijk geen optie. Het gaat hier namelijk om bestanden die sterk kunnen variëren in grootte. Denk dan aan een word document van 50 kB tot bijvoorbeeld photoshop bestanden van enkele honderden mb's.

Quote:
De enige manier waarop de grote van een bestand van enige performance drop kan leiden is, het lezen/schrijfen van het bestand.
Dat had ik inderdaad ook al bedacht. Binnenkort maar eens uitzoeken hoe we het uploaden van (met name grotere) bestanden soepel kunnen laten verlopen.

Maar bedankt in ieder geval voor de informatie, ik kan weer verder :-)

ps. @Hipska: bestanden in de database opslaan is ook vanwege eerder genoemde reden geen optie. De database wordt hierdoor heel snel heel groot en dat komt tde performance zeker niet ten goede. Bovendien is het heel moeilijk om grote bestanden vanuit de database ter download aan te bieden, alle data moet dan namelijk eerst via de database connectie, dan door php om vervolgens pas aan de gebruiker aangeboden te kunnen worden.
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
Hipska BE

Hipska BE

23/05/2008 17:28:00
Quote Anchor link
Ik hoor PGfrank altijd zeggen dat grote DB's helemaal geen probleem zijn..

Trouwens als je bestanden gewoon op je server staan, moet je ze ook via fread en php aan de gebruiker leveren. Zal die database connectie de hele boel dan zoveel vertraging opleveren?

Misschien kun je een paar verschillende methoden uitproberen en een paar testcase's uitvoeren?
 
Jurgen assaasas

Jurgen assaasas

23/05/2008 17:29:00
Quote Anchor link
Tuurlijk heeft bestandsgrootte wel invloed op preformance, een groter bestand betekent langer lezen, dit is bij 1 file niet erg, maar stel je hebt een hele folder die je wilt uitlezen?
 
Riemer

Riemer

23/05/2008 17:32:00
Quote Anchor link
Mja ik begrijp de argumenten niet echt om niet alles op een groot bestand te gooien. Je kan bijv. dingen bewaren zoals waar begint het en hoe groot is een bestand, een eigen index kun je wel zeggen. Of je kunt het natuurlijk ook je eigen filesystem noemen in de vorm van een bestand.

Het is natuurlijk wel een enorme klus ;)

Edit: @jurgen, op wie reageer je nou? Als het op mij was, zoals je kan zien bedoel ik dus ook de IO. Vraag van blanche was, volgens mij, of dit ook invloed heeft op de index en de rest van de filesystem.
Gewijzigd op 01/01/1970 01:00:00 door Riemer
 
Hipska BE

Hipska BE

23/05/2008 17:40:00
Quote Anchor link
@Jurgen: de bedoeling zal hier nooit zijn om een folder uit te lezen, wel om een bestand in te lezen waarvan men vooraf (door de DB) al weet in welke folder het staat.

@Riemer: idd, je zou de offset en de lengte voor het lezen in de DB kunnen opslaan en bij openen van bestand deze waarden gebruiken.
 
Joren de Wit
Beheerder

Joren de Wit

23/05/2008 17:42:00
Quote Anchor link
Hipska schreef op 23.05.2008 17:28:
Ik hoor PGfrank altijd zeggen dat grote DB's helemaal geen probleem zijn..
Grote databases zijn inderdaad geen probleem, zolang je op een slimme/goede manier indexen aanbrengt in je tabellen. Hier gaat het echter om heel veel records die de database groot maken, maar de records zelf nemen nauwelijks ruimte in. Met bestanden van 500 mb is dat wel even anders...
Quote:
Trouwens als je bestanden gewoon op je server staan, moet je ze ook via fread en php aan de gebruiker leveren. Zal die database connectie de hele boel dan zoveel vertraging opleveren?
Dat is waar, maar de databaseserver is dan net weer een extra tussenstap. En waarom zou ik de databaseserver aan het werk zetten om bestanden aan te bieden die ik ook direct van het bestandssysteem kan plukken. Bovendien bestaat de kans dat in de uiteindelijke productieomgeving de database- en fileserver fysiek verschillende servers zijn. En dan kom je in de problemen als je de bestanden in je database opslaat...

Het is wel interessant om hier eens wat tests mee uit te voeren om te zien wat voor invloed dat nou heeft op de snelheid van het script. Wellicht dat ik daar tijdens dit project nog eens aan toe kom.

@Jurgen: het schrijven en lezen van een bestand gebeurt in principe alleen bij het up- en downloaden van het betreffende bestand. Alle informatie over het bestand staan verder in de database, dus daarvoor hoeft het bestand zelf niet benaderd te worden. Ook zullen deze directories nooit uitgelezen worden, wederom omdat alle gegevens van het (virtuele) filesystem in de database staan. Het fysieke filesystem zal alleen gebruikt worden om 1 specifiek bestand op te zoeken en als download aan te bieden.

ps. Hmm, toch eens wat sneller typen?
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
Jurgen assaasas

Jurgen assaasas

23/05/2008 17:43:00
Quote Anchor link
Ik snap denk ik niet echt het systeem als ik dit zo lees, is het nu de bedoeling om met behulp van een database (PGSQL, MySQL, Oracle of wat dan ook) een sneller file system te maken wat op *nix gaat draaien?
 
Hipska BE

Hipska BE

23/05/2008 17:48:00
Quote Anchor link
@Jurgen: Zo kun je het ongeveer noemen ja..

@Blanche: Ok, ik ga er mee akkoord dat de data in DB zetten niet de beste methode is, maar om alles in 1 groot bestand (evt met compressie) zoals Riemer aanhaalde lijkt mij zeker ook een te overwegen methode.
 
Joren de Wit
Beheerder

Joren de Wit

23/05/2008 17:55:00
Quote Anchor link
Nee, het is niet het doel om een 'sneller filesystem' te ontwikkelen. Dit filesystem zal namelijk als algemene repository gaan dienen op basis waarvan een aantal andere projecten ontwikkeld zullen worden. Al die projecten hebben toegang tot ditzelfde bestandssysteem, dus vandaar dat er een uitgebreide authorisatie laag boven komt te liggen.

In de database zetten we nu eigenlijk een heel virtueel filesystem op waarbij de daadwerkelijke bestanden op een hele platte manier (zoals boven beschreven) op de fileserver opgeslagen worden. Het ging mij nu vooral om de structuur die voor het fysieke gedeelte op de fileserver gebruikt gaat worden en wat dus inderdaad de performance van het vinden en benaderen van bestanden zou zijn.

@Hipska: ik betwijfel of de eventuele winst qua performance opweegt tegen het vele extra werk dat er waarschijnlijk in gaat zitten. Ik zie veel potentiele problemen die bijvoorbeeld sneller tot corruptie van meerdere bestanden tegelijk kunnen leiden. Daar zou veel tijd in gaan zitten en zoals je weet is tijd erg kostbaar ;-)
 
Hipska BE

Hipska BE

23/05/2008 18:05:00
Quote Anchor link
Ja idd, ik zei ook "te overwegen" hé ;-)

Maar ik ben zeer geïnteresseerd in de verdere ontwikkeling van dit project.
 
Riemer

Riemer

23/05/2008 18:13:00
Quote Anchor link
Ja het is misschien ook niet echt realistisch te noemen om zo'n systeem te bouwen voor een project waar clienten in het spel zitten. Dan is betrouwbaarheid en natuurlijk tijd snel een issue.

In iedergeval veel succes ermee
Gewijzigd op 01/01/1970 01:00:00 door Riemer
 
Jelmer rrrr

Jelmer rrrr

23/05/2008 18:32:00
Quote Anchor link
Ik zou toch niet voor de alles-in-een variant gaan, denk hierbij aan fragmentatie. Voor je filesystem (ntfs, ext3) heb je hier allemaal optimalisaties voor in plaats en kan je defragmenteren. Dit zou je bij grote bestanden zelf in moeten bakken. Alles-in-een is alleen echt handig wanneer je data weinig tot niet verandert denk ik.

Ik ben zelf een keer tegen het inode-limiet van ext3 aangelopen. Na 16.000 of 160.000 submappen (ben de details vergeten) kan je geen nieuwe submappen meer aanmaken. Ik heb het op die specifieke website opgelost door het id op te delen in stukjes van 3. Ieder stukje is een submap, met een totale lengte van 9 (dus maximaal 3 submappen) En dat werkt verder wel goed. Ik merkte trouwens niet echt iets van een performance impact toen ik tegen dat limiet was opgelopen.

Verder 1 ding waar ikzelf tegenaan liep bij het uitdenken van een FS in een DB: lege mappen.
 
Riemer

Riemer

23/05/2008 19:00:00
Quote Anchor link
Ik denk dat een FS in een DB ook niet echt handig is.
Je kan beter de idee omgooien dat de bestand naar de map verwijst (foreign key), maar kan beter omgekeerd (map verwijst naar bestand). Zo kun je oa snel checken of een bestand bestaat onder andere.

Alhoewel ik moet zeggen dat ik nooit echt tegen de probleem van fragmentatie ben aangelopen, maar de systemen die ik op het moment heb geprogrameerd zijn ook niet massief te noemen (1-2 gig data opslag).
Maar in principe kun je data die je 'verwijderd' beter aanwijzen in de index gedeelte dat deze vrij is (net zoals een normaal FS), en bij het inserten van data kijken of er een gedeelte groot genoeg is om op te vullen zonee ga verder tot aan de einde. Dan kun je later op de avond ofzo alle fragmenten naast elkaar zetten.

Updaten van gegevens blijft dan wel een ramp ;) misschien gewoon achteraan zetten, en de locatie in de index aanpassen?

Edit: Hehe, ik krijg opeens allemaal inspiratie. Ik denk dat ik maar eens aan de slag ga aan zoiets :)
Gewijzigd op 01/01/1970 01:00:00 door Riemer
 

Pagina: 1 2 volgende »



Overzicht Reageren