Potpuna sinhronizacija zajedničkih foldera, kontakata, kalendara između distribuiranih Kerio Connect servera

Dobar dan, Habr!

Cilj

Moja organizacija koristi mail server na Kerio Connect platformi; mail serveri su instalirani u različitim gradovima da opslužuju svoje korisnike. U početku nije bilo distribuirane strukture, pošto se domeni razlikuju na trećem nivou, što ukazuje na grad lokacije. Sve je funkcionisalo i svi su bili zadovoljni. Jednog lijepog dana, uprava je postavila zadatak, zajednički kalendar aktivnosti između svih lokacija!

prapovijest

Prvobitno je ideja bila da se podigne Kerio Distributed Mail Domain i da bi sve uradio sam. Tek što je rečeno, napravljena je distribuirana domena, ali to nije bio slučaj, server je bio spreman da sinhronizuje kalendare, fascikle, kontakte - između domena koji se nalaze na istom serveru, ali uopšte nije hteo da sinhronizuje podatke između nekoliko serveri.

Ja, naravno, nisam očekivao ovakav ulov i dugo nisam mogao vjerovati da nedostaje funkcionalnost koja mi je bila potrebna. Kasnije sam pronašao dokumentarni dokaz ove činjenice. Bio sam veoma zbunjen i razočaran ovim.

Zadatak se glatko pretvorio u problem.

Koje su bile opcije?

  • Napravite dva klijenta na različitim serverima koji razmjenjuju potrebne podatke sa softverom treće strane. Bilo je potrebno pronaći softver treće strane koji bi implementirao ovu funkcionalnost - ne volim takve grabe, ali činilo se da je to jedino brzo rješenje.
  • Napišite vlastitu skriptu za sinhronizaciju podataka između servera. Činjenica je da Kerio svaki objekt pohranjuje kao zasebnu datoteku, pa je bilo potrebno razviti skriptu za rad s datotekama, ali s obzirom na dovoljan broj izvora, zadatak se činio pomalo kompliciranim, pogotovo jer je bilo potrebno izvršiti više provjerava ispravnost podataka, u slučaju da neko kreira zadatak u istom vremenskom periodu, itd, itd.

Gledajući unaprijed, reći ću da iako Kerio pohranjuje objekt kao zasebnu datoteku, nije toliko glupo da se svaki put kada pristupite objektu pitate kako radi sistem datoteka.

Pošto sam proveo dosta vremena razmišljajući, sastavljajući gomilu papirića sa planovima „zauzimanja neprijateljske teritorije“, u 6 sati doneo sam dve ispravne odluke:

  • Prva odluka je da radite svoju stvar i ne tražite ništa izvana.
  • Drugo rješenje je odlazak na spavanje.

Već ujutru sam se probudio sa jednom jedinom i istinitom mišlju, koja se svela na nekoliko slova - DFS

odluka

Samo rješenje je izgledalo ovako

  • dovesti sve servere koji će učestvovati u sinhronizaciji na OS Windows. (Dio je bio na Linuxu. Bila je potrebna migracija podataka pošte na drugi OS)
  • Odredite strukturu direktorija koji će učestvovati u sinhronizaciji - oni moraju biti identični.
  • Definirajte sve servere pošte pod jednom domenom sa jednim DFS prostorom.
  • Kreirajte gore pomenutu distribuiranu Kerio domenu, jer je u mom slučaju potrebna sinhronizacija podataka, ne samo između servera već i između domena; drugom Kerio server može samostalno upravljati. (za razliku od prvog)
  • Postavite sinkronizirane direktorije na DFS prostor.
  • Smislite neku vrstu štake (na kraju krajeva, ne možete živjeti bez štake)

Реализация

Primjer na dva mail servera (možda i više)

1. Kerio Distributed domain

Potpuna sinhronizacija zajedničkih foldera, kontakata, kalendara između distribuiranih Kerio Connect servera

Master ne učestvuje u sinhronizaciji, ali to nije preduslov.

Neću opisivati ​​kako podići distribuiranu domenu Kerio, u tome nema ništa komplicirano, možete proučiti službenu manul

Na kraju, trebali biste vidjeti sljedeću sliku na konzoli za administraciju:

