Strategie Drupal 7 per grandi quantitativi di dati

24 contenuti / 0 new
Ultimo contenuto
Strategie Drupal 7 per grandi quantitativi di dati

Ciao a tutti,

sto lavorando con Drupal7 ed ho la necessità di archiviare nel db un gran numero di informazioni, istanze di form, ma non so bene quale strategia utilizzare.

L'obiettivo è quello di archiviare dati strutturati (es. form con 40-50 campi) in grande quantità (1-2 milioni di form memorizzate) e quindi utilizzarli per fare ricerche e statistiche.

E' la soluzione giusta utilizzare in DRUPAL 7 i NODI per memorizzare tali informazioni?
Con milioni di nodi memorizzati come se la cava Drupal?

Devo risolvere velocemente questa problematica... ho bisogno proprio di un buon consiglio da un esperto.
Grazie anticipatamente!

Con così tanti dati è il database e il server che contano, il primo lo devi mantenere e sul secondo devi spendere.

Drupal se la cava benissimo (di per se') con milioni di nodi: vedi ad esempio drupal.org (è vero che è D6, ma su queste cose non conta)

Come dice @ealmuno, il problema è il server DB e, aggiungo io, che tipo di query farai sui dati: query complesse non ottimizzate su tabelle con milioni di records == morte civile...

Quindi molta attenzione alle query che farai, forse conviene prevedere moduli ad hoc invece di Views (che per quanto sia rimane molto general-purpose)

Angelo Turetta

Argomento davvero interessante, quindi i dati li memorizzereste tramite nodi utilizzando field per definire la struttura (content type)?
il fatto che poi tutti questi dati sono memorizzati fisicamente nel db in tabelle diverse (una tabella per field) non può essere un problema per le prestazioni?

Lo rallenta si, ma aumenta la scalabilità.

E cosa mi dite delle entity? mi pare di aver capito che i nodi non sono altro che entity. Quindi si potrebbe creare una entità per i dati "standard" (e quindi una tabella sola per questi dati) e utilizzare i field per quelli che non lo sono

@PaoloP2P: Drupal 7 supporta storage SQL in configurazioni master-slave, quindi (a meno di enormi/veloci immissioni di dati) non dovresti avere grossi problemi, eventualmente estendendo il DB con istanze slave MySQL.
In alternativa MySQL ha anche un supporto iniziale a MongoDB per lo storage di oggetti, una cosa che -nel caso realmente servisse- potresti pensare di fare è di andare a salvare istanze complete di nodi all'interno di MongoDB/CouchDB e poi andare a fare ricerche/aggregazioni su queste. Considera anche che puoi procedere per step, quindi tiri su in fretta una configurazione M-S di MySQL e se non dovesse bastare tiri su altri slave, oppure crei meccanismi di ricerca/aggregazione più efficienti (vedi sopra).

Ciao
Marco
--
My blog
Working at @agavee

@ealmuno: in che senso aumenta la scalabilità? forse volevi dire flessibilità?

Ciao
Marco
--
My blog
Working at @agavee

Oltre che flessibile, anche scalabile secondo me perché va sia bene con piccoli siti che con grossi siti, poi è un po' complicato definire scalabilità.

Scalabilità (per come credo venga intesa in questo contesto) è aumentare il numero di utenti a partà di risorse.
In questo caso la suddivisione degli elementi con la strutturazione a field, in cui l'estrazione dei diversi dati richiede diverse JOIN (o tante query singole), forse non è proprio il modo migliore per "scalare" il sistema...

Ciao
Marco
--
My blog
Working at @agavee

Ciao a tutti, grazie per le preziose informazioni.
A questo punto è chiaro che Drupal può essere utilizzato per risolvere il problema in termini generali.

Ma il mio dubbio resta sulle modalità da seguire per l'implementazione: le Entity API sono la strada da seguire?
Temo lo scenario per il quale alla prossima minor release di Drupal, dopo aver scritto un bel pò di codice a manina, debba dover riscrivere buona parte di quanto implementato.

Ad esempio, sempre sotto l'ipotesi di avere potenzialmente milioni di nodi, vorrei realizzare una anagrafica che gestisca queste informazioni di base:
Nome, cognome, indirizzo, città, email, telefono, ecc... (e molti altri campi, circa 40-50 in totale).

Questo è quello che devo fare:
1) Vorrei poter definire tramite l'interfaccia grafica di Drupal7 i widget associati ai campi della tabella sopra descritta e le loro impostazioni.
Come è possibile farlo?

