Visiškas bendrinamų aplankų, kontaktų, kalendorių sinchronizavimas tarp paskirstytų Kerio Connect serverių

Laba diena, Habr!

Užduotis

Mano organizacija naudoja pašto serverį Kerio Connect platformoje; pašto serveriai yra įdiegti skirtinguose miestuose, kad aptarnautų savo vartotojus. Iš pradžių nebuvo paskirstytos struktūros, nes domenai skiriasi trečiajame lygyje, nurodant svetainės miestą. Viskas pavyko ir visi liko patenkinti. Vieną gražią dieną vadovybė nustatė užduotį, bendrą veiklos kalendorių tarp visų svetainių!

priešistorė

Iš pradžių buvo mintis pakelti Kerio Distributed Mail Domain ir jis viską atliks pats. Netrukus buvo sukurtas paskirstytasis domenas, tačiau to nebuvo, serveris buvo pasirengęs sinchronizuoti kalendorius, aplankus, kontaktus – tarp domenų, esančių tame pačiame serveryje, tačiau visiškai nesiruošė sinchronizuoti duomenų tarp kelių serveriai.

Aš, žinoma, nesitikėjau tokio laimikio ir ilgai negalėjau patikėti, kad trūksta man reikalingo funkcionalumo. Vėliau radau dokumentinius šio fakto įrodymus. Buvau labai suglumęs ir nusivylęs tuo.

Užduotis sklandžiai virto problema.

Kokie buvo variantai?

  • Sukurkite du klientus skirtinguose serveriuose, kurie keičiasi reikalingais duomenimis su trečiosios šalies programine įranga. Reikėjo rasti šią trečiosios šalies programinę įrangą, kuri įgyvendintų šią funkciją - man toks grėblys nepatinka, bet atrodė, kad tai buvo vienintelis greitas sprendimas.
  • Parašykite savo scenarijų duomenų sinchronizavimui tarp serverių. Faktas yra tas, kad „Kerio“ saugo kiekvieną objektą kaip atskirą failą, todėl reikėjo sukurti scenarijų darbui su failais, tačiau, atsižvelgiant į pakankamą šaltinių skaičių, užduotis atrodė šiek tiek sudėtinga, juolab kad reikėjo atlikti kelis tikrina duomenų teisingumą, jei kas nors sukuria užduotį per tą patį laikotarpį ir pan., ir t.t.

Žvelgdamas į ateitį, pasakysiu, kad nors „Kerio“ saugo objektą kaip atskirą failą, nėra taip kvaila, kad kiekvieną kartą prieidamas prie objekto paklaustų, kaip sekasi failų sistemai.

Praleidęs daug laiko galvodamas, sudaręs krūvą popieriaus lapų su planais „užgrobti priešo teritoriją“, 6 valandą priėmiau du teisingus sprendimus:

  • Pirmas sprendimas – daryti savo reikalus ir nieko neieškoti iš išorės.
  • Antras sprendimas – eiti miegoti.

Jau ryte atsikėliau su viena vienintele ir tikra mintimi, kuri buvo sumažinta iki kelių raidžių - DFS

sprendimas

Pats sprendimas atrodė taip

  • atnešti visus serverius, kurie dalyvaus sinchronizacijoje, į OS Windows. (Dalis buvo „Linux“. Reikėjo perkelti pašto duomenis į kitą OS)
  • Nustatykite katalogų, kurie dalyvaus sinchronizacijoje, struktūrą – jie turi būti identiški.
  • Apibrėžkite visus pašto serverius viename domene naudodami vieną DFS erdvę.
  • Sukurkite aukščiau minėtą paskirstytą Kerio domeną, nes mano atveju reikalingas duomenų sinchronizavimas ne tik tarp serverių, bet ir tarp domenų, antrąjį Kerio serveris gali tvarkyti savarankiškai. (skirtingai nuo pirmojo)
  • Nustatykite sinchronizuotus katalogus į DFS erdvę.
  • Sugalvokite kokį nors ramentą (juk be ramento gyventi negalite)

Vykdymas

Pavyzdys dviejuose pašto serveriuose (gal ir daugiau)

1. Kerio Paskirstytasis domenas

Visiškas bendrinamų aplankų, kontaktų, kalendorių sinchronizavimas tarp paskirstytų Kerio Connect serverių

Meistras nedalyvauja sinchronizavime, bet tai nėra būtina sąlyga.

Neapibūdinsiu, kaip pakelti Kerio platinamą domeną, nieko sudėtingo tame nėra, galite pasistudijuoti oficialų manul

Galiausiai administravimo konsolėje turėtumėte pamatyti šį vaizdą:

