Синхронизатсияи пурраи ҷузвдонҳои муштарак, мухотибон, тақвимҳо байни серверҳои тақсимшудаи Kerio Connect

Субҳ ба хайр, Ҳабр!

Мақсад

Ташкилоти ман сервери почтаро дар платформаи Kerio Connect истифода мебарад; серверҳои почта дар шаҳрҳои гуногун насб карда шудаанд, то ба корбарони худ хидмат расонанд. Дар аввал сохтори тақсимшуда вуҷуд надошт, зеро доменҳо дар сатҳи сеюм бо нишон додани шаҳри сайт фарқ мекунанд. Ҳама чиз кор кард ва ҳама хушбахт буданд. Як рӯзи хуб, роҳбарият вазифа гузошт, тақвими умумии фаъолиятҳо байни ҳама сайтҳо!

prehistory

Дар аввал, идея баланд бардоштани домени Почтаи тақсимшудаи Kerio буд ва он ҳама чизро худаш иҷро мекард. Ҳамин ки гуфта шуд, домени тақсимшуда таъсис дода шуд, аммо ин тавр набуд, сервер омода буд тақвимҳо, ҷузвдонҳо, мухотибон - байни доменҳои дар як сервер ҷойгиршуда ҳамоҳанг созад, аммо ҳеҷ гоҳ намехост, ки маълумотро байни якчанд домен ҳамоҳанг созад. серверҳо.

Ман, албатта, чунин сайдро интизор набудам ва муддати тӯлонӣ бовар намекардам, ки функсияе, ки ба ман лозим буд, нест. Баъдтар ман далелҳои ҳуҷҷатии ин далелро пайдо кардам. Ман аз ин хеле ҳайрон шудам ва ноумед шудам.

Вазифа бемайлон ба мушкилот табдил ёфт.

Вариантҳо чӣ гуна буданд?

  • Дар серверҳои гуногун ду муштарӣ эҷод кунед, ки маълумоти заруриро бо нармафзори тарафи сеюм мубодила мекунанд. Бояд ин нармафзори тарафи сеюмро пайдо кард, ки ин функсияро амалӣ кунад - ба ман чунин рейк маъқул нест, аммо ба назар чунин менамуд, ки ин ягона роҳи ҳалли зуд аст.
  • Барои ҳамоҳангсозии маълумот байни серверҳо скрипти шахсии худро нависед. Гап дар он аст, ки Kerio ҳар як объектро ҳамчун файли алоҳида нигоҳ медорад, бинобар ин барои кор бо файлҳо скрипт таҳия кардан лозим буд, аммо бо назардошти шумораи кофии манбаъҳо, вазифа то андозае мураккаб ба назар мерасид, хусусан азбаски иҷрои якчанд объект лозим буд дурустии маълумотро месанҷад, агар касе дар ҳамон вақт супориш эҷод кунад ва ғайра ва ғайра.

Ба пеш нигоҳ карда, ман мегӯям, ки ҳарчанд Kerio объектро ҳамчун файли алоҳида нигоҳ медорад, он қадар аблаҳ нест, то пурсед, ки ҳар дафъае, ки шумо ба объект ворид мешавед, системаи файлӣ чӣ кор мекунад.

Вақте ки вақти зиёдро ба андеша сарф намуда, як даста коғазро бо нақшаҳои «забт кардани қаламрави душман» кашидам, дар соати 6 ман ду қарори дуруст қабул кардам:

  • Қарори аввал ин аст, ки кори худатон кунед ва чизеро аз берун наҷӯед.
  • Ҳалли дуюм ин аст, ки хоб равед.

Аллакай саҳар ман бо як андешаи ягона ва ҳақиқӣ бедор шудам, ки ба чанд ҳарф кам шуда буд - DFS

ҳалли

Худи ҳалли масъала чунин менамуд

  • ҳама серверҳоеро, ки дар синхронизатсия иштирок мекунанд, ба OS Windows оваред. (Қисме аз он дар Linux буд. Муҳоҷирати маълумоти почта ба OS дигар лозим буд)
  • Сохтори директорияҳоеро, ки дар синхронизатсия иштирок мекунанд, муайян кунед - онҳо бояд якхела бошанд.
  • Ҳама серверҳои почтаро дар як домен бо фазои ягонаи DFS муайян кунед.
  • Домени тақсимшудаи Kerio-и дар боло зикршударо эҷод кунед, зеро дар ҳолати ман ҳамоҳангсозии додаҳо на танҳо байни серверҳо, балки байни доменҳо талаб карда мешавад; дуюмро сервери Kerio мустақилона идора карда метавонад. (бар хилофи якум)
  • Директорияҳои ҳамоҳангшударо ба фазои DFS насб кунед.
  • Як навъ асобаро пайдо кунед (охир, шумо бе асобағз зиндагӣ карда наметавонед)

