Хуваалцсан хавтас, харилцагчид, хуанли зэргийг түгээсэн Kerio Connect серверүүдийн хооронд бүрэн синхрончлох

Өдрийн мэнд, Хабр!

Зорилго

Манай байгууллага Kerio Connect платформ дээр мэйл сервер ашигладаг; мэйл серверүүд нь өөр өөр хотуудад суулгагдсан бөгөөд хэрэглэгчиддээ үйлчилдэг. Домэйнууд нь сайтын хотыг заадаг гурав дахь түвшинд ялгаатай тул эхэндээ хуваарилагдсан бүтэц байхгүй байв. Бүх зүйл амжилттай болж, бүгд баяртай байв. Нэг сайхан өдөр удирдлага бүх сайтуудын хоорондох үйл ажиллагааны нийтлэг хуанли, даалгавар тавьжээ!

Эрьт урьдын түүх

Эхэндээ Kerio Distributed Mail Domain-ийг өсгөх санаа нь бүх зүйлийг өөрөө хийх болно. Хэсэг хугацааны дараа тархсан домэйн бий болсон боловч тийм биш байсан тул сервер нь хуанли, хавтас, харилцагчдыг нэг сервер дээр байрлах домэйнуудын хооронд синхрончлоход бэлэн байсан боловч хэд хэдэн хооронд өгөгдлийг синхрончлохыг огтхон ч хүсэхгүй байв. серверүүд.

Мэдээжийн хэрэг, би ийм баригдана гэж төсөөлөөгүй бөгөөд надад хэрэгтэй функц байхгүй гэдэгт удаан хугацаанд итгэж чадахгүй байв. Дараа нь би энэ баримтын баримтат нотолгоог олсон. Үүнд би маш их гайхаж, сэтгэл дундуур байсан.

Даалгавар нь асуудал болж хувирав.

Ямар сонголтууд байсан бэ?

  • Гуравдагч талын програм хангамжтай шаардлагатай өгөгдлийг солилцдог өөр өөр сервер дээр хоёр үйлчлүүлэгч үүсгээрэй. Энэ функцийг хэрэгжүүлэх гуравдагч талын програм хангамжийг олох шаардлагатай байсан - би ийм тармуурт дургүй, гэхдээ энэ нь цорын ганц хурдан шийдэл юм шиг санагдаж байна.
  • Серверүүдийн хооронд өгөгдөл синхрончлохын тулд өөрийн скрипт бичнэ үү. Керио нь объект бүрийг тусдаа файл болгон хадгалдаг тул файлуудтай ажиллах скрипт боловсруулах шаардлагатай байсан ч хангалттай тооны эх сурвалжийг харгалзан үзэхэд даалгавар нь зарим талаараа төвөгтэй мэт санагдаж байсан, ялангуяа олон үйлдэл хийх шаардлагатай байсан. өгөгдлийн зөв эсэхийг шалгадаг, хэрэв хэн нэгэн ижил хугацаанд даалгавар үүсгэсэн гэх мэт.

Урагшаа харахад Керио хэдийгээр объектыг тусад нь файл болгон хадгалдаг ч таныг объект руу нэвтрэх болгонд файлын систем хэрхэн ажиллаж байгааг асуух нь тийм ч тэнэг биш гэдгийг би хэлэх болно.

"Дайсны газар нутгийг булаан авах" төлөвлөгөөтэй олон цаас зурж, олон цагийг бодож, 6 цагт би хоёр зөв шийдвэр гаргасан:

  • Эхний шийдвэр бол гаднаас юу ч хайхгүй, өөрийнхөөрөө хийх явдал юм.
  • Хоёр дахь шийдэл бол унтах явдал юм.

Өглөө аль хэдийн би ганцхан, үнэн бодлоор сэрж, хэдэн үсэг болгон бууруулсан - DFS

шийдвэр

Шийдэл нь өөрөө иймэрхүү харагдаж байв

  • OS Windows-д синхрончлолд оролцох бүх серверүүдийг авчрах. (Үүний нэг хэсэг нь Линукс дээр байсан. Мэйл өгөгдлийг өөр үйлдлийн систем рүү шилжүүлэх шаардлагатай байсан)
  • Синхрончлолд оролцох сангуудын бүтцийг тодорхойлох - тэдгээр нь ижил байх ёстой.
  • Нэг 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 Server дээрх үүргийн үйлчилгээ бөгөөд өөр сервер дээр байрлах хуваалцсан фолдеруудыг нэгтгэх боломжийг олгодог
MS DFS баримт бичгийн холбоос

DFS-ийг тохируулахын өмнө та өгөгдлийн синхрончлолд оролцох бүх имэйл серверүүдийг зогсоох ёстой.

Тохируулга дууссаны дараа та синхрончлогдсон хавтас тус бүрийн дараах зургийг хүлээн авах ёстой

Хуваалцсан хавтас, харилцагчид, хуанли зэргийг түгээсэн Kerio Connect серверүүдийн хооронд бүрэн синхрончлох

Мэдээжийн хэрэг, бид хуулбарласан хавтаснуудыг нийтлэх шаардлагагүй.

Хуваалцсан хавтас, харилцагчид, хуанли зэргийг түгээсэн Kerio Connect серверүүдийн хооронд бүрэн синхрончлох

Хуулбар хийсний дараа (мөн хуулбарлах онцгой зүйл байхгүй - фолдерууд хоосон байна) шуудангийн серверүүдийг ажиллуулж болно.

Дараа нь та шуудангийн серверүүдийн аль нэгийг мэдээллээр дүүргэж, өгөгдлийг зөв хуулбарласан эсэхийг шалгаж болно.

4. Суга таяг

Тусгалын тайлбар

Өгөгдлийг синхрончилж эхэлсний дараа (DFS) харж байгаачлан, хэрэв та эхний сервер дээр ямар нэгэн зүйл үүсгэсэн бол хоёр дахь сервер дээр юу ч харагдахгүй, эсвэл үргэлж байдаггүй.

Цөхрөл бүү зов, мэдээжийн хэрэг, энэ нь эрт орой хэзээ нэгэн цагт гарч ирэх болно, гэхдээ эрт орой хэзээ нэгэн цагт илүү дээр. Учир нь 6-12 цагийн дотор хэтэрхий оройтсон байна.

Хамгийн гол нь та эхний сервер дээр ямар нэгэн зүйл үүсгэсний дараа хоёр дахь болон дараагийн серверүүд дээр файл DFS системийн ачаар тэр даруй гарч ирэх болно, гэхдээ энэ имэйлийн лавлахыг өмнө нь хэн нэгэн уншсан бол. дахин хүсэлт гаргавал сервер #msgs фолдерыг дахин уншихгүй харин өөрийн индексээс өгөгдлийг гадагшлуулах бөгөөд энэ нь бидний бодит байдалтай нийцэхгүй байж магадгүй юм.

Керио нь индексийг дахин унших механизмтай боловч энэ нь ойролцоогоор зургаан цагийн дотор ажиллах боломжтой бөгөөд эдгээр 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

Скриптийн хуулбар нь шуудангийн сервер бүр дээр ажилладаг (үйлчилгээ болгон ашиглаж болно, админ эрх шаардлагагүй)

Скрипт нь файлыг уншдаг Setup%Computername%.List

Энд %Компьютерийн нэр% нь одоогийн серверийн нэр юм (Лавлах нь нэг дор бүх серверийн жагсаалтыг агуулж болно.)

%Компьютерийн нэр%.Жагсаалт файл нь синхрончлогдсон лавлахуудын бүрэн замыг агуулсан, зам бүр шинэ мөрөнд бичигдсэн бөгөөд хоосон мөр агуулаагүй байх ёстой.

Эхний ажиллуулсны дараа скрипт нь шаардлагатай эсэхээс үл хамааран индексжүүлэх процедурыг гүйцэтгэдэг бөгөөд скрипт нь синхрончлогдсон лавлах бүрт байгаа файлуудын тооны индексийг үүсгэдэг.

Скриптийн зорилго нь заасан сан дахь бүх файлыг тоолох явдал юм.

Лавлах бүрийг тоолж дууссаны дараа дор хаяж нэг директор доторх файлуудын одоогийн утга өмнөхтэй таарахгүй байвал скрипт нь синхрончлогдсон шуудангийн лавлахын үндсэн директороос файлуудыг устгана. index.fld, indexlog.fld, search.fld мөн хуваалцсан шуудангийн хавтаснуудыг индексжүүлэх процессыг эхлүүлнэ.

Даалгаврын гүйцэтгэлийн талаарх мэдээллийг LOG лавлах руу оруулна.

Индексжүүлэх үйл явц
Индексжүүлэх үйл явц нь Kerio API функцийг гүйцэтгэхэд хүргэдэг
Session = 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

сэтгэгдэл нэмэх