Visiškas bendrinamų aplankų, kontaktų, kalendorių sinchronizavimas tarp paskirstytų Kerio Connect serverių

Visiškas bendrinamų aplankų, kontaktų, kalendorių sinchronizavimas tarp paskirstytų Kerio Connect serverių

Toliau mane domino bendrinami aplankai; pagrindiniame serveryje galite nurodyti šias parinktis:

Visiškas bendrinamų aplankų, kontaktų, kalendorių sinchronizavimas tarp paskirstytų Kerio Connect serverių

Visiškas bendrinamų aplankų, kontaktų, kalendorių sinchronizavimas tarp paskirstytų Kerio Connect serverių

Konkrečiai kiekvienam domenui - serveris nesinchronizuos viešųjų aplankų tarp domenų

Bendra visiems domenams - visi serveriai atsisakys esamų viešųjų aplankų kiekviename domene ir sukurs naujus atskirus aplankus visiems domenams kiekviename pašto serveryje.

Dėmesio! Nors ši parinktis pakeičia konfigūracijos politiką visuose serveriuose, ji sinchronizuojama atskirai nuo kiekvieno serverio (ty be vienos bendros erdvės)

Administratorius vis tiek turės galimybę paskirstyti prieigą tarp vartotojų.
mano atveju jie visi yra mano ir man reikia pilno sinchronizavimo (Jūsų atveju sprendimas gali skirtis) kiekviename serveryje reikia sukurti identiškus domenų rinkinius, kuriuos reikia sinchronizuoti.

2. Kerio duomenų katalogai

Dabar turite sukurti identiškus bendrinamus katalogus, kuriuos reikia sinchronizuoti kiekviename iš serverių. Aplankai, kalendoriai, kontaktai.

Patarimas – kurkite katalogus anglų kalba, jei kursite juos lotyniškai, katalogas turės pavadinimą kažkokiu nesuprantamu koduotu, tai bent jau nepatogu.

Dabar kiekviename serveryje turite rasti fizinius pašto aplankų kelius.

Bendra visiems domenams ~DataMailmail#publicСинхронизируемый каталог#msgs
Konkrečiai kiekvienam domenui ~DataMailmail**Domain**#publicСинхронизируемый каталог#msgs

Atminkite, kad sinchronizuosime ne visą katalogą, o tik konteinerį su duomenimis #žinutės — čia saugomi patys objektai, visi kiti duomenys kiekvienam serveriui turi būti atskiri.

3.DFS

Detaliai neaprašysiu, kaip sukonfigūruoti DFS, informacijos šiuo klausimu yra pakankamai.

DFS yra „Windows Server“ vaidmenų paslauga, suteikianti galimybę sujungti bendrinamus aplankus, esančius skirtinguose serveriuose
Nuoroda į MS DFS dokumentą

Prieš nustatydami DFS, turite sustabdyti visus pašto serverius, kurie dalyvaus duomenų sinchronizavime.

Baigę sąranką turėtumėte gauti toliau pateiktą kiekvieno sinchronizuoto aplanko vaizdą

Visiškas bendrinamų aplankų, kontaktų, kalendorių sinchronizavimas tarp paskirstytų Kerio Connect serverių

Žinoma, mums nereikia skelbti pakartotų aplankų.

Visiškas bendrinamų aplankų, kontaktų, kalendorių sinchronizavimas tarp paskirstytų Kerio Connect serverių

Po to, kai įvyksta replikacija (o ten nėra nieko ypatingo replikuoti - aplankai tušti), galima paleisti pašto serverius.

Tada galite užpildyti vieną iš pašto serverių duomenimis ir patikrinti, ar duomenys yra tinkamai atkartoti.

4. Ramentas

Refleksijos aprašymas

Kaip matote pradėjus sinchronizuoti duomenis (DFS), jei ką nors sukūrėte pirmame serveryje, antrajame serveryje kažkaip nieko neatsiranda arba pasirodo, bet kažkaip ne visada.

Nenusiminkite, žinoma, anksčiau ar vėliau tai atsiras, bet geriau anksčiau nei vėliau. Nes per vėlu 6–12 valandų.

Reikalas tas, kad kai tik ką nors sukursite pirmame serveryje, antrajame ir vėlesniuose serveriuose failas, žinoma, iš karto atsiras DFS sistemos dėka, tačiau tuo atveju, jei šį pašto katalogą kažkas jau perskaitė anksčiau. ir vėl prašoma, serveris neperskaitys aplanko #msgs, o išspjaus duomenis iš savo indekso, kuris gali nebeatitikti mūsų tikrovės.

