Buong pag-synchronize ng mga nakabahaging folder, contact, kalendaryo sa pagitan ng mga distributed na server ng Kerio Connect

Magandang hapon, Habr!

Gawain

Gumagamit ang aking organisasyon ng mail server sa platform ng Kerio Connect; ang mga mail server ay naka-install sa iba't ibang lungsod upang pagsilbihan ang kanilang mga user. Sa una ay walang ibinahagi na istraktura, dahil ang mga domain ay naiiba sa ikatlong antas, na nagpapahiwatig ng lungsod ng site. Nagtrabaho ang lahat at masaya ang lahat. Isang magandang araw, ang pamamahala ay nagtakda ng isang gawain, isang karaniwang kalendaryo ng mga aktibidad sa pagitan ng lahat ng mga site!

prehistory

Sa una, ang ideya ay itaas ang Kerio Distributed Mail Domain at gagawin nito ang lahat mismo. Sa lalong madaling panahon sinabi kaysa sa tapos na, isang distributed domain ay nilikha, ngunit hindi iyon ang kaso, ang server ay handa na upang i-synchronize ang mga kalendaryo, folder, mga contact - sa pagitan ng mga domain na matatagpuan sa parehong server, ngunit hindi sa lahat ng pagpunta sa pag-synchronize ng data sa pagitan ng ilang mga server.

Siyempre, hindi ko inaasahan ang gayong catch at sa loob ng mahabang panahon ay hindi ako makapaniwala na ang pag-andar na kailangan ko ay nawawala. Nang maglaon ay nakakita ako ng dokumentaryong ebidensya ng katotohanang ito. Ako ay labis na naguguluhan at nabigo dahil dito.

Ang gawain ay maayos na naging problema.

Ano ang mga pagpipilian?

  • Lumikha ng dalawang kliyente sa magkaibang mga server na nagpapalitan ng kinakailangang data sa ilang software ng third-party. Kinakailangang hanapin ang software na ito ng third-party na magpapatupad ng pag-andar na ito - Hindi ko gusto ang ganoong rake, ngunit tila ito lamang ang mabilis na solusyon.
  • Sumulat ng iyong sariling script para sa pag-synchronize ng data sa pagitan ng mga server. Ang katotohanan ay ang Kerio ay nag-iimbak ng bawat bagay bilang isang hiwalay na file, kaya kinakailangan na bumuo ng isang script para sa pagtatrabaho sa mga file, ngunit dahil sa sapat na bilang ng mga mapagkukunan, ang gawain ay tila medyo kumplikado, lalo na dahil kinakailangan na magsagawa ng maramihang. sinusuri ang kawastuhan ng data, kung sakaling may lumikha ng gawain sa parehong yugto ng panahon, atbp., atbp.

Sa hinaharap, sasabihin ko na kahit na ang Kerio ay nag-iimbak ng isang bagay bilang isang hiwalay na file, hindi ito hangal na tanungin kung paano gumagana ang file system sa tuwing na-access mo ang bagay.

Sa paglipas ng maraming oras sa pag-iisip, pagguhit ng isang bungkos ng mga piraso ng papel na may mga plano "upang sakupin ang teritoryo ng kaaway," sa alas-6 ay gumawa ako ng dalawang tamang desisyon:

  • Ang unang desisyon ay gawin ang iyong sariling bagay at huwag maghanap ng anumang bagay mula sa labas.
  • Ang pangalawang solusyon ay ang matulog.

Nasa umaga na ako nagising na may isang solong at totoong pag-iisip, na nabawasan sa ilang mga titik - DFS

desisyon