Реализация

Намуна дар ду сервери почта (шояд бештар)

1. Домени тақсимшудаи Kerio

Синхронизатсияи пурраи ҷузвдонҳои муштарак, мухотибон, тақвимҳо байни серверҳои тақсимшудаи Kerio Connect

Мастер дар синхронизатсия иштирок намекунад, аммо ин шарти ҳатмӣ нест.

Ман тасвир намекунам, ки чӣ гуна баланд бардоштани домени тақсимшудаи Kerio, дар ин ҷо ҳеҷ чизи мушкиле нест, шумо метавонед расмиро омӯзед манул

Дар ниҳоят, шумо бояд тасвири зеринро дар консоли маъмурият бинед:

Синхронизатсияи пурраи ҷузвдонҳои муштарак, мухотибон, тақвимҳо байни серверҳои тақсимшудаи Kerio Connect

Синхронизатсияи пурраи ҷузвдонҳои муштарак, мухотибон, тақвимҳо байни серверҳои тақсимшудаи Kerio Connect

Баъдан ман ба ҷузвдонҳои муштарак таваҷҷӯҳ доштам; дар сервери Мастер шумо метавонед имконоти зеринро муайян кунед:

Синхронизатсияи пурраи ҷузвдонҳои муштарак, мухотибон, тақвимҳо байни серверҳои тақсимшудаи Kerio Connect

Синхронизатсияи пурраи ҷузвдонҳои муштарак, мухотибон, тақвимҳо байни серверҳои тақсимшудаи Kerio Connect

Барои ҳар як домен мушаххас - сервер ҷузвдонҳои ҷамъиятиро байни доменҳо ҳамоҳанг намекунад

Барои ҳама доменҳо умумӣ - ҳама серверҳо ҷузвдонҳои ҷамъиятии мавҷударо дар ҳар як домен тарк мекунанд ва барои ҳама доменҳо дар ҳар як сервери почта ҷузвдонҳои нави ягона эҷод мекунанд.

Диққат! Гарчанде ки ин хосият сиёсати конфигуратсияро дар ҳама серверҳо тағир медиҳад, он аз ҳар як сервер алоҳида ҳамоҳанг мекунад (яъне бидуни фазои ягонаи умумӣ)

Администратор ҳоло ҳам қобилияти тақсим кардани дастрасӣ байни корбаронро дорад.
дар ҳолати ман, онҳо ҳама аз они мананд ва ба ман ҳамоҳангсозии пурра лозим аст (дар ҳолати шумо, ҳалли он метавонад гуногун бошад) дар ҳар як сервер шумо бояд маҷмӯи якхелаи доменҳоро эҷод кунед, ки бояд ҳамоҳанг карда шаванд.

2. Феҳристи маълумотҳои Kerio

Акнун шумо бояд директорияҳои муштараки якхела эҷод кунед, ки бояд дар ҳар як сервер ҳамоҳанг карда шаванд. Папкаҳо, тақвимҳо, мухотибон.

Маслиҳат - феҳристҳоро бо забони англисӣ созед, агар шумо онҳоро бо лотинӣ созед, директория дар баъзе рамзгузории нофаҳмо ном дорад, ин ҳадди аққал нороҳат аст.

Ҳоло шумо бояд роҳҳои физикии ҷузвдонҳои почтаро дар ҳар як сервер пайдо кунед.

Барои ҳама доменҳо умумӣ ~DataMailmail#publicСинхронизируемый каталог#msgs
Барои ҳар як домен мушаххас ~DataMailmail**Domain**#publicСинхронизируемый каталог#msgs

Лутфан қайд кунед, ки мо на тамоми директорияро ҳамоҳанг хоҳем кард, балки танҳо контейнерро бо маълумот #msgs — худи объектхо дар ин чо нигох дошта мешаванд, хамаи маълумоти дигар бояд барои хар як сервер алохида бошанд.

