documentazione_3di_riservata:replicatore_ader
Differenze
Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
| Entrambe le parti precedenti la revisioneRevisione precedenteProssima revisione | Revisione precedente | ||
| documentazione_3di_riservata:replicatore_ader [2022/07/22 15:21] – [dcw2mysql.lua] chiara.pavanati | documentazione_3di_riservata:replicatore_ader [Data sconosciuta] (versione attuale) – eliminata - modifica esterna (Data sconosciuta) 127.0.0.1 | ||
|---|---|---|---|
| Linea 1: | Linea 1: | ||
| - | ===== Replicatore AdEr ===== | ||
| - | |||
| - | Progetto in CVS: / | ||
| - | |||
| - | ==== Struttura del progetto ==== | ||
| - | |||
| - | Ci sono 2 '' | ||
| - | |||
| - | * '' | ||
| - | |||
| - | * '' | ||
| - | |||
| - | * '' | ||
| - | |||
| - | ==== Funzionamento della replica, live & past ==== | ||
| - | |||
| - | === Avvio === | ||
| - | |||
| - | Il processo viene avviato tramite '' | ||
| - | |||
| - | Il '' | ||
| - | |||
| - | * La '' | ||
| - | * La '' | ||
| - | |||
| - | Il file '' | ||
| - | |||
| - | < | ||
| - | <cmd stored=" | ||
| - | </ | ||
| - | </ | ||
| - | < | ||
| - | <cmd stored=" | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | Si indica il '' | ||
| - | |||
| - | ==== Comandi principali ==== | ||
| - | |||
| - | * '' | ||
| - | * '' | ||
| - | |||
| - | ==== liveReplicator ==== | ||
| - | |||
| - | Anche se il file '' | ||
| - | |||
| - | Il file ha questa '' | ||
| - | |||
| - | <?xml version=" | ||
| - | <replica db=" | ||
| - | |||
| - | === Attributi === | ||
| - | |||
| - | * '' | ||
| - | * '' | ||
| - | * '' | ||
| - | * '' | ||
| - | |||
| - | La '' | ||
| - | |||
| - | In origine il processo si bloccava ad ogni '' | ||
| - | |||
| - | Il '' | ||
| - | |||
| - | * Invio di mail di '' | ||
| - | * Invio di una mail '' | ||
| - | * Invio di mail di '' | ||
| - | |||
| - | === Server coinvolti === | ||
| - | |||
| - | == Vecchio server di produzione SDR == | ||
| - | |||
| - | * '' | ||
| - | * '' | ||
| - | * '' | ||
| - | |||
| - | == Server di produzione AdER == | ||
| - | |||
| - | * '' | ||
| - | * '' | ||
| - | |||
| - | ==== pastReplicator ==== | ||
| - | |||
| - | Quando chiedono interventi con efficacia retroattiva, | ||
| - | |||
| - | Anche in questo caso si usa un Job che lavora solitamente negli orari di minore attività. | ||
| - | |||
| - | La filosofia è simile a quella del '' | ||
| - | |||
| - | < | ||
| - | <cmd stored=" | ||
| - | < | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | Evoca il comando '' | ||
| - | |||
| - | '' | ||
| - | |||
| - | Il file sul quale si basa la '' | ||
| - | |||
| - | <?xml version=" | ||
| - | <replica db=" | ||
| - | |||
| - | Esso si compone di: | ||
| - | |||
| - | * '' | ||
| - | * '' | ||
| - | * '' | ||
| - | * '' | ||
| - | * '' | ||
| - | |||
| - | L’esempio prevede di partire dal fondo e procedere a ritroso verso l’inizio. Questo perché solitamente i record più recenti sono quelli che gli interessa vengano replicati prima. | ||
| - | |||
| - | Di volta in volta, mentre '' | ||
| - | Mettendo “step” con valore positivo, la replica non procede da “last” verso “first” ma in senso inverso ed inversamente verrà rettificato “first” e lasciato invariato “last”. | ||
| - | |||
| - | Come il processo di replica live, la '' | ||
| - | |||
| - | Quando '' | ||
| - | |||
| - | ==== dcw2mysql.lua ==== | ||
| - | |||
| - | Questo script viene lanciato su due tipologie di archivio, '' | ||
| - | |||
| - | Che si usi '' | ||
| - | |||
| - | Vediamo ora come funziona il processo di replica vero e proprio. | ||
| - | |||
| - | La modalità di '' | ||
| - | |||
| - | * In assenza di connessione attiva ne apre una nei confronti di MySQL sulla base dei dati raccolti; | ||
| - | * Imposta l’encoding UTF ed apre la transazione; | ||
| - | * Controlla di che tipo di record si tratta ed evoca uno specifico replicatore per ciascuno di essi, distinguendo le modalità “ins” e “mod”, trattate nello stesso modo, dalla modalità “del”. In realtà solo la modalità “mod” viene usata; | ||
| - | * Ciascuna funzione di replica acquisisce elementi ed attributi dal record e popola una tabella principale, poi, in seguito, procede con gli elementi ripetibili, in modo analogo, e popola le tabelle correlate; | ||
| - | |||
| - | * Tutte le operazioni di inserimento sono di fatto delle UPSERT che vengono composte in questo modo: | ||
| - | - Man mano che si aggiungono campi (elementi o attributi) si popola una tabella con nome colonna e valore ed eventualmente una tabella parallela con i valori “if null”; | ||
| - | - Il valore della colonna può essere popolato in modo standard ('' | ||
| - | |||
| - | * Ciascuna delle '' | ||
| - | |||
| - | - Il record XML; | ||
| - | - Eventuale nodo dal quale prendere il valore con percorso relativo; | ||
| - | - xPath da cui prendere il valore ('' | ||
| - | - Nome della colonna che lo ospiterà; | ||
| - | - Modalità di conversione (standard, bool, num, date); | ||
| - | - La tabella dove introdurre l’espressione, | ||
| - | - Solo per il tradotto, una tabellina dei valori tradotti ed un default. | ||
| - | |||
| - | * Una volta preparata la tabella coi valori ('' | ||
| - | Segue altro trucco per sostituire il termine UPDATE# che serve a togliere la prima virgola e poi si annullano i valori da non toccare. | ||
| - | * Viene eseguita l’operazione su MySQL ('' | ||
| - | * A seguire, per tutte le aree ripetibili, si segue la stessa filosofia, usando dove necessario il nodo ripetuto dal quale prendere un valore e così via. Praticametne in tutti i casi si procede alla cancellazione delle righe della tabella che si andrà a popolare per tener conto dei casi di rimozione. | ||
| - | |||
| - | * Al termine del processo di replica, la funzione torna: | ||
| - | |||
| - | - '' | ||
| - | - '' | ||
| - | - eventuale parametro '' | ||
| - | |||
| - | Per fare le attività dette si avvale ampiamente di '' | ||
| - | |||
| - | === Trattamento degli errori === | ||
| - | |||
| - | Vediamo il file '' | ||
| - | |||
| - | -- DocWay to MySQL sample configuration | ||
| - | local dcw2mysqlcfg = { | ||
| - | onErrorAction = {major=' | ||
| - | notifyTo = {to=' | ||
| - | mailTemplate = ' | ||
| - | doubleAttachmentMailTemplate = 'A record contains a double rif to the same attachment.\nYou don\'t need to do anything but please pay attention to attachment #attach# on record # | ||
| - | doubleFolderMailTemplate = 'A record contains a double rif to the same folder.\nYou don\'t need to do anything but please pay attention to folder #cod_fasc# on record # | ||
| - | missingAttachmentMailTemplate = 'A record contains a rif to an empty attachment.\nYou don\'t need to do anything but please pay attention to record # | ||
| - | missingCfgReplicaFile = ' | ||
| - | pastReplicaCompleted = ' | ||
| - | mailOpt = { | ||
| - | from = ' | ||
| - | from_label = ' | ||
| - | -- user = nil, -- Admin smtp user name if login enabled nil otherwise | ||
| - | -- password = nil, --Admin smtp password if login enabled nil otherwise | ||
| - | -- server = ' | ||
| - | -- port = 25, -- smtp server port {25 | 465} | ||
| - | -- ssl = true --true if there is an ssl communication { true | false } | ||
| - | }, | ||
| - | | ||
| - | } | ||
| - | |||
| - | |||
| - | return dcw2mysqlcfg | ||
| - | |||
| - | In particolare ci interessa la tabella '' | ||
| - | |||
| - | * '' | ||
| - | * '' | ||
| - | * '' | ||
| - | * '' | ||
| - | * '' | ||
| - | |||
| - | Per ciascuno di essi i '' | ||
| - | |||
| - | * '' | ||
| - | * '' | ||
| - | * '' | ||
| - | |||
| - | In tutti i casi d’errore che non vengono trattati come '' | ||
| - | |||
| - | Se c’è errore e per quella tipologia d’errore (major/ | ||
| - | |||
| - | Attualmente hanno richiesto di non essere interrotti neanche in caso di errore major perché preferiscono avere alcuni record in meno che si possono anche replicare a mano, che dover rinunciare a molti record replicabili. | ||
| - | |||
| - | === customReplicator === | ||
| - | |||
| - | Compie esattamente lo stesso lavoro del '' | ||
| - | |||
| - | Il comportamento è del tutto analogo, compreso l’invio delle mail di inizio e fine lavorazione. | ||
| - | |||
| - | <cmd stored=" | ||
| - | < | ||
| - | </ | ||
| - | |||
| - | === pecReplicator === | ||
| - | |||
| - | Processo “super-custom” fatto per replicare solo i record di struttura esterna o persona esterna per le quali fosse necessario aggiornare le pec in ACL. | ||
| - | |||
| - | Si poteva fare con '' | ||
| - | |||
| - | Questo processo può essere ignorato o preso a spunto per altre customizzazioni. | ||
| - | |||
| - | ==== Nuovi campi ==== | ||
| - | |||
| - | L’introduzione dei nuovi campi si fa così: | ||
| - | |||
| - | * Accedere all’archivio con MySQL WorkBench. | ||
| - | * Applicare le varianti (es. aggiunta campo “pippo”). Impostare ‘pk’ per primary key, ‘nn’ per not null, ‘uq‘ per unique index, ‘b’ per binary e così via... | ||
| - | * e quando si è pronti ad eseguirle, (‘Apply’) copiare il comando che viene presentato ed eseguirlo. | ||
| - | * Creare un nuovo file changes_< | ||
| - | N.B.: dal momento che la versione di MySQL che siamo soliti usare noi (5.7.X) differisce da quella che usano loro (5.6.35), i comandi che vengono segnalati come ‘CHANGE COLUMN’ devono essere invece espressi come ‘MODIFY’. (Vds. changes_20191028.sql). | ||
| - | * Raccolte le istruzioni, variazioni al file dcw2mysql.lua (ed eventuali a dcw2ysqlcfg.lua), | ||
| - | |||
| - | ==== L’accesso al DB MySQL del cliente ==== | ||
| - | |||
| - | Il '' | ||
| - | |||
| - | Vale quindi la pena di aprire un tunnel con la porta desiderata localmente[2] che, una volta collegati al '' | ||
| - | |||
| - | Il collegamento con strumenti quali MySQL Workbench darà accesso e visibilità direttamente dell’archivio del cliente. Le credenziali d’accesso sono le stesse registrate nei file '' | ||
| - | |||
| - | ==== Gestione degli scarti ==== | ||
| - | |||
| - | A intervalli regolari ADER apre delle segnalazioni relative agli scarti del replicatore. | ||
| - | |||
| - | I possibili '' | ||
| - | |||
| - | * '' | ||
| - | * '' | ||
| - | * Relativamente al repertorio Atti Successivi è capitato che il campo '' | ||
| - | ________________ | ||
| - | [1] Lo script era stato originariamente concepito per essere usato col replicato di eXtraWay EE. Col replicatore sono previste altre modalità di replica, quali “ins”, “del”, e “attach”. In questo caso si opera sempre in modalità “mod”. | ||
| - | |||
| - | [2] MySQL utilizza la porta 3306, ma per essere sicuri di non interferire con il proprio MySQL locale e soprattutto di non trovarsi ad osservare un archivio pensando che sia quello del cliente (o quello locale e vice versa) e farci sopra interventi non appropriati, | ||
/data/attic/documentazione_3di_riservata/replicatore_ader.1658496101.txt.gz · Ultima modifica: da chiara.pavanati