Πλήρης συγχρονισμός κοινόχρηστων φακέλων, επαφών, ημερολογίων μεταξύ διανεμημένων διακομιστών Kerio Connect

Καλησπέρα, Χαμπρ!

Έργο

Ο οργανισμός μου χρησιμοποιεί έναν διακομιστή αλληλογραφίας στην πλατφόρμα Kerio Connect· οι διακομιστές αλληλογραφίας είναι εγκατεστημένοι σε διαφορετικές πόλεις για την εξυπηρέτηση των χρηστών τους. Αρχικά δεν υπήρχε κατανεμημένη δομή, καθώς οι τομείς διαφέρουν στο τρίτο επίπεδο, υποδεικνύοντας την πόλη της τοποθεσίας. Όλα λειτουργούσαν και όλοι ήταν ευχαριστημένοι. Μια ωραία μέρα, η διοίκηση έθεσε ένα καθήκον, ένα κοινό ημερολόγιο δραστηριοτήτων μεταξύ όλων των τοποθεσιών!

Ιστορικό

Αρχικά, η ιδέα ήταν να αυξηθεί το Kerio Distributed Mail Domain και θα έκανε τα πάντα μόνη της. Μόλις έγινε, δημιουργήθηκε ένας κατανεμημένος τομέας, αλλά αυτό δεν συνέβη, ο διακομιστής ήταν έτοιμος να συγχρονίσει ημερολόγια, φακέλους, επαφές - μεταξύ τομέων που βρίσκονται στον ίδιο διακομιστή, αλλά δεν επρόκειτο καθόλου να συγχρονίσει δεδομένα μεταξύ πολλών διακομιστές.

Φυσικά, δεν περίμενα τέτοια σύλληψη και για πολύ καιρό δεν μπορούσα να πιστέψω ότι έλειπε η λειτουργικότητα που χρειαζόμουν. Αργότερα βρήκα τεκμηριωμένες αποδείξεις αυτού του γεγονότος. Ήμουν πολύ μπερδεμένος και απογοητευμένος από αυτό.

Η εργασία μετατράπηκε ομαλά σε πρόβλημα.

Ποιες ήταν οι επιλογές;

  • Δημιουργήστε δύο πελάτες σε διαφορετικούς διακομιστές που ανταλλάσσουν τα απαραίτητα δεδομένα με κάποιο λογισμικό τρίτων. Ήταν απαραίτητο να βρεθεί αυτό το λογισμικό τρίτου κατασκευαστή που θα εφαρμόσει αυτήν τη λειτουργικότητα - δεν μου αρέσει τέτοια γκανιότα, αλλά φαινόταν ότι αυτή ήταν η μόνη γρήγορη λύση.
  • Γράψτε το δικό σας σενάριο για συγχρονισμό δεδομένων μεταξύ διακομιστών. Το γεγονός είναι ότι το Kerio αποθηκεύει κάθε αντικείμενο ως ξεχωριστό αρχείο, επομένως ήταν απαραίτητο να αναπτυχθεί ένα σενάριο για εργασία με αρχεία, αλλά λόγω του επαρκούς αριθμού πηγών, η εργασία φαινόταν κάπως περίπλοκη, ειδικά επειδή ήταν απαραίτητο να εκτελεστούν πολλαπλές ελέγχει την ορθότητα των δεδομένων, σε περίπτωση που κάποιος δημιουργήσει εργασία στο ίδιο χρονικό διάστημα κ.λπ., κ.λπ.

Κοιτάζοντας μπροστά, θα πω ότι παρόλο που το Kerio αποθηκεύει ένα αντικείμενο ως ξεχωριστό αρχείο, δεν είναι τόσο ανόητο ώστε να ρωτάτε πώς λειτουργεί το σύστημα αρχείων κάθε φορά που έχετε πρόσβαση στο αντικείμενο.

