* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Novembre 21, 2024, 11:47:44 pm

Inserisci il nome utente, la password e la durata della sessione.

100 Visitatori, 0 Utenti

Autore Topic: sincronizzazione tra database  (Letto 3743 volte)

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2921
  • Karma: +20/-4
sincronizzazione tra database
« il: Dicembre 02, 2021, 11:04:16 am »
ciao a tutti

ho una necessità che è quella di sincronizzare 2 database (MsSql o Postgres o altro) remoti.
La replicazione è di tipo Master/Slave ma, per qualche tabella, è lo Slave che diventa Master.

In quanto DB remoti tra di loro, la sincronizzazione dovrebbe avvenire tramite protocollo TCP.
La particolarità è che le lo schema delle tabelle dei 2 RDBMS può essere diverso e che ci potrebbero essere da sincronizzare anche 1.000.000 di record per 4 o 5 tabelle su un totale di 50 o 60 tabelle.
Dopo la prima sincronizzazione, servirebbe una sincronizzazione differenziale da lanciare tipo ogni 5 minuti per il riallineamento.

Scenario abbastanza complesso insomma.
Qualcuno di voi ha qualche consiglio su tool esistenti che potrebbero essermi utili?

Grazie

nomorelogic
Imagination is more important than knowledge (A.Einstein)

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:sincronizzazione tra database
« Risposta #1 il: Dicembre 02, 2021, 12:25:33 pm »
Cioè hai:

- 2 database (speriamo almeno della stessa famiglia) remoti,
- tabelle con schemi diversi,
- 5 tabelle da sincronizzare su 60 presenti nei database,
- intervallo di tempo di cinque minuti per un totale plausibile di 1.000.000 di record,
- il tutto via TCP/IP;

Bhe dai, provo un attimo a chiamare la fata turchina, magari con la bacchetta magica risolve la situazione ...  ;) ;D

A parte gli scherzi non ho idea di tool che possano fare simili cose (però non sono un professionista del settore). Almeno non di tool a portata di noi poveri mortali, magari Oracle piuttosto che IBM li hanno.

Un differenziale di 1 milione di record ogni 5 minuti non è cosa proprio così normale, sopratutto se parliamo in termini differenziali ....

Se trovi qualcosa o escogiti una soluzione fai un rimando anche qui, è sempre e comunque interessante analizzare soluzioni nuove.

Ciao e auguri.
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2921
  • Karma: +20/-4
Re:sincronizzazione tra database
« Risposta #2 il: Dicembre 02, 2021, 02:30:46 pm »
mi sono spiegato male

le tabelle potenzialmente con 1.000.000 record sono 4 o 5
50 o 60 sono tutte le tabelle che devo sincronizzare

cmq i database non sono della stessa famiglia

ho dato un'occhiata a qualche ETL tipo penthao kettle ma non ho molta esperienza con questi strumenti

ho paura che per dare una mano alla fata turchina, tocca chiamare Gandalf (il bianco) con Mago Merlino e Maga Magò...

vi tengo aggiornati
ma se avete idee dite pure
Imagination is more important than knowledge (A.Einstein)

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2921
  • Karma: +20/-4
Re:sincronizzazione tra database
« Risposta #3 il: Dicembre 02, 2021, 02:40:26 pm »
vabbè comunque quella era una valutazione pessimistica, bisogna prevedere il futuro

la situazione attuale è
- 3 tabelle con circa 600.000 record
- 40 tabelle da sincronizzare
- aggiornamento va bene anche ogni 10 minuti

in realtà non è che cambi poi molto   :'(
Imagination is more important than knowledge (A.Einstein)

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:sincronizzazione tra database
« Risposta #4 il: Dicembre 02, 2021, 02:46:54 pm »
Avevo dato una occhiata a strumenti ETL, però legati diciamo alla "programmazione" in generale (nè ho accennato in un altro topic). Sono strumenti generalmente costosi e complessi, oltre a necessitare di una infrastuttura "importante".

Nel passato, sulla replica dei database ho sempre lasciato fare ad altri, semplicemente (tra virgolette  ???) acquisendo il "già fatto". Ci sono moltepli problematiche nel fare quelle operazioni, e sono sopratutto legate alla coerenza poi dei dati trasferiti: è molto improbabile che si possano "travasare" tutti quei dati in una singola transazione, da qui le possibili incongruenze.