Kerio turi mechanizmą, leidžiantį perskaityti rodyklę, tačiau jis gali veikti maždaug per šešias valandas, o per šias 6 valandas užduoties aktualumas kalendoriuje gali būti šiek tiek prarastas.
Norėdami iš karto išbandyti sinchronizavimą, galite ištrinti failą atitinkamame sinchronizuotame kataloge index.fld, iš naujo prisijungę prie pašto serverio aplanko ir jei šio failo trūksta, Kerio iš naujo perskaitys katalogą ir duomenis atsiras. Atrodytų, kad tai yra sprendimas, ištrinkite failą pasikeitus duomenims, bet tai veikia ne kiekvieną kartą, o tik pirmą kartą, tada Kerio kažkodėl praranda susidomėjimą index.fld
Taip pat pradeda spjauti vartotojui nesuprantamus pranešimus – apie kažkokią indeksą ir kad jau ten kažką daro.

Yra ir kitas variantas, ką nors sukurti – naujo objekto kūrimo momentu serveris staiga suvokia, kad failo pavadinimas, kurį norėjo priskirti, jau užimtas, bet sninga ir tai yra aklavietės variantas.

Kaip tai gali būti?

Jei dar kartą atkreiptume dėmesį į mums jau pažįstamą paveikslą.

Visiškas bendrinamų aplankų, kontaktų, kalendorių sinchronizavimas tarp paskirstytų Kerio Connect serverių

Bet kitame lėktuve galite pamatyti labai įdomų mygtuką, kurio mums dabar reikia - Perindeksuoti aplankus

Ir tikrai. Paspaudę šį mygtuką pašto serveryje, kuris nežino, kad sinchronizuotame #msgs jau kažkas pasikeitė, gausime stabilų, greitą rezultatą. Viskas, kas paslėpta, paaiškės.

Žurnale galite pamatyti, kiek laiko užtrunka šis procesas, mano atveju su keliais tūkstančiais (15 tūkst.) įrašų tai trunka apie 3-4 minutes.

Viskas, ką turime padaryti, tai išsiaiškinti, kaip iš tikrųjų paspausti šį mygtuką, kai to reikia.

Paaiškėjo, kad Kerio turėti savo API

aprašymas
Įrašai

Funkcija, kuri atlieka mūsų užduotį, atrodo taip:
session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Iš viso to, kas išdėstyta aukščiau, reikia parašyti scenarijų, kuris stebėtų dominančių aplankų būseną ir, jei kas nors pasikeitė, atliktų mums reikalingą funkciją.

Noriu pasakyti, kad parašiau kelias skirtingas scenarijų versijas, kurios atlieka skirtingus patikrinimus, ir apsistojau ties ta, kuri daro visas išvadas pagal failų skaičių.

Scenarijaus įgyvendinimas

CMD scenarijaus pavyzdys ir aprašymas

Iš naujo indeksuokite.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

Scenarijaus kopija veikia kiekviename pašto serveryje (gali būti naudojama kaip paslauga, administratoriaus teisės nereikalingos)

Scenarijus nuskaito failą Setup%Computername%.List

Kur %Computername% yra dabartinio serverio pavadinimas (kataloge gali būti visų serverių sąrašai vienu metu.)

Failas %Computername%.List – yra visi sinchronizuotų katalogų keliai, kiekvienas kelias rašomas naujoje eilutėje ir neturi būti tuščių eilučių.

Po pirmojo paleidimo scenarijus atlieka indeksavimo procedūrą, nepriklausomai nuo to, ar tai būtina, ar ne, be to, scenarijus sukuria failų skaičiaus indeksą kiekviename sinchronizuotame kataloge.

Scenarijaus tikslas – suskaičiuoti visus nurodytame kataloge esančius failus.

Skaičiuojant kiekvieną katalogą, jei bent viename kataloge esama failų reikšmė nesutampa su ankstesne, scenarijus ištrina failus iš sinchronizuoto pašto katalogo šakninio katalogo: index.fld, indexlog.fld, search.fld ir pradeda bendrai naudojamų pašto aplankų indeksavimo procesą.

Informacija apie užduoties vykdymą iškeliama į LOG katalogą.

Indeksavimo procesas
Indeksavimo procesas susijęs su Kerio API funkcijos vykdymu
Sesija = callMethod("Domains.checkPublicFoldersIntegrity",{}, prieigos raktas)

Pateiktas įgyvendinimo pavyzdys – 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 galite palikti jį tokį, koks yra, bet jei jums reikia HTTPS, python turi pasitikėti Kerio sertifikatu.

Taip pat faile turite nurodyti paskyrą su teisėmis atlikti šią pašto serverio funkciją (Adm – viešieji pašto aplankai).

Tikiuosi, kad mano straipsnis bus naudingas „Kerio Connect“ administratoriams.

Šaltinis: www.habr.com

Добавить комментарий