Έχοντας αφιερώσει πολύ χρόνο σε σκέψεις, συντάσσοντας ένα μάτσο κομμάτια χαρτιού με σχέδια «για την κατάληψη εδάφους του εχθρού», στις 6 το πρωί πήρα δύο σωστές αποφάσεις:

  • Η πρώτη απόφαση είναι να κάνεις το δικό σου και να μην ψάχνεις τίποτα απ' έξω.
  • Η δεύτερη λύση είναι να πάτε για ύπνο.

Ήδη το πρωί ξύπνησα με μια μοναδική και αληθινή σκέψη, η οποία μειώθηκε σε λίγα γράμματα - DFS

Λύση

Η ίδια η λύση έμοιαζε έτσι

  • φέρτε όλους τους διακομιστές που θα συμμετέχουν στον συγχρονισμό στο λειτουργικό σύστημα Windows. (Μέρος του ήταν σε Linux. Απαιτήθηκε μετεγκατάσταση δεδομένων αλληλογραφίας σε άλλο λειτουργικό σύστημα)
  • Προσδιορίστε τη δομή των καταλόγων που θα συμμετέχουν στον συγχρονισμό - πρέπει να είναι πανομοιότυποι.
  • Καθορίστε όλους τους διακομιστές αλληλογραφίας σε έναν τομέα με ένα μόνο χώρο DFS.
  • Δημιουργήστε τον προαναφερθέντα κατανεμημένο τομέα Kerio, καθώς στην περίπτωσή μου απαιτείται συγχρονισμός δεδομένων, όχι μόνο μεταξύ διακομιστών αλλά και μεταξύ τομέων· ο δεύτερος μπορεί να χειριστεί ανεξάρτητα από τον διακομιστή Kerio. (σε αντίθεση με το πρώτο)
  • Ρυθμίστε τους συγχρονισμένους καταλόγους στο χώρο DFS.
  • Βρείτε ένα είδος δεκανίκι (εξάλλου, δεν μπορείτε να ζήσετε χωρίς δεκανίκι)

Реализация

Παράδειγμα σε δύο διακομιστές αλληλογραφίας (ίσως περισσότερους)

1. Kerio Distributed domain

Πλήρης συγχρονισμός κοινόχρηστων φακέλων, επαφών, ημερολογίων μεταξύ διανεμημένων διακομιστών Kerio Connect

Ο Master δεν συμμετέχει στον συγχρονισμό, αλλά αυτό δεν είναι προαπαιτούμενο.

Δεν θα περιγράψω πώς να αυξήσετε έναν κατανεμημένο τομέα Kerio, δεν υπάρχει τίποτα περίπλοκο σε αυτό, μπορείτε να μελετήσετε το επίσημο μανούλ

Τελικά, θα πρέπει να δείτε την ακόλουθη εικόνα στην κονσόλα διαχείρισης:

Πλήρης συγχρονισμός κοινόχρηστων φακέλων, επαφών, ημερολογίων μεταξύ διανεμημένων διακομιστών Kerio Connect

Πλήρης συγχρονισμός κοινόχρηστων φακέλων, επαφών, ημερολογίων μεταξύ διανεμημένων διακομιστών Kerio Connect

Στη συνέχεια, με ενδιέφεραν οι κοινόχρηστοι φάκελοι· στον κύριο διακομιστή μπορείτε να ορίσετε τις ακόλουθες επιλογές:

Πλήρης συγχρονισμός κοινόχρηστων φακέλων, επαφών, ημερολογίων μεταξύ διανεμημένων διακομιστών Kerio Connect

Πλήρης συγχρονισμός κοινόχρηστων φακέλων, επαφών, ημερολογίων μεταξύ διανεμημένων διακομιστών Kerio Connect

Ειδικά για κάθε τομέα - ο διακομιστής δεν θα συγχρονίσει δημόσιους φακέλους μεταξύ τομέων

Κοινό σε όλους τους τομείς - όλοι οι διακομιστές θα εγκαταλείψουν τους υπάρχοντες δημόσιους φακέλους σε κάθε τομέα και θα δημιουργήσουν νέους μεμονωμένους φακέλους για όλους τους τομείς σε κάθε διακομιστή αλληλογραφίας.