Potpuna sinhronizacija zajedničkih foldera, kontakata, kalendara između distribuiranih Kerio Connect servera

Potpuna sinhronizacija zajedničkih foldera, kontakata, kalendara između distribuiranih Kerio Connect servera

Zatim su me zanimali dijeljeni folderi; na Master serveru možete odrediti sljedeće opcije:

Potpuna sinhronizacija zajedničkih foldera, kontakata, kalendara između distribuiranih Kerio Connect servera

Potpuna sinhronizacija zajedničkih foldera, kontakata, kalendara između distribuiranih Kerio Connect servera

Specifično za svaku domenu - server neće sinkronizirati javne mape između domena

Zajedničko za sve domene - svi serveri će napustiti postojeće javne foldere u svakoj domeni i kreirati nove pojedinačne foldere za sve domene na svakom serveru pošte.

Oprez Iako ova opcija mijenja politiku konfiguracije na svim serverima, ona se sinhronizuje odvojeno od svakog servera (tj. bez jedinstvenog zajedničkog prostora)

Administrator će i dalje imati mogućnost raspodjele pristupa između korisnika.
u mom slučaju, svi su moji i potrebna mi je potpuna sinhronizacija (u vašem slučaju rješenje može biti drugačije) na svakom serveru trebate kreirati identične skupove domena koje je potrebno sinhronizirati.

2. Kerio direktoriji podataka

Sada morate kreirati identične dijeljene direktorije koje je potrebno sinkronizirati na svakom od servera. Fascikle, kalendari, kontakti.

Savjet - kreirajte direktorije na engleskom, ako ih kreirate na latinici, imenik će imati ime u nekom nerazumljivom kodiranju, ovo je u najmanju ruku nezgodno.

Sada morate pronaći fizičke putanje foldera pošte na svakom serveru.

Zajedničko za sve domene ~DataMailmail#publicСинхронизируемый каталог#msgs
Specifično za svaku domenu ~DataMailmail**Domain**#publicСинхронизируемый каталог#msgs

Imajte na umu da nećemo sinkronizirati cijeli direktorij, već samo spremnik s podacima #msgs — sami objekti se pohranjuju ovdje, svi ostali podaci moraju biti odvojeni za svaki server.

3.DFS

Neću detaljno opisivati ​​kako konfigurirati DFS, ima dovoljno informacija o ovom pitanju.

DFS je usluga uloga u Windows Serveru koja pruža mogućnost kombinovanja zajedničkih fascikli koje se nalaze na različitim serverima
Link do MS DFS dokumenta

Prije postavljanja DFS-a, morate zaustaviti sve mail servere koji će učestvovati u sinhronizaciji podataka.

Po završetku podešavanja, trebalo bi da dobijete sledeću sliku za svaku od sinhronizovanih fascikli

Potpuna sinhronizacija zajedničkih foldera, kontakata, kalendara između distribuiranih Kerio Connect servera

Naravno, ne moramo da objavljujemo replicirane fascikle.

Potpuna sinhronizacija zajedničkih foldera, kontakata, kalendara između distribuiranih Kerio Connect servera

Nakon što dođe do replikacije (a tu nema ničeg posebnog za repliciranje - folderi su prazni), serveri e-pošte mogu se pokrenuti.

Zatim možete popuniti jedan od servera pošte podacima i provjeriti da li su podaci ispravno replicirani.

4. Štaka

Opis refleksije

Kao što vidite nakon što podaci počnu da se sinhronizuju (DFS), ako ste ili kreirali nešto na prvom serveru, na drugom serveru se nekako ništa ne pojavljuje ili se pojavljuje ali nekako ne uvek.

Ne očajavajte; naravno, pojavit će se prije ili kasnije, ali bolje prije nego kasnije. Jer je prekasno za 6-12 sati.

Stvar je u tome da čim kreirate nešto na prvom serveru, na drugom i narednim serverima fajl će se naravno odmah pojaviti zahvaljujući DFS sistemu, ali u slučaju da je ovaj direktorijum pošte već neko ranije pročitao i bude ponovo zatražen, server neće ponovo pročitati folder #msgs već će izbaciti podatke iz sopstvenog indeksa, koji možda više ne odgovaraju našoj stvarnosti.