2) Vorrei che in un futuro mi sia possibile modificare/aggiungere/eliminare in modo semplice i campi della sopra descritta tabella (sempre con l'interfaccia grafica di Drupal7).
Come è possibile farlo?

Nessuna idea? ...oppure ho mal posto la domanda?

Quote:
1) Vorrei poter definire tramite l'interfaccia grafica di Drupal7 i widget associati ai campi della tabella sopra descritta e le loro impostazioni.
Come è possibile farlo?
CCK
Quote:
2) Vorrei che in un futuro mi sia possibile modificare/aggiungere/eliminare in modo semplice i campi della sopra descritta tabella (sempre con l'interfaccia grafica di Drupal7).
Come è possibile farlo?
Sempre con cck, dai uno sguardo generale a drupal

Ciao Ealmuno,
grazie per la risposta, ma mi senti di dirti no grazie! ...poichè non sono in cerca di una risposta qualsiasi, ma di un confronto serio su di un problema che devo affrontare e che magari può essere di aiuto anche ad altri dalla community.

Ti ricordo che stiamo parlando di Drupal7 e quindi, penso, che tu intenda FIELD e non CCK.

Inoltre, se leggi un minimo il mio post ti puoi accorgere che ho già dato uno "sguardo generale a drupal" e che la mia intenzione è quella di "provare ad approfondire" un minimo i concetti nella discussione aperta.

Non voglio essere offensivo ed allo stesso tempo spero di aver chiarito le mie "serie intenzioni di discussione" :)

Confido in qualche anima pia che voglia prendere sul serio il tema della discussione (come già fatto dagli altri che hanno risposto al mio post).

@PaoloP2P: dato un Entity (definita dal core, quindi node, user, taxonomy, ...) o creata da 0 usando Entity API, puoi comunque aggiungere i vari field da interfaccia grafica.
Per l'estrazione delle informazioni, dipende da come decidi di strutturare/archiviare i dati. Se stori su MySQL/SQL usando il DBL di Drupal, dovresti poter interrogare il tutto con views, andando a scegliere come estrarre le informazioni e come presentale. Se questo non fosse e decidessi di utilizzare altri strumenti di archiviazione, potresti pensare di usare Views andando a scrivere un tuo backend di interfaccia (dovrebbe essere sufficiente andare a implementare l'interfaccia di query per la search, non ho link sottomano ma nell'API sicuramente la trovi). Un alternativa è di usare un meccanismo di ricerca basato sulle SearchAPI, andando a spostare i dati indicizzati su strumenti dedicati (Apache Solr, tanto per dirne uno). In ogni caso ti consiglio di capire cosa vuoi ottenere e alcuni dei caso d'uso, ed in base a questo andare a fare valutazioni sullo strumento da usare (se la tua ricerca è pressoché statica, potrebbe non convenire usare strumenti di ricerca esterni, ma adare di caching, così come in altre situazioni è conigliabile il contrario).

Ad ora mi pare che i requisiti siano un pò troppo "vaghi" per individuare la strada migliore (o per lo meno, io non me la sentirei di consigliarti una strada con queste info).

Ciao!

Ciao
Marco
--
My blog
Working at @agavee

@mavimo: ok, in generale il problema può essere così esemplificato (per semplicità ti riquoto uno dei precedenti post)

PaoloP2P wrote:
Ciao a tutti, grazie per le preziose informazioni.
A questo punto è chiaro che Drupal può essere utilizzato per risolvere il problema in termini generali.

Ma il mio dubbio resta sulle modalità da seguire per l'implementazione: le Entity API sono la strada da seguire?
Temo lo scenario per il quale alla prossima minor release di Drupal, dopo aver scritto un bel pò di codice a manina, debba dover riscrivere buona parte di quanto implementato.

Ad esempio, sempre sotto l'ipotesi di avere potenzialmente milioni di nodi, vorrei realizzare una anagrafica che gestisca queste informazioni di base:
Nome, cognome, indirizzo, città, email, telefono, ecc... (e molti altri campi, circa 40-50 in totale).