Προσοχή! Αν και αυτή η επιλογή αλλάζει την πολιτική διαμόρφωσης σε όλους τους διακομιστές, συγχρονίζεται χωριστά από κάθε διακομιστή (δηλαδή, χωρίς ενιαίο κοινό χώρο)

Ο διαχειριστής θα εξακολουθεί να έχει τη δυνατότητα να διανέμει την πρόσβαση μεταξύ των χρηστών.
στην περίπτωσή μου, είναι όλα δικά μου και χρειάζομαι πλήρη συγχρονισμό (Στην περίπτωσή σας, η λύση μπορεί να είναι διαφορετική) σε κάθε διακομιστή πρέπει να δημιουργήσετε πανομοιότυπα σύνολα τομέων που πρέπει να συγχρονιστούν.

2. Κατάλογοι δεδομένων Kerio

Τώρα πρέπει να δημιουργήσετε πανομοιότυπους κοινόχρηστους καταλόγους που πρέπει να συγχρονιστούν σε καθέναν από τους διακομιστές. Φάκελοι, Ημερολόγια, Επαφές.

Συμβουλές - δημιουργήστε καταλόγους στα αγγλικά, εάν τους δημιουργήσετε στα λατινικά, ο κατάλογος θα έχει ένα όνομα σε κάποια ακατανόητη κωδικοποίηση, αυτό είναι τουλάχιστον άβολο.

Τώρα πρέπει να βρείτε τις φυσικές διαδρομές των φακέλων αλληλογραφίας σε κάθε διακομιστή.

Κοινό σε όλους τους τομείς ~DataMailmail#publicСинхронизируемый каталог#msgs
Ειδικά για κάθε τομέα ~DataMailmail**Domain**#publicСинхронизируемый каталог#msgs

Λάβετε υπόψη ότι δεν θα συγχρονίσουμε ολόκληρο τον κατάλογο, αλλά μόνο το κοντέινερ με τα δεδομένα #msgs — τα ίδια τα αντικείμενα αποθηκεύονται εδώ, όλα τα άλλα δεδομένα πρέπει να είναι ξεχωριστά για κάθε διακομιστή.

3.DFS

Δεν θα περιγράψω λεπτομερώς πώς να ρυθμίσετε το DFS, υπάρχουν αρκετές πληροφορίες για αυτό το ζήτημα.

Το DFS είναι μια υπηρεσία ρόλων στον Windows Server που παρέχει τη δυνατότητα συνδυασμού κοινόχρηστων φακέλων που βρίσκονται σε διαφορετικούς διακομιστές
Σύνδεσμος στο έγγραφο MS DFS

Πριν ρυθμίσετε το DFS, πρέπει να σταματήσετε όλους τους διακομιστές αλληλογραφίας που θα συμμετέχουν στο συγχρονισμό δεδομένων.

Μετά την ολοκλήρωση της ρύθμισης, θα πρέπει να λάβετε την παρακάτω εικόνα για κάθε έναν από τους συγχρονισμένους φακέλους

Πλήρης συγχρονισμός κοινόχρηστων φακέλων, επαφών, ημερολογίων μεταξύ διανεμημένων διακομιστών Kerio Connect

Φυσικά, δεν χρειάζεται να δημοσιεύουμε φακέλους που αναπαράγονται.

Πλήρης συγχρονισμός κοινόχρηστων φακέλων, επαφών, ημερολογίων μεταξύ διανεμημένων διακομιστών Kerio Connect

Αφού πραγματοποιηθεί η αναπαραγωγή (και δεν υπάρχει τίποτα ιδιαίτερο για αναπαραγωγή εκεί - οι φάκελοι είναι άδειοι), μπορούν να ξεκινήσουν οι διακομιστές αλληλογραφίας.

Στη συνέχεια, μπορείτε να γεμίσετε έναν από τους διακομιστές αλληλογραφίας με δεδομένα και να ελέγξετε ότι τα δεδομένα αναπαράγονται σωστά.

4. Δεκανίκι

Περιγραφή του προβληματισμού

