Sistemi multipli di intranet / internet che lavorano parzialmente sugli stessi dati: strategia del database

0

Stiamo iniziando a riscrivere le nostre app (portale Internet, milioni di utenti unici e pochi sistemi CRM / ERP, poche centinaia di utenti) e abbiamo un'enorme decisione da prendere ora. Li scriveremo per lo più (90-95%) in Symfony2 con Doctrine e alcuni servizi in background (ad es. Mailing) in Java . Database - MySql / MariaDb . anche molte tecnologie aggiuntive ( redis/memcached , load balancing , varnish , replication e così via). I più importanti (in questo caso) sono: symfony2 , mysql/maria e doctrine .

Il fatto è che per alcuni sistemi sarà meglio lavorare sugli stessi tavoli. Ad esempio: portale internet con offerte di lavoro + sistema CRM per la gestione dei clienti che pagano per la pubblicazione di tali offerte (ci sono molti casi simili). Anche avere funzionalità di un accesso per i nostri utenti tra tutti i sistemi è importante.

Vedo due approcci qui:

  1. Abbiamo un grande database, con poche centinaia di tabelle. Lavoravo con oltre 200 tavoli, ma non con quella quantità elevata di traffico. Quindi, se il traffico sale, sarà coinvolto il partizionamento e il partizionamento.
  2. Abbiamo molti database, ciascuno per un'app. Se è necessaria una sola app per comunicare con un'altra DB , scriveremo servizi speciali per fornire tale funzionalità.

Ora, di cosa sono preoccupato: 1. facilità di sviluppo: è più semplice avere un solo database 2. facilità di configurazione / assicurazione della ridondanza 3. prestazioni

Una cosa che so ora che il database sarà ospitato su tre macchine con replica master-slave , che è supportata piacevolmente da Doctrine .

Quali sono i tuoi pensieri? Quali sono i tuoi pro e contro? Grazie!

    
posta ex3v 11.07.2014 - 16:28
fonte

1 risposta

3
  • 1 Database, con mirroring, cluster e partizioni come richiesto e con le stored procedure come API per:
  • Un paio di server di app, che comunicano con il DB e forniscono un'API indipendente dal dominio per:
  • Molti server Web con cui i clienti interagiscono.

Questo è il modo per raggiungere la scalabilità. Si compensano alcune elaborazioni con i livelli, così i server Web gestiscono tutte le presentazioni delle pagine html, dati dati che sono stati recuperati dal DB e combinati o altrimenti massaggiati in forma dai livelli dell'applicazione. Generalmente questo scala in modo orizzontale (ovvero richiede più scala, aggiunge più server Web o app).

Il carico sul DB può essere ridotto con questa architettura: il DB serve esclusivamente dati grezzi ai livelli dell'app. Ciò significa che il livello dell'app può fornire il caching di alcuni dati per ridurre ulteriormente il carico sul DB, in quanto solo alcuni di essi non necessitano di un meccanismo di memorizzazione nella cache completo per mantenere sincronizzate le cache.

Puoi anche introdurre DB separati se i dati sono facilmente partizionati e i clienti non saprebbero nemmeno di averlo fatto mentre parlano al livello dell'app. Questa è probabilmente la vittoria più grande, puoi cambiare le cose senza ridistribuire tutto.

    
risposta data 11.07.2014 - 16:52
fonte