Se poi non sono strumenti propri del motore RDB (tipo funzioni di replica), allora tanti auguri.
Se senti Gandalf digli se mi manda Arwen, che ho un dolorino alla spalla ......  ;D

Ciao ciao.
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2921
  • Karma: +20/-4
Re:sincronizzazione tra database
« Risposta #5 il: Dicembre 02, 2021, 03:24:27 pm »
si avevo visto il tuo accenno agli ETL, sono un mondo a parte è vero

con la replicazione ho una esperienza con IBReplicator per Firebird e con la replicazione di MsSql ma tutti e 2 replicano verso un DB dello stesso tipo e tutti e 2 con sistema a log.
A me servono DB diversi ed inoltre la replicazione tramite log, che ha il pregio di essere veloce, ha il difetto che se un client non si connette per un po' di tempo... il log del DB master riempie il disco del server...
Imagination is more important than knowledge (A.Einstein)

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:sincronizzazione tra database
« Risposta #6 il: Dicembre 02, 2021, 05:24:08 pm »
Ai miei tempi il log non era totalmente affidabile per diversi motivi (non stò qui a spiegarli). A seconda del meccanismo di "elaborazione", si potevano avere dei conflitti nelle transaction e quindi disallineamento tra i DB replicati.

MSSql ha un suo meccanismo interno di replica e si basa su un doppio server DB, quello Master (chiamato mi pare di "Pubblicazione") e quello replicato chiamato di "Distribuzione". Da qui poi si possono avere "n" server di BACKUP (chiamiamoli così) che nel linguaggio Microsoft vengono chiamati "Sottoscrittori".

La tecnica è basata sul LOG delle transazioni (del server di Pubblicazione), e da due agenti (di fatto dei servizi) che si occupano di alimentare il DB di Distribuzione e gli eventuali DB di Sottoscrizione.

La tecnica funziona ed è uno standard ormai decennale.

Implementando tale tecnica potrebbe essere possibile fare ciò che chiedi. Ovviamente ci dovrà essere una transcodifica per allineare i campi e le tabelle con schemi diversi rispetto al DB Master.

A me servono DB diversi ed inoltre la replicazione tramite log, che ha il pregio di essere veloce, ha il difetto che se un client non si connette per un po' di tempo... il log del DB master riempie il disco del server...

Di questo non avevo notizia ..... probabilmente è un baco inserito apposta dai costruttori di Hard Disk per vender più device ....  ;D ;D ;D

Ciao
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

bonmario

  • Hero Member
  • *****
  • Post: 1358
  • Karma: +11/-1
Re:sincronizzazione tra database
« Risposta #7 il: Dicembre 02, 2021, 06:11:19 pm »

ho dato un'occhiata a qualche ETL tipo penthao kettle ma non ho molta esperienza con questi strumenti

L'ho usato parecchio tempo fa, e non mi ci ero trovato bene ...
Tra l'altro se non sbaglio, è anche stato dismesso.

Ciao, Mario

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2921
  • Karma: +20/-4
Re:sincronizzazione tra database
« Risposta #8 il: Dicembre 02, 2021, 06:38:36 pm »
A me servono DB diversi ed inoltre la replicazione tramite log, che ha il pregio di essere veloce, ha il difetto che se un client non si connette per un po' di tempo... il log del DB master riempie il disco del server...

Di questo non avevo notizia ..... probabilmente è un baco inserito apposta dai costruttori di Hard Disk per vender più device ....  ;D ;D ;D

E' successo che un ns cliente aveva una replicazione con MsSql su una sede distaccata.
Il log lo tiene il server per ogni slave sottoscrittore finché il sottoscrittore non si collega e lo scarica per applicare le transazioni per se stesso.

Fatto sta che un giorno dismettono il server sulla sede distaccata dove stava il sottoscrittore ma non ci dicono nulla...
Il server master ha incrementato i log fino a saturare l'HD.

Senza contare che il sistema dei log si basa sul fatto che, dopo la sincronizzazione iniziale, lo slave non abbia alterato i record per conto suo.
Nel qual caso si verifica il disallineamento.
Imagination is more important than knowledge (A.Einstein)

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2921
  • Karma: +20/-4
Re:sincronizzazione tra database
« Risposta #9 il: Dicembre 02, 2021, 06:39:42 pm »

ho dato un'occhiata a qualche ETL tipo penthao kettle ma non ho molta esperienza con questi strumenti