Όπως μπορείτε να δείτε μετά την έναρξη του συγχρονισμού των δεδομένων (DFS), εάν είτε δημιουργήσατε κάτι στον πρώτο διακομιστή, κατά κάποιο τρόπο δεν εμφανίζεται τίποτα στον δεύτερο διακομιστή ή εμφανίζεται αλλά κατά κάποιο τρόπο όχι πάντα.

Μην απελπίζεστε· φυσικά, θα εμφανιστεί εκεί αργά ή γρήγορα, αλλά καλύτερα αργά παρά αργότερα. Γιατί είναι πολύ αργά σε 6-12 ώρες.

Το θέμα είναι ότι μόλις δημιουργήσετε κάτι στον πρώτο διακομιστή, στον δεύτερο και στους επόμενους διακομιστές το αρχείο φυσικά θα εμφανιστεί αμέσως χάρη στο σύστημα DFS, αλλά σε περίπτωση που αυτός ο κατάλογος αλληλογραφίας έχει ήδη διαβαστεί από κάποιον πριν και ζητείται ξανά, ο διακομιστής δεν θα ξαναδιαβάσει το φάκελο #msgs αλλά θα φτύσει δεδομένα από το δικό του ευρετήριο, τα οποία μπορεί να μην ανταποκρίνονται πλέον στην πραγματικότητά μας.

Το Kerio έχει έναν μηχανισμό για την εκ νέου ανάγνωση του ευρετηρίου, αλλά μπορεί να λειτουργήσει σε περίπου έξι ώρες και κατά τη διάρκεια αυτών των 6 ωρών η συνάφεια της εργασίας στο ημερολόγιο μπορεί να χαθεί κάπως.
Για να ελέγξετε τον συγχρονισμό αυτή τη στιγμή, μπορείτε να διαγράψετε το αρχείο στον αντίστοιχο συγχρονισμένο κατάλογο index.fld, αφού αποκτήσετε ξανά πρόσβαση στο φάκελο στον διακομιστή αλληλογραφίας και εάν αυτό το αρχείο λείπει, το Kerio θα διαβάσει ξανά τον κατάλογο και τα δεδομένα θα εμφανιστει. Φαίνεται ότι αυτή είναι η λύση, διαγράψτε το αρχείο όταν αλλάξουν τα δεδομένα, αλλά αυτό δεν λειτουργεί κάθε φορά, αλλά μόνο την πρώτη φορά, τότε το Kerio για κάποιο λόγο χάνει κάθε ενδιαφέρον για το index.fld
Αρχίζει επίσης να φτύνει μηνύματα που είναι ακατανόητα για τον χρήστη - σχετικά με κάποιο είδος ευρετηρίου και ότι ήδη κάνει κάτι εκεί.

Υπάρχει μια άλλη επιλογή, να δημιουργήσετε κάτι - τη στιγμή της δημιουργίας ενός νέου αντικειμένου, ο διακομιστής ξαφνικά συνειδητοποιεί ότι το όνομα αρχείου που ήθελε να εκχωρήσει έχει ήδη ληφθεί, αλλά χιονίζει και αυτή είναι μια αδιέξοδη επιλογή.

Πώς μπορεί αυτό να είναι;

Αν προσέξουμε για άλλη μια φορά την εικόνα που μας είναι ήδη γνωστή.

Πλήρης συγχρονισμός κοινόχρηστων φακέλων, επαφών, ημερολογίων μεταξύ διανεμημένων διακομιστών Kerio Connect

Αλλά σε ένα άλλο αεροπλάνο, μπορείτε να δείτε ένα πολύ ενδιαφέρον κουμπί που χρειαζόμαστε τώρα - Επανακαταλογισμός φακέλων

Και μάλιστα. Εάν κάνουμε κλικ σε αυτό το κουμπί σε έναν διακομιστή αλληλογραφίας που δεν γνωρίζει ότι κάτι έχει ήδη αλλάξει στα συγχρονισμένα #msgs, θα έχουμε ένα σταθερό, γρήγορο αποτέλεσμα. Όλα όσα κρύβονται θα γίνουν ξεκάθαρα.

