Бөлінген Kerio Connect серверлері арасында ортақ қалталарды, контактілерді, күнтізбелерді толық синхрондау

Қайырлы күн, Хабр!

Мақсаты

Менің ұйымым Kerio Connect платформасында пошта серверін пайдаланады; пошта серверлері пайдаланушыларына қызмет көрсету үшін әртүрлі қалаларда орнатылған. Бастапқыда бөлінген құрылым болмады, өйткені домендер сайттың қаласын көрсететін үшінші деңгейде ерекшеленеді. Барлығы жұмыс істеді және бәрі бақытты болды. Бір жақсы күн, басшылық міндет қойды, барлық сайттар арасындағы іс-шаралардың ортақ күнтізбесі!

тарихын

Бастапқыда идея Kerio таратылған пошта доменін көтеру болды және ол бәрін өзі жасайды. Айтпақшы, таратылған домен жасалды, бірақ олай болмады, сервер бір серверде орналасқан домендер арасында күнтізбелерді, қалталарды, контактілерді синхрондауға дайын болды, бірақ бірнеше деректер арасында мүлде синхрондауды жоспарламады. серверлер.

Мен, әрине, мұндай аулауды күткен жоқпын және маған қажет функцияның жоқтығына ұзақ уақыт сене алмадым. Кейінірек бұл фактінің құжаттық дәлелдерін таптым. Мен бұған қатты таң қалдым және көңілім қалды.

Тапсырма бірқалыпты мәселеге айналды.

Қандай нұсқалар болды?

  • Кейбір үшінші тарап бағдарламалық жасақтамасымен қажетті деректерді алмастыратын әртүрлі серверлерде екі клиент жасаңыз. Бұл функцияны жүзеге асыратын үшінші тарап бағдарламалық құралын табу керек болды - маған мұндай рейк ұнамайды, бірақ бұл жалғыз жылдам шешім сияқты көрінді.
  • Серверлер арасында деректерді синхрондау үшін өзіңіздің сценарийіңізді жазыңыз. Керио әрбір нысанды жеке файл ретінде сақтайды, сондықтан файлдармен жұмыс істеу үшін сценарий әзірлеу қажет болды, бірақ дереккөздердің жеткілікті санын ескере отырып, тапсырма біршама күрделі болып көрінді, әсіресе бірнеше рет орындау қажет болғандықтан деректердің дұрыстығын тексереді, егер біреу тапсырманы сол уақыт аралығында жасаған жағдайда және т.б.

Алға қарайтын болсақ, Kerio нысанды жеке файл ретінде сақтағанымен, нысанға қол жеткізген сайын файлдық жүйе қалай жұмыс істейтінін сұрау соншалықты ақымақ емес екенін айтайын.

Көп уақытты ойланып, «жау аумағын басып алу» жоспарлары бар бір топ қағазды құрастырып, сағат 6-да мен екі дұрыс шешім қабылдадым:

  • Бірінші шешім - өз ісіңмен айналысу және сырттан ештеңе іздемеу.
  • Екінші шешім - ұйықтау.

Таңертең мен бірнеше әріпке дейін қысқарған жалғыз және шынайы оймен ояндым - DFS

шешім

Шешімнің өзі осылай көрінді

  • синхрондауға қатысатын барлық серверлерді Windows операциялық жүйесіне әкеліңіз. (Оның бір бөлігі Linux жүйесінде болды. Пошта деректерін басқа операциялық жүйеге көшіру қажет болды)
  • Синхронизацияға қатысатын каталогтардың құрылымын анықтаңыз - олар бірдей болуы керек.
  • Бір 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

Біз бүкіл каталогты емес, тек контейнерді деректермен синхрондайтынымызды ескеріңіз #хабарламалар — мұнда объектілердің өзі сақталады, барлық басқа деректер әрбір сервер үшін бөлек болуы керек.

3.DFS

Мен DFS қалай конфигурациялау керектігін егжей-тегжейлі сипаттамаймын, бұл мәселе бойынша ақпарат жеткілікті.

DFS — әртүрлі серверлерде орналасқан ортақ қалталарды біріктіру мүмкіндігін беретін Windows серверіндегі рөлдік қызмет
MS DFS құжатына сілтеме

DFS орнату алдында деректерді синхрондауға қатысатын барлық пошта серверлерін тоқтату керек.

Орнату аяқталғаннан кейін синхрондалған қалталардың әрқайсысы үшін келесі кескінді алуыңыз керек

Бөлінген Kerio Connect серверлері арасында ортақ қалталарды, контактілерді, күнтізбелерді толық синхрондау

Әрине, қайталанатын қалталарды жариялаудың қажеті жоқ.

Бөлінген Kerio Connect серверлері арасында ортақ қалталарды, контактілерді, күнтізбелерді толық синхрондау

Көшіру орын алғаннан кейін (және ол жерде көшіру үшін ерекше ештеңе жоқ - қалталар бос), пошта серверлерін іске қосуға болады.

Әрі қарай, пошта серверлерінің бірін деректермен толтырып, деректердің дұрыс қайталанғанын тексеруге болады.

4. Балдақ

Рефлексияның сипаттамасы

Деректер синхрондауды (DFS) бастағаннан кейін көріп отырғаныңыздай, егер сіз бірінші серверде бірдеңе жасасаңыз, екінші серверде әйтеуір ештеңе пайда болмайды немесе ол пайда болады, бірақ әрқашан бола бермейді.

Үміт үзбеңіз, әрине, ол ерте ме, кеш пе пайда болады, бірақ кешікпей жақсырақ. Өйткені 6-12 сағатта тым кеш.

Мәселе мынада, сіз бірінші серверде бірдеңе жасағаннан кейін, екінші және кейінгі серверлерде файл, әрине, DFS жүйесінің арқасында бірден пайда болады, бірақ егер бұл пошта каталогын бұрын біреу оқып қойған болса. және қайта сұралса, сервер #msgs қалтасын қайта оқымайды, бірақ біздің шындыққа сәйкес келмеуі мүмкін өз индексінен деректерді шығарады.

Керионың индексті қайта оқу механизмі бар, бірақ ол шамамен алты сағатта жұмыс істей алады және осы 6 сағат ішінде күнтізбедегі тапсырманың өзектілігі біршама жоғалуы мүмкін.
Синхрондауды дәл қазір тексеру үшін пошта серверіндегі қалтаға қайта кіргеннен кейін index.fld сәйкес синхрондалған каталогтағы файлды жоюға болады және бұл файл жоқ болса, Kerio каталогты және деректерді қайта оқиды. пайда болады. Бұл шешім сияқты көрінуі мүмкін, деректер өзгерген кезде файлды жойыңыз, бірақ бұл әрқашан жұмыс істемейді, бірақ бірінші рет, содан кейін Kerio қандай да бір себептермен index.fld-ге деген қызығушылықты жоғалтады.
Ол сондай-ақ пайдаланушыға түсініксіз хабарламаларды түкіріп бастайды - қандай да бір индекс туралы және ол жерде бірдеңе істеп жатыр.

Бірдеңе жасаудың тағы бір нұсқасы бар - жаңа нысанды жасау сәтінде сервер тағайындалғысы келген файл атауының әлдеқашан алынғанын, бірақ ол қарлы және бұл тұйық опция екенін түсінеді.

Қалай болуы керек?

Бізге бұрыннан таныс суретке тағы бір рет назар аударсақ.

Бөлінген Kerio Connect серверлері арасында ортақ қалталарды, контактілерді, күнтізбелерді толық синхрондау

Бірақ басқа ұшақта сіз бізге қазір қажет өте қызықты түймені көре аласыз - Қалталарды қайта индекстеу

Және шынымен де. Синхрондалған #хабарламаларда әлдеқашан өзгергенін білмейтін пошта серверінде осы түймені бассақ, біз тұрақты, жылдам нәтиже аламыз. Жасырылғанның бәрі анық болады.

Журналда сіз бұл процестің қанша уақытқа созылатынын көре аласыз, менің жағдайда бірнеше мың (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

Мұндағы %Компьютер аты% ағымдағы сервердің атауы (Каталог бір уақытта барлық серверлердің тізімдерін қамтуы мүмкін.)

%Компьютер аты%.Тізім – файлы синхрондалған каталогтардың толық жолдарын қамтиды, әрбір жол жаңа жолда жазылады және бос жолдар болмауы керек.

Бірінші іске қосқаннан кейін сценарий қажет немесе жоқтығына қарамастан индекстеу процедурасын орындайды, сонымен қатар сценарий әрбір синхрондалған каталогтағы файлдар санының индексін жасайды.

Сценарийдің мақсаты – көрсетілген каталогтағы барлық файлдарды санау.

Әрбір каталогты санаудың соңында, егер кем дегенде бір каталогта файлдардың ағымдағы мәні алдыңғысына сәйкес келмесе, сценарий синхрондалған пошта каталогының түбірлік каталогынан файлдарды жояды: 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 әкімшілеріне пайдалы болады деп үміттенемін.

Ақпарат көзі: www.habr.com

пікір қалдыру