Sinkronizimi i plotë i dosjeve të përbashkëta, kontakteve, kalendarëve ndërmjet serverëve të shpërndarë Kerio Connect

Mirëdita, Habr!

Detyrë

Organizata ime përdor një server poste në platformën Kerio Connect; serverët e postës janë instaluar në qytete të ndryshme për t'u shërbyer përdoruesve të tyre. Fillimisht nuk kishte strukturë të shpërndarë, pasi domenet ndryshojnë në nivelin e tretë, duke treguar qytetin e sitit. Gjithçka funksionoi dhe të gjithë ishin të lumtur. Një ditë të bukur, menaxhmenti vendosi një detyrë, një kalendar të përbashkët aktivitetesh midis të gjitha faqeve!

parahistorinë

Fillimisht, ideja ishte të ngrihej domeni i postës së shpërndarë Kerio dhe ai do të bënte gjithçka vetë. Sapo u bë, u krijua një domen i shpërndarë, por nuk ishte kështu, serveri ishte gati të sinkronizonte kalendarët, dosjet, kontaktet - midis domeneve të vendosura në të njëjtin server, por nuk do të sinkronizonte fare të dhënat midis disa serverët.

Unë, natyrisht, nuk e prisja një kapje të tillë dhe për një kohë të gjatë nuk mund të besoja që funksionaliteti që më duhej mungonte. Më vonë gjeta prova dokumentare të këtij fakti. Isha shumë i hutuar dhe i zhgënjyer nga kjo.

Detyra pa probleme u shndërrua në një problem.

Cilat ishin opsionet?

  • Krijoni dy klientë në serverë të ndryshëm që shkëmbejnë të dhënat e nevojshme me disa softuer të palëve të treta. Ishte e nevojshme të gjeja këtë softuer të palëve të treta që do të zbatonte këtë funksionalitet - nuk më pëlqen një grabujë e tillë, por dukej se kjo ishte zgjidhja e vetme e shpejtë.
  • Shkruani skriptin tuaj për sinkronizimin e të dhënave midis serverëve. Fakti është se Kerio ruan çdo objekt si një skedar të veçantë, kështu që ishte e nevojshme të zhvillohej një skript për të punuar me skedarë, por duke pasur parasysh numrin e mjaftueshëm të burimeve, detyra dukej disi e ndërlikuar, veçanërisht pasi ishte e nevojshme të kryheshin shumë kontrollon saktësinë e të dhënave, në rast se dikush krijon detyrë në të njëjtën periudhë kohore, etj., etj.

Duke parë përpara, unë do të them se megjithëse Kerio ruan një objekt si një skedar të veçantë, nuk është aq budalla sa të pyesësh se si po funksionon sistemi i skedarëve sa herë që i qasesh objektit.

Pasi kalova shumë kohë duke menduar, duke hartuar një tufë letrash me plane "për të kapur territorin e armikut", në orën 6 mora dy vendime të drejta:

  • Vendimi i parë është të bëni gjërat tuaja dhe të mos kërkoni asgjë nga jashtë.
  • Zgjidhja e dytë është të flini.

Tashmë në mëngjes u zgjova me një mendim të vetëm dhe të vërtetë, i cili u reduktua në disa shkronja - DFS

vendim

Vetë zgjidhja dukej kështu

  • sillni të gjithë serverët që do të marrin pjesë në sinkronizim në OS Windows. (Një pjesë ishte në Linux. Kërkohej migrimi i të dhënave të postës në një sistem tjetër operativ)
  • Përcaktoni strukturën e drejtorive që do të marrin pjesë në sinkronizim - ato duhet të jenë identike.
  • Përcaktoni të gjithë serverët e postës nën një domen me një hapësirë ​​të vetme DFS.
  • Krijoni domenin Kerio të shpërndarë të lartpërmendur, pasi në rastin tim kërkohet sinkronizimi i të dhënave, jo vetëm midis serverëve, por edhe midis domeneve; i dyti mund të trajtohet nga serveri Kerio në mënyrë të pavarur. (ndryshe nga i pari)
  • Vendosni drejtoritë e sinkronizuara në hapësirën DFS.
  • Dilni me një lloj paterica (në fund të fundit, nuk mund të jetoni pa një paterica)

Zbatimi

Shembull në dy serverë poste (ndoshta më shumë)

1. Kerio domen i shpërndarë

Sinkronizimi i plotë i dosjeve të përbashkëta, kontakteve, kalendarëve ndërmjet serverëve të shpërndarë Kerio Connect

Master nuk merr pjesë në sinkronizim, por kjo nuk është një parakusht.

Unë nuk do të përshkruaj se si të ngrihet një domen i shpërndarë Kerio, nuk ka asgjë të komplikuar në lidhje me të, ju mund të studioni zyrtarin manul

Në fund të fundit, duhet të shihni imazhin e mëposhtëm në tastierën e administratës:

Sinkronizimi i plotë i dosjeve të përbashkëta, kontakteve, kalendarëve ndërmjet serverëve të shpërndarë Kerio Connect

Sinkronizimi i plotë i dosjeve të përbashkëta, kontakteve, kalendarëve ndërmjet serverëve të shpërndarë Kerio Connect

Më pas më interesuan dosjet e përbashkëta; në serverin Master mund të specifikoni opsionet e mëposhtme:

Sinkronizimi i plotë i dosjeve të përbashkëta, kontakteve, kalendarëve ndërmjet serverëve të shpërndarë Kerio Connect

Sinkronizimi i plotë i dosjeve të përbashkëta, kontakteve, kalendarëve ndërmjet serverëve të shpërndarë Kerio Connect

Specifike për çdo domen - Serveri nuk do të sinkronizojë dosjet publike midis domeneve

E përbashkët për të gjitha domenet - të gjithë serverët do të braktisin dosjet publike ekzistuese në çdo domen dhe do të krijojnë dosje të reja të vetme për të gjitha domenet në secilin server të postës.

Kujdes! Megjithëse ky opsion ndryshon politikën e konfigurimit në të gjithë serverët, ai sinkronizohet veçmas nga secili server (d.m.th., pa një hapësirë ​​të vetme të përbashkët)

Administratori do të ketë ende aftësinë për të shpërndarë aksesin midis përdoruesve.
në rastin tim, ato janë të gjitha të miat dhe kam nevojë për sinkronizim të plotë (në rastin tuaj, zgjidhja mund të jetë e ndryshme) në secilin server ju duhet të krijoni grupe identike domenesh që duhet të sinkronizohen.

2. Drejtoritë e të dhënave Kerio

Tani ju duhet të krijoni drejtori identike të përbashkëta që duhet të sinkronizohen në secilin prej serverëve. Dosjet, Kalendarët, Kontaktet.

Këshilla - krijoni drejtori në anglisht, nëse i krijoni ato në latinisht, drejtoria do të ketë një emër në një kodim të pakuptueshëm, kjo është të paktën e papërshtatshme.

Tani ju duhet të gjeni shtigjet fizike të dosjeve të postës në secilin server.

E përbashkët për të gjitha domenet ~DataMailmail#publicСинхронизируемый каталог#msgs
Specifike për çdo domen ~DataMailmail**Domain**#publicСинхронизируемый каталог#msgs

Ju lutemi vini re se ne nuk do të sinkronizojmë të gjithë drejtorinë, por vetëm kontejnerin me të dhënat #msgs — vetë objektet ruhen këtu, të gjitha të dhënat e tjera duhet të jenë të ndara për secilin server.

3.DFS

Unë nuk do të përshkruaj në detaje se si të konfiguroni DFS, ka informacion të mjaftueshëm për këtë çështje.

DFS është një shërbim me role në Windows Server që ofron mundësinë për të kombinuar dosjet e përbashkëta të vendosura në serverë të ndryshëm
Lidhja me dokumentin MS DFS

Përpara se të konfiguroni DFS, duhet të ndaloni të gjithë serverët e postës që do të marrin pjesë në sinkronizimin e të dhënave.

Pas përfundimit të konfigurimit, duhet të merrni imazhin e mëposhtëm për secilën prej dosjeve të sinkronizuara

Sinkronizimi i plotë i dosjeve të përbashkëta, kontakteve, kalendarëve ndërmjet serverëve të shpërndarë Kerio Connect

Natyrisht, nuk kemi nevojë të publikojmë dosje të përsëritura.

Sinkronizimi i plotë i dosjeve të përbashkëta, kontakteve, kalendarëve ndërmjet serverëve të shpërndarë Kerio Connect

Pasi të ndodhë përsëritja (dhe nuk ka asgjë të veçantë për t'u përsëritur atje - dosjet janë bosh), serverët e postës mund të nisen.

Më pas, mund të plotësoni një nga serverët e postës me të dhëna dhe të kontrolloni nëse të dhënat janë përsëritur saktë.

4. Paterica

Përshkrimi i reflektimit

Siç mund ta shihni pasi të dhënat fillojnë të sinkronizohen (DFS), nëse keni krijuar diçka në serverin e parë, disi asgjë nuk shfaqet në serverin e dytë, ose shfaqet, por disi jo gjithmonë.

Mos u dëshpëroni; sigurisht, do të shfaqet atje herët a vonë, por më mirë herët se vonë. Sepse është shumë vonë në 6-12 orë.

Puna është që sapo të keni krijuar diçka në serverin e parë, në serverin e dytë dhe të mëvonshëm skedari sigurisht që do të shfaqet menjëherë falë sistemit DFS, por në rast se kjo direktori e postës është lexuar tashmë nga dikush më parë dhe kërkohet përsëri, serveri nuk do të rilexojë dosjen #msgs por do të nxjerrë të dhëna nga indeksi i tij, të cilat mund të mos korrespondojnë më me realitetin tonë.

Kerio ka një mekanizëm për rileximin e indeksit, por ai mund të funksionojë në rreth gjashtë orë, dhe gjatë këtyre 6 orëve rëndësia e detyrës në kalendar mund të humbasë disi.
Për të testuar sinkronizimin tani, mund ta fshini skedarin në direktorinë përkatëse të sinkronizuar index.fld, pasi të keni ri-qasur dosjen në serverin e postës dhe nëse ky skedar mungon, Kerio do të rilexojë drejtorinë dhe të dhënat do te shfaqet. Duket se kjo është zgjidhja, fshini skedarin kur të dhënat ndryshojnë, por kjo nuk funksionon çdo herë, por vetëm herën e parë, atëherë Kerio për ndonjë arsye humbet të gjithë interesin për index.fld
Ai gjithashtu fillon të nxjerr mesazhe që janë të pakuptueshme për përdoruesin - për një lloj indeksi dhe se ai tashmë po bën diçka atje.

Ekziston një mundësi tjetër, për të krijuar diçka - në momentin e krijimit të një objekti të ri, serveri befas kupton se emri i skedarit që donte të caktonte është marrë tashmë, por ai bie topa bore dhe ky është një opsion pa rrugëdalje.

Si të jesh?

Nëse i kushtojmë vëmendje edhe një herë fotos tashmë të njohur për ne.

Sinkronizimi i plotë i dosjeve të përbashkëta, kontakteve, kalendarëve ndërmjet serverëve të shpërndarë Kerio Connect

Por në një aeroplan tjetër, ju mund të shihni një buton shumë interesant që na nevojitet tani - Riindeksoni dosjet

Dhe me të vërtetë. Nëse klikojmë në këtë buton në një server poste që nuk e di se diçka ka ndryshuar tashmë në mesazhet # të sinkronizuara, do të marrim një rezultat të qëndrueshëm dhe të shpejtë. Çdo gjë e fshehur do të bëhet e qartë.

Në regjistër mund të shihni sa kohë zgjat ky proces; në rastin tim me disa mijëra (15 mijë) regjistrime zgjat rreth 3-4 minuta.

Gjithçka që duhet të bëjmë është të kuptojmë se si ta shtypim këtë buton kur na nevojitet.

Doli qe Kerio kanë të tyren API

Përshkrim
Records

Funksioni që kryen detyrën tonë duket si ky:
session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Nga të gjitha sa më sipër, duhet të shkruajmë një skript që do të monitoronte gjendjen e dosjeve me interes dhe, nëse diçka ka ndryshuar, do të kryente funksionin që na nevojitet.

Dua të them se kam shkruar disa versione të ndryshme të skripteve që kryejnë kontrolle të ndryshme dhe u vendosa në atë që nxjerr të gjitha përfundimet bazuar në numrin e skedarëve.

Zbatimi i skriptit

Shembull dhe përshkrim i skriptit CMD

Riindeksimi.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

Një kopje e skriptit ekzekutohet në secilin server të postës (mund të përdoret si shërbim, të drejtat e Adm nuk kërkohen)

Skripti lexon skedarin Setup%Computername%.List

Ku %Computername% është emri i serverit aktual (Direktoria mund të përmbajë listat e të gjithë serverëve menjëherë.)

Skedari %Computername%.Lista – përmban shtigjet e plota të drejtorive të sinkronizuara, çdo shteg është shkruar në një rresht të ri dhe nuk duhet të përmbajë rreshta boshe.

Pas nisjes së parë, skripti kryen procedurën e indeksimit, pavarësisht nëse është e nevojshme apo jo, dhe skripti gjithashtu krijon një indeks të numrit të skedarëve në çdo drejtori të sinkronizuar.

Qëllimi i skriptit është të numërojë të gjithë skedarët në drejtorinë e specifikuar.

Në fund të numërimit të çdo drejtorie, nëse në të paktën një drejtori vlera aktuale e skedarëve nuk përputhet me atë të mëparshme, skripti fshin skedarët nga direktoria rrënjësore e drejtorisë së sinkronizuar të postës: index.fld, indexlog.fld, search.fld dhe fillon procesin e indeksimit të dosjeve të postës së përbashkët.

Informacioni rreth ekzekutimit të detyrës hidhet në direktorinë LOG.

Procesi i indeksimit
Procesi i indeksimit zbret në ekzekutimin e një funksioni Kerio API
Session = callMethod("Domains.checkPublicFoldersIntegrity",{}, shenjë)

Një shembull i zbatimit është dhënë në - 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 mund ta lini ashtu siç është, por nëse keni nevojë për HTTPS, python duhet t'i besojë certifikatës Kerio.

Gjithashtu në skedar duhet të specifikoni një llogari me të drejta për të kryer këtë funksion (Adm - dosjet e postës publike) të serverit të postës.

Shpresoj se artikulli im do të jetë i dobishëm për administratorët e Kerio Connect.

Burimi: www.habr.com

Shto një koment