Στο αρχείο καταγραφής μπορείτε να δείτε πόσο χρόνο διαρκεί αυτή η διαδικασία· στην περίπτωσή μου με αρκετές χιλιάδες (15 χιλιάδες) εγγραφές διαρκεί περίπου 3-4 λεπτά.

Το μόνο που έχουμε να κάνουμε είναι να καταλάβουμε πώς να πατήσουμε πραγματικά αυτό το κουμπί όταν το χρειαζόμαστε.

Αποδεικνύεται Κέριο έχετε το δικό σας API

Περιγραφή
Εγγραφές

Η συνάρτηση που εκτελεί την εργασία μας μοιάζει με αυτό:
session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Από όλα τα παραπάνω, πρέπει να γράψουμε ένα σενάριο που θα παρακολουθεί την κατάσταση των φακέλων που μας ενδιαφέρουν και, αν κάτι έχει αλλάξει, θα εκτελεί τη λειτουργία που χρειαζόμαστε.

Θέλω να πω ότι έγραψα πολλές διαφορετικές εκδόσεις σεναρίων που εκτελούν διαφορετικούς ελέγχους και συμφώνησα με αυτή που εξάγει όλα τα συμπεράσματα με βάση τον αριθμό των αρχείων.

Υλοποίηση σεναρίου

Παράδειγμα και περιγραφή σεναρίου CMD

Re-index.bat

@echo off
set dir=%~dp0
%dir:~0,2%
CD "%~dp0"
md "%CD%LOG"
md "%CD%Setup"

ECHO -Start- >> "%CD%LOG%Computername%.log"
ECHO Start -> %Computername% %Date% %Time% >> "%CD%LOG%Computername%.log"

SetLocal EnableDelayedExpansion
for /f "UseBackQ Delims=" %%A IN ("%CD%Setup%Computername%.List") do (
  set /a c+=1
  set "m!c!=%%A"
)

set d=%c%
Echo Folder = %c%
ECHO Folder = %c% >> "%CD%LOG%Computername%.log"
ECHO.
ECHO. >> "%CD%LOG%Computername%.log"

:start
cls
if %c% LSS 1 exit
set /a id=1
set R=0

:Find
REM PF-Start
if "%id%" gtr "%c%" if %R% == 1 Goto Reindex 
if "%id%" gtr "%c%" timeout 60 && Goto start

For /F "tokens=1-3" %%a IN ('Dir "!m%id%!#msgs" /-C/S/A:-D') Do Set 2DirSize!id!=!DS!& Set DS=%%c
if "2DirSize!id!" == "" set 1DirSize!id!=!2DirSize%id%!

echo %id%
ECHO !m%id%!
echo Count        [ !1DirSize%id%! -- !2DirSize%id%! ]

if "!1DirSize%id%!" == "!2DirSize%id%!" ECHO Synk

REM DEL index.fld
if "!1DirSize%id%!" NEQ "!2DirSize%id%!" del /f /q !m%id%!index.fld && del /f /q !m%id%!indexlog.fld && del /f /q !m%id%!search.fld && set R=1 && ECHO RE-index Count && ECHO RE-index Count %Date% %Time% - Delete !m%id%! >> "%CD%LOG%Computername%.log"

set 1DirSize!id!=!2DirSize%id%!

ECHO.
ECHO.

set /a id+=1
goto Find

:Reindex
ECHO. >> "%CD%LOG%Computername%.log"
ECHO --- RE-INDEX - Start - %Date% %Time% --- >> "%CD%LOG%Computername%.log"
ECHO. >> ----------------------------------- >> "%CD%LOG%Computername%.log"
call PublicFolders.py
timeout 60
goto start

exit

Ένα αντίγραφο του σεναρίου εκτελείται σε κάθε διακομιστή αλληλογραφίας (μπορεί να χρησιμοποιηθεί ως υπηρεσία, δεν απαιτούνται δικαιώματα Adm)

Το σενάριο διαβάζει το αρχείο Setup%Computername%.List

