Jagatud kaustade, kontaktide ja kalendrite täielik sünkroonimine hajutatud Kerio Connecti serverite vahel

Tere pärastlõunast, Habr!

Ülesanne

Minu organisatsioon kasutab meiliserverit Kerio Connecti platvormil; meiliserverid on installitud erinevatesse linnadesse, et teenindada oma kasutajaid. Algselt ei olnud hajutatud struktuuri, kuna domeenid erinevad kolmandal tasemel, mis näitab saidi linna. Kõik toimis ja kõik olid rahul. Ühel ilusal päeval seadis juhtkond ülesande, kõigi saitide ühise tegevuskalendri!

eelajalugu

Esialgu oli idee tõsta Kerio distributed Mail Domain ja see teeks kõik ise. Varsti loodi hajutatud domeen, kuid see ei olnud nii, server oli valmis sünkroonima kalendreid, kaustu, kontakte - samas serveris asuvate domeenide vahel, kuid ei kavatsenud üldse andmeid mitme vahel sünkroonida. serverid.

Ma muidugi ei oodanud sellist saaki ja ei suutnud pikka aega uskuda, et vajalik funktsionaalsus on puudu. Hiljem leidsin selle fakti kohta dokumentaalseid tõendeid. Olin sellest väga hämmingus ja pettunud.

Ülesanne muutus sujuvalt probleemiks.

Millised olid valikud?

  • Looge erinevatesse serveritesse kaks klienti, mis vahetavad vajalikke andmeid mõne kolmanda osapoole tarkvaraga. Oli vaja leida see kolmanda osapoole tarkvara, mis seda funktsiooni rakendaks - mulle selline reha ei meeldi, kuid tundus, et see on ainus kiire lahendus.
  • Kirjutage oma skript andmete sünkroonimiseks serverite vahel. Fakt on see, et Kerio salvestab iga objekti eraldi failina, mistõttu oli vaja failidega töötamiseks välja töötada skript, kuid piisavat allikate arvu silmas pidades tundus ülesanne mõnevõrra keeruline, eriti kuna vaja oli teha mitu kontrollib andmete õigsust, juhuks kui keegi loob ülesande samal ajavahemikul jne jne.

Tulevikku vaadates ütlen, et kuigi Kerio salvestab objekti eraldi failina, pole see nii rumal, et iga kord objektile ligi pääsedes küsida, kuidas failisüsteemil läheb.

Olles veetnud palju mõtlemisaega ja koostanud hunniku paberitükke plaanidega "vaenlase territooriumi hõivamiseks", tegin kell 6 kaks õiget otsust:

  • Esimene otsus on teha oma asju ja mitte otsida midagi väljast.
  • Teine lahendus on magama minna.

Juba hommikul ärkasin ühe ainsa ja tõese mõtte peale, mis taandus paari tähe peale - DFS

otsus

Lahendus ise nägi välja selline

  • tuua kõik sünkroonimises osalevad serverid OS Windowsi. (Osa sellest oli Linuxis. Meiliandmete migreerimine teise OS-i oli vajalik)
  • Määrake sünkroonimises osalevate kataloogide struktuur - need peavad olema identsed.
  • Määrake kõik ühe domeeni alla kuuluvad meiliserverid ühe DFS-ruumiga.
  • Looge ülalmainitud hajutatud Kerio domeen, kuna minu puhul on andmete sünkroonimine vajalik mitte ainult serverite, vaid ka domeenide vahel, teisega saab Kerio server hakkama iseseisvalt. (erinevalt esimesest)
  • Määrake sünkroonitud kataloogid DFS-ruumiks.
  • Mõelge välja mingi kargud (lõppude lõpuks ei saa te ilma karguta elada)

Реализация

Näide kahes meiliserveris (võib-olla rohkemgi)

1. Kerio hajutatud domeen

Jagatud kaustade, kontaktide ja kalendrite täielik sünkroonimine hajutatud Kerio Connecti serverite vahel

Meister ei osale sünkroniseerimises, kuid see ei ole eelduseks.

Ma ei kirjelda, kuidas Kerio hajutatud domeeni kasvatada, selles pole midagi keerulist, saate uurida ametlikku manul

Lõppkokkuvõttes peaksite halduskonsoolis nägema järgmist pilti:

Jagatud kaustade, kontaktide ja kalendrite täielik sünkroonimine hajutatud Kerio Connecti serverite vahel

Jagatud kaustade, kontaktide ja kalendrite täielik sünkroonimine hajutatud Kerio Connecti serverite vahel

Järgmisena tundsin huvi jagatud kaustade vastu, põhiserveris saate määrata järgmised valikud:

Jagatud kaustade, kontaktide ja kalendrite täielik sünkroonimine hajutatud Kerio Connecti serverite vahel

Jagatud kaustade, kontaktide ja kalendrite täielik sünkroonimine hajutatud Kerio Connecti serverite vahel

Iga domeeni jaoks spetsiifiline - server ei sünkrooni avalikke kaustu domeenide vahel

Ühine kõikidele domeenidele - kõik serverid hülgavad igas domeenis olemasolevad avalikud kaustad ja loovad iga meiliserveri kõigi domeenide jaoks uued üksikud kaustad.

Hoiatus! Kuigi see valik muudab kõigi serverite konfiguratsioonipoliitikat, sünkroonitakse see igast serverist eraldi (st ilma ühe ühise ruumita)

Administraatoril on endiselt võimalus kasutajate vahel juurdepääsu jagada.
minu puhul on need kõik minu omad ja ma vajan täielikku sünkroonimist (Teie puhul võib lahendus olla erinev) igas serveris peate looma identsed domeenide komplektid, mida tuleb sünkroonida.

2. Kerio andmekataloogid

Nüüd peate looma identsed jagatud kataloogid, mis tuleb igas serveris sünkroonida. Kaustad, kalendrid, kontaktid.

Nõuanne - looge kataloogid inglise keeles, kui loote need ladina keeles, on kataloogil nimi mingis arusaamatus kodeeringus, see on vähemalt ebamugav.

Nüüd peate igas serveris leidma kirjade kaustade füüsilised teed.

Ühine kõikidele domeenidele ~DataMailmail#publicСинхронизируемый каталог#msgs
Iga domeeni jaoks spetsiifiline ~DataMailmail**Domain**#publicСинхронизируемый каталог#msgs

Pange tähele, et me ei sünkrooni kogu kataloogi, vaid ainult andmetega konteinerit #sõnumid — siia salvestatakse objektid ise, kõik muud andmed peavad olema iga serveri kohta eraldi.

3.DFS

Ma ei kirjelda üksikasjalikult, kuidas DFS-i konfigureerida, selle probleemi kohta on piisavalt teavet.

DFS on Windows Serveri rolliteenus, mis pakub võimalust kombineerida erinevates serverites asuvaid jagatud kaustu
Link MS DFS-i dokumendile

Enne DFS-i seadistamist peate peatama kõik meiliserverid, mis osalevad andmete sünkroonimises.

Pärast seadistamise lõpetamist peaksite saama iga sünkroonitud kausta jaoks järgmise pildi

Jagatud kaustade, kontaktide ja kalendrite täielik sünkroonimine hajutatud Kerio Connecti serverite vahel

Loomulikult ei pea me paljundatud kaustu avaldama.

Jagatud kaustade, kontaktide ja kalendrite täielik sünkroonimine hajutatud Kerio Connecti serverite vahel

Pärast replikatsiooni toimumist (ja seal pole midagi erilist paljundada - kaustad on tühjad), saab meiliservereid käivitada.

Järgmisena saate täita ühe meiliserveri andmetega ja kontrollida, kas andmed on õigesti kopeeritud.

4. Kark

Peegelduse kirjeldus

Nagu näete pärast andmete sünkroonimise (DFS) algust, kui lõite midagi esimeses serveris, ei kuvata teises serveris midagi või see ilmub, kuid millegipärast mitte alati.

Ärge heitke meelt; loomulikult ilmub see sinna varem või hiljem, kuid parem varem kui hiljem. Sest 6–12 tunni pärast on liiga hilja.

Asi on selles, et niipea, kui olete esimeses serveris midagi loonud, ilmub see fail loomulikult kohe tänu DFS-süsteemile teisele ja järgmistele serveritele, kuid juhul, kui keegi on seda meilikataloogi juba varem lugenud ja seda uuesti küsitakse, ei loe server #msgs kausta uuesti, vaid sülitab välja andmed enda registrist, mis ei pruugi enam vastata meie tegelikkusele.