Ang solusyon mismo ay ganito ang hitsura

  • dalhin ang lahat ng mga server na lalahok sa pag-synchronize sa OS Windows. (Bahagi nito ay nasa Linux. Kinakailangan ang paglipat ng data ng mail sa ibang OS)
  • Tukuyin ang istraktura ng mga direktoryo na lalahok sa pag-synchronize - dapat silang magkapareho.
  • Tukuyin ang lahat ng mga mail server sa ilalim ng isang domain na may isang puwang ng DFS.
  • Lumikha ng nabanggit sa itaas na ipinamahagi na domain ng Kerio, dahil sa aking kaso ay kinakailangan ang pag-synchronize ng data, hindi lamang sa pagitan ng mga server kundi pati na rin sa pagitan ng mga domain; ang pangalawa ay maaaring pangasiwaan ng server ng Kerio nang nakapag-iisa. (hindi tulad ng una)
  • Itakda ang mga naka-synchronize na direktoryo sa DFS space.
  • Gumawa ng isang uri ng saklay (pagkatapos ng lahat, hindi ka mabubuhay nang walang saklay)

Pagpapatupad

Halimbawa sa dalawang mail server (marahil higit pa)

1. Kerio Distributed domain

Buong pag-synchronize ng mga nakabahaging folder, contact, kalendaryo sa pagitan ng mga distributed na server ng Kerio Connect

Ang Master ay hindi nakikilahok sa pag-synchronize, ngunit ito ay hindi isang kinakailangan.

Hindi ko ilalarawan kung paano magtaas ng domain na ipinamahagi ng Kerio, walang kumplikado tungkol dito, maaari mong pag-aralan ang opisyal manul

Sa huli, dapat mong makita ang sumusunod na larawan sa administration console:

Buong pag-synchronize ng mga nakabahaging folder, contact, kalendaryo sa pagitan ng mga distributed na server ng Kerio Connect

Buong pag-synchronize ng mga nakabahaging folder, contact, kalendaryo sa pagitan ng mga distributed na server ng Kerio Connect

Susunod na interesado ako sa mga nakabahaging folder; sa Master server maaari mong tukuyin ang mga sumusunod na opsyon:

Buong pag-synchronize ng mga nakabahaging folder, contact, kalendaryo sa pagitan ng mga distributed na server ng Kerio Connect

Buong pag-synchronize ng mga nakabahaging folder, contact, kalendaryo sa pagitan ng mga distributed na server ng Kerio Connect

Tukoy para sa bawat domain - hindi i-synchronize ng server ang mga pampublikong folder sa pagitan ng mga domain

Karaniwan sa lahat ng domain - aabandonahin ng lahat ng server ang mga umiiral nang pampublikong folder sa bawat domain at gagawa ng mga bagong solong folder para sa lahat ng domain sa bawat mail server.

Warning! Bagama't binago ng pagpipiliang ito ang patakaran sa pagsasaayos sa lahat ng mga server, nagsi-synchronize ito nang hiwalay sa bawat server (iyon ay, nang walang iisang karaniwang espasyo)

Magkakaroon pa rin ng kakayahan ang administrator na ipamahagi ang access sa pagitan ng mga user.
sa aking kaso, lahat sila ay akin at kailangan ko ng buong pag-synchronize (Sa iyong kaso, ang solusyon ay maaaring iba) sa bawat server na kailangan mong lumikha ng magkaparehong hanay ng mga domain na kailangang i-synchronize.

2. Mga direktoryo ng data ng Kerio

Ngayon ay kailangan mong lumikha ng magkaparehong nakabahaging mga direktoryo na kailangang i-synchronize sa bawat isa sa mga server. Mga Folder, Kalendaryo, Mga Contact.

Payo - lumikha ng mga direktoryo sa Ingles, kung gagawin mo ang mga ito sa Latin, ang direktoryo ay magkakaroon ng pangalan sa ilang hindi maintindihan na pag-encode, ito ay hindi bababa sa hindi maginhawa.

Ngayon ay kailangan mong hanapin ang mga pisikal na landas ng mga mail folder sa bawat server.

Karaniwan sa lahat ng domain ~DataMailmail#publicΠ‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³#msgs
Tukoy para sa bawat domain ~DataMailmail**Domain**#publicΠ‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³#msgs