Kerio ima mehanizam za ponovno čitanje indeksa, ali može raditi za oko šest sati, a tokom ovih 6 sati relevantnost zadatka u kalendaru može se donekle izgubiti.
Da biste odmah testirali sinhronizaciju, možete izbrisati datoteku u odgovarajućem sinhronizovanom direktoriju index.fld, nakon ponovnog pristupa folderu na serveru pošte i ako ova datoteka nedostaje, Kerio će ponovo pročitati direktorij i podatke će se pojaviti. Čini se da je ovo rješenje, izbrišite datoteku kada se podaci promijene, ali to ne radi svaki put, već samo prvi put, tada Kerio iz nekog razloga gubi svaki interes za index.fld
Počinje i da izbacuje poruke koje su korisniku nerazumljive - o nekakvom indeksu i da on tu već nešto radi.

Postoji još jedna opcija, da se nešto kreira - u trenutku kreiranja novog objekta, server odjednom shvati da je ime fajla koje je želeo da dodeli već zauzeto, ali pada sneg i ovo je ćorsokak opcija.

Kako biti?

Ako još jednom obratimo pažnju na sliku koja nam je već poznata.

Potpuna sinhronizacija zajedničkih foldera, kontakata, kalendara između distribuiranih Kerio Connect servera

Ali na drugom planu možete vidjeti vrlo zanimljivo dugme koje nam je sada potrebno - Ponovno indeksiranje foldera

I zaista. Ako kliknemo na ovo dugme na serveru pošte koji ne zna da se nešto već promenilo u sinhronizovanom #msgs, dobićemo stabilan, brz rezultat. Sve skriveno će postati jasno.

U logu možete vidjeti koliko dugo traje ovaj proces, u mom slučaju sa nekoliko hiljada (15 hiljada) zapisa traje oko 3-4 minute.

Sve što treba da uradimo je da smislimo kako da pritisnemo ovo dugme kada nam zatreba.

Ispostavilo se Kerio imaju svoje API

Opis
Dokumentacija

Funkcija koja obavlja naš zadatak izgleda ovako:
session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Iz svega navedenog trebamo napisati skriptu koja bi pratila stanje fascikli od interesa i, ako se nešto promijenilo, izvršila funkciju koja nam je potrebna.

Želim reći da sam napisao nekoliko različitih verzija skripti koje vrše različite provjere, i odlučio se na onu koja izvodi sve zaključke na osnovu broja datoteka.

Implementacija skripte

Primjer i opis CMD skripte

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

Kopija skripte radi na svakom mail serveru (može se koristiti kao usluga, Adm prava nisu potrebna)

Skripta čita fajl Setup%Computername%.List

Gdje je %Computername% ime trenutnog servera (direktorij može sadržavati liste svih servera odjednom.)

Datoteka %Computername%.List – sadrži pune putanje sinhronizovanih direktorijuma, svaka putanja je upisana u novom redu i ne bi trebalo da sadrži prazne redove.

Nakon prvog pokretanja, skripta obavlja proceduru indeksiranja, bez obzira da li je to potrebno ili ne, a skripta kreira i indeks broja datoteka u svakom sinhronizovanom direktorijumu.

Svrha skripte je da izbroji sve datoteke u navedenom direktoriju.

Na kraju brojanja svakog direktorija, ako u barem jednom direktoriju trenutna vrijednost datoteka ne odgovara prethodnoj, skripta briše datoteke iz korijenskog direktorija sinkroniziranog imenika pošte: index.fld, indexlog.fld, search.fld i pokreće proces indeksiranja dijeljenih imenika pošte.

Informacije o izvršavanju zadatka se izbacuju u LOG ​​direktorij.

Proces indeksiranja
Proces indeksiranja se svodi na izvršavanje Kerio API funkcije
Sesija = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Primjer implementacije je dat u – python-u
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 možete ostaviti kako jeste, ali ako vam je potreban HTTPS, python mora vjerovati Kerio certifikatu.

Takođe u datoteci morate navesti nalog sa pravima za obavljanje ove funkcije (Adm - javni folderi pošte) servera pošte.

Nadam se da će moj članak biti koristan za Kerio Connect administratore.

izvor: www.habr.com

Dodajte komentar