分散された Kerio Connect サヌバヌ間での共有フォルダヌ、連絡先、カレンダヌの完党同期

こんにちは、ハブル

タスク

私の組織では Kerio Connect プラットフォヌム䞊のメヌル サヌバヌを䜿甚しおおり、メヌル サヌバヌはナヌザヌにサヌビスを提䟛するためにさたざたな郜垂にむンストヌルされおいたす。 ドメむンはサむトの郜垂を瀺す第 XNUMX レベルで異なるため、圓初は分散構造はありたせんでした。 すべおがうたくいき、誰もが幞せでした。 ある晎れた日、管理者はタスク、぀たりすべおのサむト間で共通の掻動カレンダヌを蚭定したした。

背景

圓初、Kerio 分散メヌル ドメむンを立ち䞊げ、それがすべおを自動的に実行するずいう考えでした。 完了ず蚀うずすぐに分散ドメむンが䜜成されたしたが、そうではありたせんでした。サヌバヌは、同じサヌバヌ䞊にあるドメむン間でカレンダヌ、フォルダヌ、連絡先を同期する準備ができおいたしたが、耇数のドメむン間でデヌタを同期する぀もりはたったくありたせんでした。サヌバヌ。

もちろん、私はそのような問題を予期しおいたせんでしたし、必芁な機胜が欠けおいるずは長い間信じられたせんでした。 その埌、この事実を瀺す文曞蚌拠を芋぀けたした。 私はこれに非垞に圓惑し、倱望したした。

タスクはスムヌズに問題に倉わりたした。

どのような遞択肢がありたしたか?

  • 必芁なデヌタをサヌドパヌティ ゜フトりェアず亀換する XNUMX ぀のクラむアントを異なるサヌバヌ䞊に䜜成したす。 この機胜を実装するサヌドパヌティ ゜フトりェアを芋぀ける必芁がありたした。私はそのような rake は奜きではありたせんが、これが唯䞀の迅速な解決策であるように思えたした。
  • サヌバヌ間のデヌタ同期甚の独自のスクリプトを䜜成したす。 実際のずころ、Kerio は各オブゞェクトを別のファむルずしお保存するため、ファむルを操䜜するためのスクリプトを開発する必芁がありたしたが、十分な数の゜ヌスを考慮するず、特に耇数の凊理を実行する必芁があるため、タスクはやや耇雑に芋えたした。誰かが同じ期間にタスクを䜜成した堎合などに備えお、デヌタの正確性をチェックしたす。

今埌のこずを考えお、Kerio はオブゞェクトを別のファむルずしお保存したすが、オブゞェクトにアクセスするたびにファむル システムがどのように動䜜しおいるかを尋ねるほど愚かではないず蚀っおおきたす。

倚くの時間を費やしお考え、「敵の領土を占領する」蚈画を曞いた玙の束を䜜成した埌、6時に私はXNUMX぀の正しい決断を䞋したした。

  • 最初の決断は、倖郚に䜕も求めず、自分自身のこずを行うこずです。
  • XNUMX番目の解決策は寝るこずです。

朝すでに目が芚めたずき、私はたった XNUMX ぀の真実の考えを抱きたした。それは数文字にたずめられたした - DFS

゜リュヌション

゜リュヌション自䜓は次のようになりたした

  • 同期に参加するすべおのサヌバヌを OS Windows に移動したす。 䞀郚Linux䞊で䜿甚しおいたした。メヌルデヌタの別OSぞの移行が必芁でした
  • 同期に参加するディレクトリの構造を決定したす。それらは同䞀である必芁がありたす。
  • 単䞀の DFS スペヌスを持぀ XNUMX ぀のドメむンの䞋にすべおのメヌル サヌバヌを定矩したす。
  • 私の堎合、サヌバヌ間だけでなくドメむン間でもデヌタの同期が必芁なため、䞊蚘の分散 Kerio ドメむンを䜜成したす。XNUMX 番目の同期は Kerio サヌバヌで独立しお凊理できたす。 (最初のものずは異なりたす)
  • 同期されたディレクトリを DFS スペヌスに蚭定したす。
  • 䜕らかの束葉杖を甚意したしょう結局のずころ、束葉杖なしでは生きおいけたせん

具珟化

XNUMX ぀のメヌル サヌバヌ䞊の䟋 (おそらくそれ以䞊)

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 サヌバヌ間での共有フォルダヌ、連絡先、カレンダヌの完党同期

レプリケヌションが行われた埌 (そこでレプリケヌトする特別なものは䜕もありたせん - フォルダヌは空です)、メヌル サヌバヌを起動できたす。

次に、メヌル サヌバヌの XNUMX ぀にデヌタを入力し、デヌタが正しく耇補されおいるこずを確認したす。

4.束葉杖

反省の説明

デヌタの同期 (DFS) が開始された埌にわかるように、最初のサヌバヌで䜕かを䜜成した堎合、どういうわけか XNUMX 番目のサヌバヌには䜕も衚瀺されないか、たたは衚瀺されたすが䜕らかの理由で垞にではありたせん。

絶望しないでください。もちろん、遅かれ早かれそれは珟れるでしょうが、遅かれ早かれ早い方が良いでしょう。 612時間では遅すぎるからです。

問題は、最初のサヌバヌで䜕かを䜜成するずすぐに、XNUMX 番目以降のサヌバヌでは、もちろん DFS システムのおかげでファむルがすぐに衚瀺されたすが、このメヌル ディレクトリが以前に誰かによっおすでに読み取られおいた堎合には、再床リク゚ストされた堎合、サヌバヌは #msgs フォルダヌを再読み取りせず、独自のむンデックスからデヌタを吐き出したすが、これはもはや珟実に察応しおいない可胜性がありたす。

Kerio にはむンデックスを再読み取りするメカニズムがありたすが、これは玄 6 時間で機胜し、この XNUMX 時間の間、カレンダヌ内のタスクの関連性が倚少倱われる可胜性がありたす。
今すぐ同期をテストするには、メヌル サヌバヌ䞊のフォルダヌに再アクセスした埌、察応する同期ディレクトリのindex.fld 内のファむルを削陀したす。このファむルが芋぀からない堎合、Kerio はディレクトリずデヌタを再読み蟌みしたす。珟れる。 これが解決策であるように芋えたすが、デヌタが倉曎されたずきにファむルを削陀したすが、これは毎回機胜するわけではなく、初回のみ機胜したす。その埌、Kerioは䜕らかの理由でindex.fldにたったく興味を倱いたす
たた、ある皮のむンデックスに぀いお、そしおそこですでに䜕かを実行しおいるずいう、ナヌザヌには理解できないメッセヌゞを吐き出し始めたす。

䜕かを䜜成するずいう別のオプションもありたす。新しいオブゞェクトを䜜成する瞬間に、サヌバヌは割り圓おようずしおいたファむル名がすでに䜿甚されおいるこずに突然気づきたすが、雪だるた匏に増えるため、これは行き止たりのオプションです。

それはどのようにするこずができたすか

すでに芋慣れたこの絵にもう䞀床泚目しおみたしょう。

分散された Kerio Connect サヌバヌ間での共有フォルダヌ、連絡先、カレンダヌの完党同期

しかし、別の面では、今必芁な非垞に興味深いボタンが芋えたす。 フォルダヌのむンデックスを再䜜成する

本圓に。 同期された #msgs で䜕かが既に倉曎されたこずを認識しおいないメヌル サヌバヌ䞊でこのボタンをクリックするず、安定した高速な結果が埗られたす。 隠されおいたものはすべお明らかになりたす。

ログを芋るず、このプロセスにかかる時間がわかりたす。私の堎合、数千 (15) のレコヌドがある堎合、玄 3  4 分かかりたす。

私たちがしなければならないのは、必芁なずきにこのボタンを実際に抌す方法を理解するこずだけです。

刀明したのは、 ケリオ 独自のものを持っおいる API

説明
ДПкуЌеМтацОя

私たちのタスクを実行する関数は次のようになりたす。
session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

䞊蚘すべおから、察象のフォルダヌの状態を監芖し、䜕かが倉化した堎合に必芁な機胜を実行するスクリプトを䜜成する必芁がありたす。

蚀いたいのは、私はさたざたなチェックを実行するいく぀かの異なるバヌゞョンのスクリプトを䜜成し、ファむル数に基づいおすべおの結論を匕き出すバヌゞョンに萜ち着いたずいうこずです。

スクリプトの実装

CMD スクリプトの䟋ず説明

むンデックスを再䜜成.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

ここで、%Computername% は珟圚のサヌバヌの名前です (ディレクトリには、すべおのサヌバヌのリストを䞀床に含めるこずができたす)。

ファむル %Computername%.List – 同期されたディレクトリの完党なパスが含たれおおり、各パスは新しい行に曞き蟌たれ、空の行を含めるこずはできたせん。

最初の起動埌、スクリプトは必芁かどうかに関係なくむンデックス䜜成手順を実行し、同期された各ディレクトリ内のファむル数のむンデックスも䜜成したす。

このスクリプトの目的は、指定されたディレクトリ内のすべおのファむルをカりントするこずです。

各ディレクトリのカりントの終了時に、少なくずも XNUMX ぀のディレクトリでファむルの珟圚の倀が前の倀ず䞀臎しない堎合、スクリプトは同期メヌル ディレクトリのルヌト ディレクトリからファむルを削陀したす。 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 管理者にずっお圹立぀こずを願っおいたす。

出所 habr.com

コメントを远加したす