Pakitandaan na hindi namin isi-synchronize ang buong direktoryo, ngunit ang lalagyan lamang na may data #msgs β€” ang mga bagay mismo ay naka-imbak dito, lahat ng iba pang data ay dapat na hiwalay para sa bawat server.

3.DFS

Hindi ko ilalarawan nang detalyado kung paano i-configure ang DFS, may sapat na impormasyon sa isyung ito.

Ang DFS ay isang serbisyo sa tungkulin sa Windows Server na nagbibigay ng kakayahang pagsamahin ang mga nakabahaging folder na matatagpuan sa iba't ibang mga server
Link sa MS DFS na dokumento

Bago i-set up ang DFS, dapat mong ihinto ang lahat ng mail server na lalahok sa pag-synchronize ng data.

Sa pagkumpleto ng setup, dapat mong matanggap ang sumusunod na larawan para sa bawat isa sa mga naka-synchronize na folder

Buong pag-synchronize ng mga nakabahaging folder, contact, kalendaryo sa pagitan ng mga distributed na server ng Kerio Connect

Naturally, hindi namin kailangang mag-publish ng mga replicated na folder.

Buong pag-synchronize ng mga nakabahaging folder, contact, kalendaryo sa pagitan ng mga distributed na server ng Kerio Connect

Pagkatapos maganap ang pagtitiklop (at walang espesyal na gagawin doon - ang mga folder ay walang laman), ang mga mail server ay maaaring magsimula.

Susunod, maaari mong punan ang isa sa mga mail server ng data at suriin kung ang data ay ginagaya nang tama.

4. Saklay

Paglalarawan ng repleksyon

Tulad ng makikita mo pagkatapos magsimulang mag-synchronize ang data (DFS), kung lumikha ka ng isang bagay sa unang server, kahit papaano ay walang lalabas sa pangalawang server, o lilitaw ito ngunit hindi palaging.

Huwag mawalan ng pag-asa; siyempre, lilitaw ito doon sa lalong madaling panahon o huli, ngunit mas mahusay kaysa sa huli. Dahil huli na sa loob ng 6 – 12 oras.

Ang bagay ay na sa sandaling lumikha ka ng isang bagay sa unang server, sa pangalawa at kasunod na mga server, siyempre, agad na lilitaw ang file salamat sa sistema ng DFS, ngunit kung sakaling ang direktoryo ng mail na ito ay nabasa na ng isang tao bago. at hinihiling muli, hindi na muling babasahin ng server ang #msgs folder ngunit ilalabas ang data mula sa sarili nitong index, na maaaring hindi na tumutugma sa ating realidad.

Ang Kerio ay may mekanismo para sa muling pagbabasa ng index, ngunit maaari itong gumana sa loob ng halos anim na oras, at sa loob ng 6 na oras na ito ang kaugnayan ng gawain sa kalendaryo ay maaaring medyo nawala.
Upang masubukan ang pag-synchronize ngayon, maaari mong tanggalin ang file sa kaukulang naka-synchronize na direktoryo na index.fld, pagkatapos muling i-access ang folder sa mail server at kung nawawala ang file na ito, muling babasahin ni Kerio ang direktoryo at ang data lalabas. Tila ito ang solusyon, tanggalin ang file kapag nagbago ang data, ngunit hindi ito gumagana sa bawat oras, ngunit sa unang pagkakataon lamang, pagkatapos ay nawawala ang interes ni Kerio sa index.fld sa ilang kadahilanan.
Nagsisimula rin itong maglabas ng mga mensahe na hindi maintindihan ng user - tungkol sa ilang uri ng index at may ginagawa na ito doon.

May isa pang pagpipilian, upang lumikha ng isang bagay - sa sandaling lumikha ng isang bagong bagay, biglang napagtanto ng server na ang pangalan ng file na nais nitong italaga ay nakuha na, ngunit ito ay nag-snowball at ito ay isang dead-end na opsyon.

Paano na?

Kung muli nating papansinin ang larawang pamilyar na sa atin.