Όπου %Computername% είναι το όνομα του τρέχοντος διακομιστή (Ο κατάλογος μπορεί να περιέχει λίστες όλων των διακομιστών ταυτόχρονα.)

Το αρχείο %Computername%.List – περιέχει τις πλήρεις διαδρομές των συγχρονισμένων καταλόγων, κάθε διαδρομή είναι γραμμένη σε μια νέα γραμμή και δεν πρέπει να περιέχει κενές γραμμές.

Μετά την πρώτη εκκίνηση, το σενάριο εκτελεί τη διαδικασία δημιουργίας ευρετηρίου, ανεξάρτητα από το αν είναι απαραίτητο ή όχι, και το σενάριο δημιουργεί επίσης ένα ευρετήριο του αριθμού των αρχείων σε κάθε συγχρονισμένο κατάλογο.

Ο σκοπός του σεναρίου είναι να μετρήσει όλα τα αρχεία στον καθορισμένο κατάλογο.

Στο τέλος της μέτρησης κάθε καταλόγου, εάν σε τουλάχιστον έναν κατάλογο η τρέχουσα τιμή των αρχείων δεν ταιριάζει με την προηγούμενη, το σενάριο διαγράφει αρχεία από τον ριζικό κατάλογο του συγχρονισμένου καταλόγου αλληλογραφίας: index.fld, indexlog.fld, search.fld και ξεκινά τη διαδικασία δημιουργίας ευρετηρίου των κοινόχρηστων φακέλων αλληλογραφίας.

Οι πληροφορίες σχετικά με την εκτέλεση εργασιών απορρίπτονται στον κατάλογο LOG.

Διαδικασία ευρετηρίασης
Η διαδικασία δημιουργίας ευρετηρίου καταλήγει στην εκτέλεση μιας συνάρτησης Kerio API
Session = callMethod("Domains.checkPublicFoldersIntegrity",{}, διακριτικό)

Ένα παράδειγμα υλοποίησης δίνεται στο – python
PublicFolders.py

import json
import urllib.request
import http.cookiejar
""" Cookie storage is necessary for session handling """
jar = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(jar))
urllib.request.install_opener(opener)
""" Hostname or ip address of your Kerio Control instance with protocol, port and credentials """

server = "http://127.0.0.1:4040"
username = "user"
password = "password"

def callMethod(method, params, token = None):
    """
    Remotely calls given method with given params.
    :param: method string with fully qualified method name
    :param: params dict with parameters of remotely called method
    :param: token CSRF token is always required except login method. Use method "Session.login" to obtain this token.
    """
    data =  {"method": method ,"id":1, "jsonrpc":"2.0", "params": params}

    req = urllib.request.Request(url = server + '/admin/api/jsonrpc/')
    req.add_header('Content-Type', 'application/json')
    if (token is not None):
        req.add_header('X-Token', token)    

    httpResponse = urllib.request.urlopen(req, json.dumps(data).encode())

    if (httpResponse.status == 200):
        body = httpResponse.read().decode()
        return json.loads(body)

session = callMethod("Session.login", {"userName":username, "password":password, "application":{"vendor":"Kerio", "name":"Control Api-Local", "version":"Python"}})
token = session["result"]["token"]
print (session)

session = callMethod("Domains.checkPublicFoldersIntegrity",{"domainId": "test2.local"}, token)
print (session)

callMethod("Session.logout",{}, token)

http://127.0.0.1:4040 μπορείτε να το αφήσετε ως έχει, αλλά αν χρειάζεστε HTTPS, η python πρέπει να εμπιστευτεί το πιστοποιητικό Kerio.

Επίσης στο αρχείο πρέπει να καθορίσετε έναν λογαριασμό με δικαιώματα για την εκτέλεση αυτής της λειτουργίας (Adm - δημόσιοι φάκελοι αλληλογραφίας) του διακομιστή αλληλογραφίας.

Ελπίζω το άρθρο μου να είναι χρήσιμο στους διαχειριστές του Kerio Connect.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο