Paylanmış Kerio Connect serverləri arasında paylaşılan qovluqların, kontaktların, təqvimlərin tam sinxronizasiyası

Günortanız xeyir, Habr!

Tapşırıq

Təşkilatım Kerio Connect platformasında poçt serverindən istifadə edir; poçt serverləri istifadəçilərinə xidmət göstərmək üçün müxtəlif şəhərlərdə quraşdırılıb. Əvvəlcə paylanmış struktur yox idi, çünki domenlər saytın şəhərini göstərən üçüncü səviyyədə fərqlənir. Hər şey işlədi və hamı xoşbəxt idi. Bir gözəl gün, rəhbərlik bütün saytlar arasında bir vəzifə, ümumi fəaliyyət təqvimi təyin etdi!

Prehistorya

Əvvəlcə ideya Kerio Paylanmış Poçt Domenini qaldırmaq idi və o, hər şeyi özü edəcəkdi. Deyilənə görə, paylanmış domen yaradıldı, lakin belə deyildi, server eyni serverdə yerləşən domenlər arasında təqvimləri, qovluqları, kontaktları sinxronlaşdırmağa hazır idi, lakin bir neçə domen arasında məlumatları sinxronizasiya etmək niyyətində deyildi. serverlər.

Mən, əlbəttə ki, belə bir tutma gözləmirdim və uzun müddət mənə lazım olan funksionallığın əskik olduğuna inana bilmirdim. Sonradan bu faktın sənədli sübutlarını tapdım. Mən buna çox çaşdım və məyus oldum.

Tapşırıq asanlıqla problemə çevrildi.

Seçimlər nə idi?

  • Bəzi üçüncü tərəf proqram təminatı ilə lazımi məlumatları mübadiləsi edən müxtəlif serverlərdə iki müştəri yaradın. Bu funksiyanı həyata keçirəcək bu üçüncü tərəf proqram təminatını tapmaq lazım idi - mən belə dırmığı sevmirəm, amma görünürdü ki, bu, yeganə sürətli həlldir.
  • Serverlər arasında məlumat sinxronizasiyası üçün öz skriptinizi yazın. Fakt budur ki, Kerio hər bir obyekti ayrıca bir fayl kimi saxlayır, ona görə də fayllarla işləmək üçün bir skript hazırlamaq lazım idi, lakin kifayət qədər sayda mənbələri nəzərə alaraq, tapşırıq bir qədər mürəkkəb görünürdü, xüsusən də bir neçə dəfə yerinə yetirmək lazım olduğu üçün məlumatların düzgünlüyünü yoxlayır, əgər kimsə eyni vaxtda tapşırıq yaratsa və s. və s.

İrəliyə baxaraq deyim ki, Kerio obyekti ayrıca fayl kimi saxlasa da, hər dəfə obyektə daxil olanda fayl sisteminin necə olduğunu soruşmaq o qədər də axmaq deyil.

Çox vaxt düşünərək, "düşmən ərazisini ələ keçirmək" planları ilə bir dəstə kağız tərtib edərək, saat 6-da iki düzgün qərar verdim:

  • İlk qərar öz işinlə məşğul olmaq və kənardan heç nə axtarmamaqdır.
  • İkinci həll yolu yatmaqdır.

Artıq səhər bir neçə hərfə endirilən tək və həqiqi düşüncə ilə oyandım - DFS

qərar

Həll özü belə görünürdü

  • sinxronizasiyada iştirak edəcək bütün serverləri OS Windows-a gətirin. (Bunun bir hissəsi Linux-da idi. Poçt məlumatlarının başqa OS-yə köçürülməsi tələb olunurdu)
  • Sinxronizasiyada iştirak edəcək qovluqların strukturunu müəyyənləşdirin - onlar eyni olmalıdır.
  • Tək DFS sahəsi ilə bir domen altında bütün poçt serverlərini təyin edin.
  • Yuxarıda qeyd olunan paylanmış Kerio domenini yaradın, çünki mənim vəziyyətimdə verilənlərin sinxronizasiyası təkcə serverlər arasında deyil, həm də domenlər arasında tələb olunur; ikincisi Kerio serveri tərəfindən müstəqil şəkildə idarə oluna bilər. (birincidən fərqli olaraq)
  • Sinxronlaşdırılmış qovluqları DFS sahəsinə təyin edin.
  • Bir növ qoltuqağacı ilə gəlin (axı, qoltuqağacı olmadan yaşaya bilməzsiniz)

Tətbiq

İki poçt serverində nümunə (bəlkə daha çox)

1. Kerio Paylanmış domen

Paylanmış Kerio Connect serverləri arasında paylaşılan qovluqların, kontaktların, təqvimlərin tam sinxronizasiyası

Master sinxronizasiyada iştirak etmir, lakin bu, ilkin şərt deyil.

Mən Kerio paylanmış domeni necə qaldıracağımı təsvir etməyəcəyəm, bunda mürəkkəb bir şey yoxdur, rəsmi öyrənə bilərsiniz manul

Nəhayət, idarəetmə konsolunda aşağıdakı şəkli görməlisiniz:

Paylanmış Kerio Connect serverləri arasında paylaşılan qovluqların, kontaktların, təqvimlərin tam sinxronizasiyası

Paylanmış Kerio Connect serverləri arasında paylaşılan qovluqların, kontaktların, təqvimlərin tam sinxronizasiyası

Sonra mən paylaşılan qovluqlarla maraqlandım; Master serverdə aşağıdakı seçimləri təyin edə bilərsiniz:

Paylanmış Kerio Connect serverləri arasında paylaşılan qovluqların, kontaktların, təqvimlərin tam sinxronizasiyası

Paylanmış Kerio Connect serverləri arasında paylaşılan qovluqların, kontaktların, təqvimlərin tam sinxronizasiyası

Hər bir domen üçün xüsusi - server ictimai qovluqları domenlər arasında sinxronlaşdırmayacaq

Bütün domenlər üçün ümumi - bütün serverlər hər bir domendəki mövcud ictimai qovluqlardan imtina edəcək və hər bir poçt serverində bütün domenlər üçün yeni tək qovluqlar yaradacaq.

Diqqət! Bu seçim bütün serverlərdə konfiqurasiya siyasətini dəyişdirsə də, o, hər bir serverdən ayrıca sinxronizasiya edir (yəni vahid ümumi məkan olmadan)

Administrator hələ də istifadəçilər arasında girişi paylamaq imkanına malik olacaq.
mənim vəziyyətimdə onların hamısı mənimdir və mənə tam sinxronizasiya lazımdır (sizin vəziyyətinizdə həll yolu fərqli ola bilər) hər bir serverdə sinxronizasiya edilməli olan eyni domen dəstləri yaratmalısınız.

2. Kerio məlumat qovluqları

İndi siz serverlərin hər birində sinxronizasiya edilməli olan eyni paylaşılan qovluqlar yaratmalısınız. Qovluqlar, Təqvimlər, Kontaktlar.

Məsləhət - ingilis dilində kataloqlar yaradın, əgər siz onları latın dilində yaratsanız, kataloqun bəzi anlaşılmaz kodlaşdırmada adı olacaq, bu, ən azı əlverişsizdir.

İndi hər bir serverdə poçt qovluqlarının fiziki yollarını tapmalısınız.

Bütün domenlər üçün ümumi ~DataMailmail#publicСинхронизируемый каталог#msgs
Hər bir domen üçün xüsusi ~DataMailmail**Domain**#publicСинхронизируемый каталог#msgs

Nəzərə alın ki, biz bütün kataloqu deyil, yalnız konteyneri verilənlərlə sinxronlaşdıracağıq #msj — obyektlərin özləri burada saxlanılır, bütün digər məlumatlar hər bir server üçün ayrıca olmalıdır.

3.DFS

DFS-nin necə konfiqurasiya olunacağını ətraflı təsvir etməyəcəyəm, bu məsələ ilə bağlı kifayət qədər məlumat var.

DFS Windows Server-da müxtəlif serverlərdə yerləşən paylaşılan qovluqları birləşdirmək imkanı verən rol xidmətidir
MS DFS sənədinə keçid

DFS quraşdırmadan əvvəl, məlumatların sinxronizasiyasında iştirak edəcək bütün poçt serverlərini dayandırmalısınız.

Quraşdırma başa çatdıqdan sonra sinxronlaşdırılmış qovluqların hər biri üçün aşağıdakı şəkli almalısınız

Paylanmış Kerio Connect serverləri arasında paylaşılan qovluqların, kontaktların, təqvimlərin tam sinxronizasiyası

Təbii ki, təkrarlanan qovluqları dərc etməyə ehtiyacımız yoxdur.

Paylanmış Kerio Connect serverləri arasında paylaşılan qovluqların, kontaktların, təqvimlərin tam sinxronizasiyası

Replikasiya baş verdikdən sonra (və orada təkrarlamaq üçün xüsusi bir şey yoxdur - qovluqlar boşdur), poçt serverlərini işə salmaq olar.

Sonra, poçt serverlərindən birini məlumatlarla doldura və məlumatların düzgün şəkildə təkrarlandığını yoxlaya bilərsiniz.

4. Dəstək

Yansımanın təsviri

Məlumatların sinxronizasiyasına (DFS) başladıqdan sonra gördüyünüz kimi, əgər siz ya birinci serverdə nəsə yaratmısınızsa, ikinci serverdə birtəhər heç nə görünmür və ya görünür, lakin hər zaman deyil.

Ümidsiz olmayın, əlbəttə ki, gec-tez orada görünəcək, amma gec-tez daha yaxşıdır. Çünki 6-12 saat ərzində çox gecdir.

Məsələ burasındadır ki, siz birinci serverdə, ikinci və sonrakı serverlərdə bir şey yaratdıqdan sonra fayl, əlbəttə ki, DFS sistemi sayəsində dərhal görünəcək, lakin bu poçt kataloqu əvvəllər kimsə tərəfindən oxunmuşdur. və yenidən tələb olunduqda, server #msgs qovluğunu yenidən oxumayacaq, lakin öz indeksindən məlumatları çıxaracaq, bu artıq reallığımıza uyğun gəlməyəcək.

Kerio indeksi yenidən oxumaq üçün mexanizmə malikdir, lakin o, təxminən altı saat ərzində işləyə bilər və bu 6 saat ərzində təqvimdəki tapşırığın aktuallığı bir qədər itirilə bilər.
Sinxronizasiyanı indi yoxlamaq üçün siz poçt serverindəki qovluğa yenidən daxil olduqdan sonra müvafiq sinxronlaşdırılmış index.fld kataloqunda faylı silə bilərsiniz və bu fayl yoxdursa, Kerio kataloqu və məlumatları yenidən oxuyacaq. görünəcək. Görünür ki, bu həll yoludur, məlumat dəyişdikdə faylı silin, lakin bu, hər dəfə işləmir, ancaq ilk dəfədir, sonra Kerio nədənsə index.fld-ə bütün marağını itirir.
O, həm də istifadəçi üçün anlaşılmaz olan mesajları tüpürməyə başlayır - bir növ indeks haqqında və artıq orada nəsə edir.

Bir şey yaratmaq üçün başqa bir seçim var - yeni bir obyekt yaratarkən, server birdən təyin etmək istədiyi fayl adının artıq alındığını başa düşür, lakin qartopu və bu, çıxılmaz bir seçimdir.

Necə olmaq olar?

Artıq bizə tanış olan şəkilə bir daha diqqət yetirsək.

Paylanmış Kerio Connect serverləri arasında paylaşılan qovluqların, kontaktların, təqvimlərin tam sinxronizasiyası

Ancaq başqa bir təyyarədə indi ehtiyacımız olan çox maraqlı bir düyməni görə bilərsiniz - Reindex qovluqları

Və həqiqətən. Sinxronlaşdırılmış #msgs-də artıq nəyinsə dəyişdiyini bilməyən poçt serverində bu düyməni sıxsaq, sabit, sürətli nəticə əldə edəcəyik. Gizli olan hər şey aydın olacaq.

Jurnalda bu prosesin nə qədər davam etdiyini görə bilərsiniz; mənim vəziyyətimdə bir neçə min (15 min) qeydlə təxminən 3-4 dəqiqə çəkir.

Etməli olduğumuz şey, ehtiyac duyduğumuz zaman bu düyməni necə basacağımızı anlamaqdır.

Çıxır Kerio öz var API

Təsvir
Documentation

Tapşırığımızı yerinə yetirən funksiya belə görünür:
session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Yuxarıda göstərilənlərin hamısından, maraq doğuran qovluqların vəziyyətini izləyəcək və bir şey dəyişsə, bizə lazım olan funksiyanı yerinə yetirəcək bir skript yazmalıyıq.

Demək istəyirəm ki, müxtəlif yoxlamaları həyata keçirən bir neçə fərqli skript versiyasını yazdım və faylların sayına əsaslanaraq bütün nəticələri çıxaran birinə qərar verdim.

Skriptin icrası

CMD skript nümunəsi və təsviri

Yenidən indeks.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

Skriptin surəti hər bir poçt serverində işləyir (xidmət kimi istifadə edilə bilər, Adm hüquqları tələb olunmur)

Skript faylı oxuyur Setup%Computername%.List

Burada %Computername% cari serverin adıdır (Kataloq eyni anda bütün serverlərin siyahısını ehtiva edə bilər.)

Fayl %Computername%.List – sinxronlaşdırılmış kataloqların tam yollarını ehtiva edir, hər bir yol yeni sətirdə yazılır və boş sətirlərdən ibarət olmamalıdır.

İlk işə salındıqdan sonra skript lazım olub-olmamasından asılı olmayaraq indeksləşdirmə prosedurunu yerinə yetirir və skript eyni zamanda hər bir sinxronlaşdırılmış kataloqda faylların sayının indeksini yaradır.

Skriptin məqsədi göstərilən kataloqdakı bütün faylları saymaqdır.

Hər bir kataloqun hesablanmasının sonunda, ən azı bir qovluqda faylların cari dəyəri əvvəlki ilə uyğun gəlmirsə, skript sinxronlaşdırılmış poçt kataloqunun kök kataloqundan faylları silir: index.fld, indexlog.fld, search.fld və paylaşılan poçt qovluqlarının indeksləşdirilməsi prosesinə başlayır.

Tapşırığın icrası haqqında məlumat LOG kataloquna atılır.

İndeksləmə prosesi
İndeksləmə prosesi Kerio API funksiyasını yerinə yetirməyə başlayır
Sessiya = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Nümunə tətbiqi – python-da verilmişdir
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 onu olduğu kimi tərk edə bilərsiniz, lakin HTTPS tələb edirsinizsə, python Kerio sertifikatına etibar etməlidir.

Həmçinin faylda poçt serverinin bu funksiyasını yerinə yetirmək hüququ olan hesabı (Adm - ictimai poçt qovluqları) göstərməlisiniz.

Ümid edirəm ki, məqaləm Kerio Connect administratorları üçün faydalı olacaq.

Mənbə: www.habr.com

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