Detto questo, l'obiettivo è quello di gestire milioni di nodi in Entity complesse (es. 40-50 campi), ma non mi sembra prestazionalmente conveniente utilizzare una coppia tabelle per ogni field (data & revision)... però io non ho una esperienza concreta per scenari così complessi su Drupal.

Quindi mi sembra che gli scenari disponibili possano essere questi:
1) Utilizzare una Entity e memorizzare tutte le informazioni necessarie nei FIELD.
2) Utilizzare una Entity BASE (con alcuni campi "standard" non cancellabili/modificabili) e memorizzare le altre informazioni nei FIELD.
3) Utilizzare le Entity API e gestire le modifiche dello schema totalmente via codice.
Questo implica eventualmente l'ulteriore scrittura di un tool per farlo da interfaccia grafica.
4) Utilizzare un'altra strada o modulo che io non riesco ad immaginare :)

Cosa ne pensi?

@PaoloP2P: definisci "conveniente". In pratica, puoi avere tutto gestito attraverso un unica memorizzazione delle informazioni in un unica tabella, ovviamente questo è più "performante" nel caso di estrazione/ricerca dati, al tempo stesso è molto meno "flessibile". La convenienza dipende da quali sono i tuoi vincoli architetturali (risosrse/tempi/velocità di adattamento/..).

Personalmente propenderei per una strutturazione a field definendo al "entity di base" e usando i field ove possibile. Il secondo step, però riguarda la necessità di avere grandi quantità di informazioni facilmente consultabili. In questo caso potrebbe essere interessante procedere a una memorizzazione del dato in forma documentale su altri strumenti, al mero scopo di ricerca/data mining.

La soluzione dell'entity che gestisce tutto da codice è più "veloce" di implementazione e probabilmente ha una complessità di avvio rispetto a quello suggerito da me, minore, ma al tempo stesso ha una rigidità immensamente maggiore.

Grazie della discussione interessante che stai portando avanti :D

Ciao
Marco
--
My blog
Working at @agavee

@mavimo:
dal mio punto di vista "conveniente" vuol dire sostanzialmente un buon compromesso per i seguenti aspetti:
- flessibilità nella manutenzione dello schema del db (purtroppo i clienti sono spesso volubili e/o le esigenze aziendali possono variare anche in tempi abbastanza brevi)
- performance nell'accesso ai dati per mostrare elenchi filtrabili e generare un pò di report (una sorta di business intelligence "di base")

Da quanto ho capito tu useresti una parte di field definiti tramite codice (standard) e una parte definita tramite field, è corretto?

Non mi è chiaro invece cosa intendi con memorizzazione documentale del dato su altri strumenti, quale scenario hai in mente?

Grazie a te per il prezioso confronto.

Salve a tutti,
dal basso della mia scarsa esperienza con Drupal, mi chiedo (e chiedo a voi, vista la vostra immensa esperienza ;)), "What about webform?"
Veloce da configurare e, da quel che ne so, non dovrebbe creare una tabella per ogni campo...
Sono incerto, però, sulla capacità di questo modulo di gestire moli di dati così ampie!
Cosa ne pensate?

PS: Ragazzi, discussione interessantissima! :)

Ciao, alcune considerazioni (non conosco D7 al momento quindi prendile per come sono)

- se devi creare dei tipi di contenuto con campi che sono uguali, ma che non dovresti mai usare insieme per le viste allora non utilizzare lo stesso campo, ma creane due diversi: ti togli una JOIN che è sempre un vorace di risorse. Sprechi un po' di spazio, ma chi se ne frega (una volta si doveva prestare attenzione alle dimensioni ora con gli HD e le tecniche moderne non c'è quasi più limite).

- ad un certo punto potresti arrivare con il DB che ti restituisce in modo molto lento la tua query (creata tramite views). Ci sono casi in cui non puoi migliorarla più di tanto (c'è un mio thread sull'argomento), pero' puoi agire a livello di query SQL delle views (con i vari hook) e bypassare il blocco delle prestazioni creando delle tabelle più piccole che trattano solamente di un subset della vista. Io ho fatto così per l'ecommerce multilingua del thread di cui parlavo prima e sono passato da 15secondi a 0.2 solamente con l'uso di una tabella di appoggio creata da uno script in automatico ogni giorno.