L'ho usato parecchio tempo fa, e non mi ci ero trovato bene ...
Tra l'altro se non sbaglio, è anche stato dismesso.

Ciao, Mario

bene...
almeno guardo qualcos'altro :)
Imagination is more important than knowledge (A.Einstein)

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:sincronizzazione tra database
« Risposta #10 il: Dicembre 02, 2021, 07:04:09 pm »
E' successo che un ns cliente aveva una replicazione con MsSql su una sede distaccata.
Il log lo tiene il server per ogni slave sottoscrittore finché il sottoscrittore non si collega e lo scarica per applicare le transazioni per se stesso.

Fatto sta che un giorno dismettono il server sulla sede distaccata dove stava il sottoscrittore ma non ci dicono nulla...
Il server master ha incrementato i log fino a saturare l'HD.

A questo si può ovviare monitorando lo spazio su disco, o ancora meglio le "frequenze" di connessione ....
Io quando ho qualcosa (anche di terze parti come un DB un Datat Logger o altro) che scrive su disco inserisco sempre un monitoraggio, non si sà mai ....

Senza contare che il sistema dei log si basa sul fatto che, dopo la sincronizzazione iniziale, lo slave non abbia alterato i record per conto suo.
Nel qual caso si verifica il disallineamento.

Bhè questa è storia. I DB replicati vengono usati per backup o per visualizzazioni o ricerche, non certo per lavorarci sopra  :o .

Però effettivamente, direi che usando un tool che legge i log del DB Master, eseguire una replica su un database diverso non dovrebbe essere estremamente complesso (fatto salvo la transcodifica ....). Quello che vedo apparentemente più complesso è tutta l'elaborazione di milioni di record in un tempo relativamente "stretto" e tramite TCP/IP.

Anche ammettendo di fare un trasferimento di 10K record al secondo, per 10kk record servono 1000 secondi, oltre 15 minuti.
Poi magari mi sbaglio nelle prestazioni, magari si riescono a traferire 1kk record al secondo o anche più.

Ciao ciao.
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:sincronizzazione tra database
« Risposta #11 il: Dicembre 02, 2021, 07:49:40 pm »
Questi sono dei tools a pagamento per maneggiare il log di un MSSQL:

https://www.apexsql.com/

https://www.quest.com/products/toad-for-sql-server/

Ciao
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2921
  • Karma: +20/-4
Re:sincronizzazione tra database
« Risposta #12 il: Dicembre 02, 2021, 08:08:42 pm »
E' successo che un ns cliente aveva una replicazione con MsSql su una sede distaccata.
Il log lo tiene il server per ogni slave sottoscrittore finché il sottoscrittore non si collega e lo scarica per applicare le transazioni per se stesso.

Fatto sta che un giorno dismettono il server sulla sede distaccata dove stava il sottoscrittore ma non ci dicono nulla...
Il server master ha incrementato i log fino a saturare l'HD.

A questo si può ovviare monitorando lo spazio su disco, o ancora meglio le "frequenze" di connessione ....
Io quando ho qualcosa (anche di terze parti come un DB un Datat Logger o altro) che scrive su disco inserisco sempre un monitoraggio, non si sà mai ....

Senza contare che il sistema dei log si basa sul fatto che, dopo la sincronizzazione iniziale, lo slave non abbia alterato i record per conto suo.
Nel qual caso si verifica il disallineamento.

Bhè questa è storia. I DB replicati vengono usati per backup o per visualizzazioni o ricerche, non certo per lavorarci sopra  :o .

Però effettivamente, direi che usando un tool che legge i log del DB Master, eseguire una replica su un database diverso non dovrebbe essere estremamente complesso (fatto salvo la transcodifica ....). Quello che vedo apparentemente più complesso è tutta l'elaborazione di milioni di record in un tempo relativamente "stretto" e tramite TCP/IP.

Anche ammettendo di fare un trasferimento di 10K record al secondo, per 10kk record servono 1000 secondi, oltre 15 minuti.
Poi magari mi sbaglio nelle prestazioni, magari si riescono a traferire 1kk record al secondo o anche più.

Ciao ciao.

chiaramente non conta la prima volta ma le differenziali


Imagination is more important than knowledge (A.Einstein)

 

Recenti

How To

Utenti
  • Utenti in totale: 803
  • Latest: maXim.FI
Stats
  • Post in totale: 19169
  • Topic in totale: 2286
  • Online Today: 123
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 100
Total: 100

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.