Buong pag-synchronize ng mga nakabahaging folder, contact, kalendaryo sa pagitan ng mga distributed na server ng Kerio Connect

Ngunit sa isa pang eroplano, maaari mong makita ang isang napaka-kagiliw-giliw na pindutan na kailangan namin ngayon - I-reindex ang mga folder

At walang pag aalinlangan. Kung mag-click kami sa button na ito sa isang mail server na hindi alam na may nagbago na sa naka-synchronize na #msgs, makakakuha kami ng matatag at mabilis na resulta. Magiging malinaw ang lahat ng nakatago.

Sa log maaari mong makita kung gaano katagal ang prosesong ito; sa aking kaso na may ilang libong (15 libo) na mga talaan ay tumatagal ng mga 3-4 minuto.

Ang kailangan lang nating gawin ay alamin kung paano aktwal na pindutin ang button na ito kapag kailangan natin ito.

Lumalabas na Kerio magkaroon ng sariling API

ОписаниС
Records

Ang function na nagsasagawa ng aming gawain ay ganito ang hitsura:
session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Mula sa lahat ng nasa itaas, kailangan naming magsulat ng isang script na susubaybayan ang estado ng mga folder ng interes at, kung may nagbago, gawin ang function na kailangan namin.

Nais kong sabihin na nagsulat ako ng maraming iba't ibang mga bersyon ng mga script na nagsasagawa ng iba't ibang mga pagsusuri, at nanirahan sa isa na kumukuha ng lahat ng mga konklusyon batay sa bilang ng mga file.

Pagpapatupad ng script

Halimbawa at paglalarawan ng script ng CMD

Muling i-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

Ang isang kopya ng script ay tumatakbo sa bawat mail server (maaaring magamit bilang isang serbisyo, hindi kinakailangan ang mga karapatan sa Adm)

Binabasa ng script ang file Setup%Computername%.List

Kung saan ang %Computername% ay ang pangalan ng kasalukuyang server (Ang direktoryo ay maaaring maglaman ng mga listahan ng lahat ng mga server nang sabay-sabay.)

Ang file na %Computername%.List – naglalaman ng buong path ng mga naka-synchronize na direktoryo, ang bawat path ay nakasulat sa isang bagong linya, at hindi dapat maglaman ng mga walang laman na linya.

Pagkatapos ng unang paglunsad, ang script ay nagsasagawa ng pamamaraan ng pag-index, hindi alintana kung ito ay kinakailangan o hindi, at ang script ay lumilikha din ng isang index ng bilang ng mga file sa bawat naka-synchronize na direktoryo.

Ang layunin ng script ay bilangin ang lahat ng mga file sa tinukoy na direktoryo.

Sa pagtatapos ng pagbibilang ng bawat direktoryo, kung sa hindi bababa sa isang direktoryo ang kasalukuyang halaga ng mga file ay hindi tumutugma sa nauna, tinatanggal ng script ang mga file mula sa root directory ng naka-synchronize na direktoryo ng mail: index.fld, indexlog.fld, search.fld at simulan ang proseso ng pag-index ng mga shared mail folder.

Ang impormasyon tungkol sa pagsasagawa ng gawain ay itinapon sa direktoryo ng LOG.

Proseso ng pag-index
Ang proseso ng pag-index ay bumaba sa pagsasagawa ng isang Kerio API function
Session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Ang isang halimbawa ng pagpapatupad ay ibinigay sa – python
PublicFolds.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 maaari mong iwanan ito bilang ay, ngunit kung kailangan mo ng HTTPS, python ay dapat magtiwala sa Kerio certificate.

Gayundin sa file dapat mong tukuyin ang isang account na may mga karapatan upang maisagawa ang function na ito (Adm - mga pampublikong mail folder) ng mail server.

Umaasa ako na ang aking artikulo ay magiging kapaki-pakinabang sa mga administrator ng Kerio Connect.

Pinagmulan: www.habr.com

Magdagdag ng komento