M.

--
Michel 'ZioBudda' Morelli -- [email protected]
Sviluppo applicazioni CMS DRUPAL e web dinamiche -- Corsi Drupal -- Amministrazione Drupal -- Hosting Drupal

@PaoloP2P: immaginati la situazione seguente:

I dati sono memorizzati usando le entity ed i filed, in questo modo che i dati vengano memorizzati sul DB (anche in 50k tabelle) e la struttura (aggiunta/rimozione campi) è facilmente gestibile dall'interfaccia, anche per la prototipazione/test delle interfacce di inserimento/editing.

Al salvataggio dell'informazione del nodo, oltre a lasciare il meccanismo "classico" di Drupal che inserisce il tutto nel DB, memorizzi lo stesso dato (in pratica lo ridondi) all'interno di un sistema documentale (MongoDB, CouchDB, Hadoop, .. qui dipende un filo dalle tue competenze ed esperienze) che lo usi per l'estrazione/filtraggio delle informazioni.

Pro:

  • altamente scalabile
  • facilmente estendibile

Contro:

  • l'infrastruttura applicativa si complica
  • la parte di gestione delle ricerche richiede competenze un pò più vaste

Ciao
Marco
--
My blog
Working at @agavee

Grazie ad entrambi per le risposte, ormai mi sembra chiaro che nello scenario da me proposto il concetto è quello di archiviare le informazioni anche in un'area separata (duplicandole) in modo da poter eseguire ricerche e filtri con prestazioni adeguate.

Premettendo che non conosco i document oriented db (ma sono molto motivato ad approfondire l'argomento in tempi brevi) ho un dubbio... :)

mavimo wrote:
@PaoloP2P: immaginati la situazione seguente:
...cut...
Al salvataggio dell'informazione del nodo, oltre a lasciare il meccanismo "classico" di Drupal che inserisce il tutto nel DB, memorizzi lo stesso dato (in pratica lo ridondi) all'interno di un sistema documentale (MongoDB, CouchDB, Hadoop, .. qui dipende un filo dalle tue competenze ed esperienze) che lo usi per l'estrazione/filtraggio delle informazioni.

...partendo da quanto sopra riportato, mi sembra di intuire che in qualche modo Drupal7 od i db documentali rendano semplice l'inserimento delle informazioni, ma soprattutto la variazione delle strutture dati.

Mi spiego meglio:
se uso field di Drupal modificare lo schema delle tabelle è sicuramente una passeggiata e ciò avviene utilizzando semplicemente l'interfaccia grafica, però una volta modificata la struttura della entity in drupal mi devo preoccupare di trasmettere la variazione al db documentale.
Quindi devo scrivere codice ad hoc per mantenere allineate le strutture dei due db.

E' così? Ho capito bene?

In tal caso, qual'è il beneficio di usare uno strumento esterno (per fare questa sorta di data-warehouse) invece di farlo internamente al mysql utilizzando il drupal framework?
E' una questione di performance?

Esatto, dovresti occuparti di fare tu la modifica degli oggetti del db documentale. Tra l'altro, essendoc he il DB documentale non mantiene il dato, ma serve solo a velocizzare la ricerca, potresti tranquillamente "cancellare il tutto" e ripopolarlo in maniera patch (anche di notte, con step incrementali, ...).

Il beneficio dello strumento esterno è la flessibilità/velocità di ricerca delle informazioni, in pratica con un 10^6 oggetti neel MongoDB ha dei tempi di ricerca (senza passare per M-R o simili, ma pura ricerca) praticamente nulli, cosa che con un DB SQL non è per nulla vero, sopratutto con un pò di join. Per quanto riguarda CouchDB le cose migliorano ulteriormente, ma andarsi a gestire i dati e tutte le funzioni di estrazioni diventa un pò più complesso e IO preferisco evitare (fino a che non si può fare altrimenti).

Ciao
Marco
--
My blog
Working at @agavee

Ok, ritengo che valga la pena di approfontire.
Inizierò a studiarmi un pò MongoDB e poi vedremo.

Per ora grazie mille per la "chiaccherata"!