Keriol on olemas mehhanism indeksi uuesti lugemiseks, kuid see võib töötada umbes kuue tunniga ja selle 6 tunni jooksul võib kalendris ülesande asjakohasus mõnevõrra kaduda.
Sünkroonimise koheseks testimiseks võite kustutada faili vastavas sünkroonitud kataloogis index.fld, pärast meiliserveris kausta uuesti sisenemist ja kui see fail puudub, loeb Kerio kataloogi ja andmed uuesti ilmub. Näib, et see on lahendus, kustutage fail andmete muutumisel, kuid see ei tööta iga kord, vaid ainult esimesel korral, siis kaotab Kerio mingil põhjusel huvi index.fld vastu
Samuti hakkab välja sülitama sõnumeid, mis on kasutajale arusaamatud - mingisuguse indeksi kohta ja et ta seal juba midagi teeb.

On veel üks võimalus, millegi loomine - uue objekti loomise hetkel saab server äkki aru, et failinimi, mida ta tahtis määrata, on juba hõivatud, kuid see on lumepallid ja see on ummikus variant.

Kuidas see võimalik on?

Kui pöörata veel kord tähelepanu meile juba tuttavale pildile.

Jagatud kaustade, kontaktide ja kalendrite täielik sünkroonimine hajutatud Kerio Connecti serverite vahel

Kuid teises lennukis näete väga huvitavat nuppu, mida me praegu vajame - Indekseerige kaustad uuesti

Ja tõepoolest. Kui klõpsame sellel nupul meiliserveris, mis ei tea, et sünkroonitud #sõnumis on juba midagi muutunud, saame stabiilse ja kiire tulemuse. Kõik peidetud saab selgeks.

Logis näete, kui kaua see protsess aega võtab, minu puhul kulub mitme tuhande (15 tuhande) kirjega umbes 3-4 minutit.

Peame vaid välja mõtlema, kuidas seda nuppu tegelikult vajutada, kui seda vajame.

Selgub Kerio on omad API

Kirjeldus
Документация

Funktsioon, mis meie ülesannet täidab, näeb välja järgmine:
session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Kõigest eelnevast tuleb kirjutada skript, mis jälgiks huvipakkuvate kaustade olekut ja kui midagi on muutunud, täidaks meile vajalikku funktsiooni.

Tahan öelda, et kirjutasin skriptidest mitu erinevat versiooni, mis teostavad erinevaid kontrolle, ja otsustasin selle juurde, mis teeb kõik järeldused failide arvu põhjal.

Skripti rakendamine

CMD skripti näide ja kirjeldus

Indekseeri uuesti.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

Skripti koopia töötab igas meiliserveris (saab kasutada teenusena, administraatori õigusi pole vaja)

Skript loeb faili Setup%Computername%.List

Kus %Computername% on praeguse serveri nimi (kataloog võib sisaldada kõigi serverite loendeid korraga.)

Fail %Computername%.List – sisaldab sünkroonitud kataloogide täielikke teid, iga tee kirjutatakse uuele reale ja ei tohi sisaldada tühje ridu.

Pärast esmakordset käivitamist teostab skript indekseerimisprotseduuri olenemata sellest, kas see on vajalik või mitte, samuti loob skript igas sünkroonitud kataloogis olevate failide arvu indeksi.

Skripti eesmärk on loendada kõik määratud kataloogis olevad failid.

Kui iga kataloogi loendamise lõpus vähemalt ühes kataloogis failide praegune väärtus ei ühti eelmisega, kustutab skript failid sünkroonitud meilikataloogi juurkataloogist: index.fld, indexlog.fld, search.fld ja käivitab jagatud meilikaustade indekseerimise.

Teave ülesande täitmise kohta sisestatakse kataloogi LOG.

Indekseerimisprotsess
Indekseerimisprotsess taandub Kerio API funktsiooni täitmisele
Seanss = callMethod("Domains.checkPublicFoldersIntegrity",{}, luba)

Rakenduse näide on toodud - 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 võite jätta selle nii nagu on, kuid kui vajate HTTPS-i, peab python Kerio sertifikaati usaldama.

Samuti peate failis määrama selle funktsiooni täitmiseks õigustega konto (Adm - avalikud meilikaustad) meiliserveris.

Loodan, et minu artikkel on Kerio Connecti administraatoritele kasulik.

Allikas: www.habr.com

Lisa kommentaar