3.DFS

Ман ба таври муфассал чӣ гуна танзим кардани DFS-ро тавсиф намекунам, дар ин масъала маълумоти кофӣ мавҷуд аст.

DFS як хидмати нақш дар Windows Server мебошад, ки қобилияти муттаҳид кардани ҷузвдонҳои муштаракро, ки дар серверҳои гуногун ҷойгиранд, таъмин мекунад
Истинод ба ҳуҷҷати MS DFS

Пеш аз насб кардани DFS, шумо бояд ҳамаи серверҳои почтаи электрониро, ки дар ҳамоҳангсозии додаҳо иштирок мекунанд, қатъ кунед.

Пас аз ба итмом расидани танзимот, шумо бояд тасвири зеринро барои ҳар як ҷузвдонҳои ҳамоҳангшуда қабул кунед

Синхронизатсияи пурраи ҷузвдонҳои муштарак, мухотибон, тақвимҳо байни серверҳои тақсимшудаи Kerio Connect

Табиист, ки ба мо лозим нест, ки ҷузвдонҳои такрорӣ нашр кунем.

Синхронизатсияи пурраи ҷузвдонҳои муштарак, мухотибон, тақвимҳо байни серверҳои тақсимшудаи Kerio Connect

Пас аз такрори такрорӣ (ва дар он ҷо ягон чизи махсусе вуҷуд надорад - ҷузвдонҳо холӣ ҳастанд), серверҳои почтаро оғоз кардан мумкин аст.

Баъдан, шумо метавонед яке аз серверҳои почтаро бо маълумот пур кунед ва санҷед, ки маълумот дуруст такрор шудааст.

4. Асобача

Тавсифи инъикос

Тавре ки шумо мебинед, пас аз синхронизатсияи маълумот (DFS), агар шумо ё чизеро дар сервери аввал эҷод карда бошед, гӯё чизе дар сервери дуюм пайдо намешавад, ё он ба назар мерасад, аммо на ҳамеша.

Ноумед нашавед, албатта, он дер ё зуд дар он ҷо пайдо мешавад, аммо беҳтар аз дертар. Зеро дар 6-12 соат хеле дер шудааст.

Гап дар сари он аст, ки ҳамин ки шумо чизеро дар сервери аввал эҷод кардед, дар серверҳои дуюм ва баъдӣ файл албатта ба шарофати системаи DFS фавран пайдо мешавад, аммо дар сурате, ки ин директорияи почта аз ҷониби касе қаблан хонда шуда бошад. ва боз талаб карда мешавад, сервер ҷузвдони #msgs-ро дубора намехонад, балки маълумотро аз индекси худ, ки дигар ба воқеияти мо мувофиқат намекунад, хориҷ мекунад.

Kerio дорои механизми дубора хондани индекс аст, аммо он метавонад тақрибан дар шаш соат кор кунад ва дар давоми ин 6 соат аҳамияти вазифа дар тақвим метавонад то андозае гум шавад.
Барои санҷиши ҳамоҳангсозӣ худи ҳозир шумо метавонед файлро дар директорияи мувофиқи ҳамоҳангшуда index.fld нест кунед, пас аз дастрасии дубора ба ҷузвдон дар сервери почта ва агар ин файл мавҷуд набошад, Kerio директория ва маълумотро дубора мехонад. пайдо мешавад. Чунин ба назар мерасад, ки ин роҳи ҳалли он аст, вақте ки маълумот тағир меёбад, файлро нест кунед, аммо ин ҳама вақт кор намекунад, аммо танҳо бори аввал, пас Kerio бо баъзе сабабҳо тамоми таваҷҷӯҳи худро ба index.fld гум мекунад.
Он инчунин ба туф кардани паёмҳое шурӯъ мекунад, ки барои корбар нофаҳмоанд - дар бораи як намуди индекс ва он аллакай дар он ҷо коре мекунад.

Варианти дигар вуҷуд дорад, яъне эҷод кардани чизе - дар лаҳзаи сохтани объекти нав, сервер ногаҳон дарк мекунад, ки номи файле, ки ӯ таъин кардан мехост, аллакай гирифта шудааст, аммо барф мезанад ва ин варианти сарбаста аст.

Чӣ тавр бошад?

Агар ба расме, ки ба мо аллакай шинос аст, бори дигар диккат дихем.

Синхронизатсияи пурраи ҷузвдонҳои муштарак, мухотибон, тақвимҳо байни серверҳои тақсимшудаи Kerio Connect

Аммо дар ҳавопаймои дигар, шумо метавонед як тугмаи хеле ҷолибро бинед, ки ҳоло ба мо лозим аст - Папкаҳои реиндекс

Ва дар ҳақиқат. Агар мо ин тугмаро дар сервери почтаи электронӣ пахш кунем, ки намедонад, ки чизе дар #msgs ҳамоҳангшуда аллакай тағир ёфтааст, мо натиҷаи устувор ва зуд ба даст меорем. Ҳама чизи пинҳоншуда равшан хоҳад шуд.

Дар гузориш шумо мебинед, ки ин раванд чӣ қадар вақт мегирад, дар ҳолати ман бо якчанд ҳазор (15 ҳазор) сабт тақрибан 3-4 дақиқа вақтро мегирад.

Мо танҳо бояд бифаҳмем, ки чӣ гуна ин тугмаро ҳангоми зарурат пахш кардан лозим аст.

Маълум мешавад, ки Керио худро доранд API

Шарҳи
сабт

Функсияе, ки вазифаи моро иҷро мекунад, чунин менамояд:
session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Аз ҳамаи гуфтаҳои дар боло овардашуда, мо бояд скрипт нависем, ки ҳолати ҷузвдонҳои мавриди таваҷҷӯҳро назорат кунад ва агар чизе тағир ёбад, вазифаи ба мо лозимиро иҷро кунад.

Ман мехоҳам бигӯям, ки ман якчанд версияҳои гуногуни скриптҳоро навиштаам, ки санҷишҳои гуногунро иҷро мекунанд ва ба оне, ки аз рӯи шумораи файлҳо ҳама хулосаҳоро мебароранд, қарор гирифтам.

Амалисозии скрипт

Намунаи скрипти CMD ва тавсиф

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

Нусхаи скрипт дар ҳар як сервери почта кор мекунад (метавонад ҳамчун хидмат истифода шавад, ҳуқуқи Adm талаб карда намешавад)

Скрипт файлро мехонад Setup%Computername%.List

Дар куҷо %Компютер% номи сервери ҷорӣ аст (Феҳрист метавонад дар як вақт рӯйхати ҳамаи серверҳоро дар бар гирад.)

Файли %Computername%.List – дорои роҳҳои пурраи директорияҳои ҳамоҳангшуда буда, ҳар як роҳ дар сатри нав навишта мешавад ва набояд сатрҳои холӣ дошта бошад.

Пас аз оғози аввал, скрипт тартиби индексатсияро новобаста аз он ки зарур аст ё не, иҷро мекунад ва скрипт инчунин индекси шумораи файлҳоро дар ҳар як директорияи ҳамоҳангшуда эҷод мекунад.

Мақсади скрипт ҳисоб кардани ҳамаи файлҳои дар директорияи муайяншуда мебошад.

Дар охири ҳисобкунии ҳар як директория, агар ҳадди аққал дар як директория арзиши ҷории файлҳо ба пешина мувофиқат накунад, скрипт файлҳоро аз директорияи решаи директорияи почтаҳои ҳамоҳангшуда нест мекунад: index.fld, indexlog.fld, search.fld ва раванди индексатсияи ҷузвдонҳои почтаи муштаракро оғоз мекунад.

Маълумот дар бораи иҷрои вазифа ба феҳристи LOG партофта мешавад.

Раванди индексатсия
Раванди индексатсия ба иҷрои вазифаи Kerio API меояд
Сессия = callMethod("Domains.checkPublicFoldersIntegrity",{}, нишона)

Намунаи татбиқ дар - 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 шумо метавонед онро тавре тарк кунед, аммо агар ба шумо HTTPS лозим бошад, python бояд ба сертификати Kerio эътимод кунад.

Инчунин дар файл шумо бояд ҳисоберо бо ҳуқуқи иҷрои ин вазифа (Adm - ҷузвдонҳои почтаи оммавии) сервери почта муайян кунед.

Ман умедворам, ки мақолаи ман барои маъмурони Kerio Connect муфид хоҳад буд.

Манбаъ: will.com

Илова Эзоҳ