همگام سازی کامل پوشه های مشترک، مخاطبین، تقویم ها بین سرورهای Kerio Connect توزیع شده

ظهر بخیر، هابر!

کار

سازمان من از یک میل سرور در پلتفرم Kerio Connect استفاده می کند؛ سرورهای ایمیل در شهرهای مختلف برای ارائه خدمات به کاربران خود نصب می شوند. در ابتدا هیچ ساختار توزیع شده ای وجود نداشت، زیرا دامنه ها در سطح سوم متفاوت هستند که نشان دهنده شهر سایت است. همه چیز کار کرد و همه خوشحال بودند. یک روز خوب، مدیریت یک وظیفه تعیین کرد، یک تقویم مشترک از فعالیت ها بین همه سایت ها!

ماقبل تاریخ

در ابتدا، ایده این بود که دامنه ایمیل توزیع شده Kerio را افزایش دهد و همه کارها را خودش انجام دهد. خیلی زود، یک دامنه توزیع‌شده ایجاد شد، اما اینطور نبود، سرور آماده همگام‌سازی تقویم‌ها، پوشه‌ها، مخاطبین - بین دامنه‌های واقع در همان سرور بود، اما به هیچ وجه قرار نبود داده‌ها را بین چندین مورد همگام‌سازی کند. سرورها

البته من انتظار چنین گیرایی را نداشتم و برای مدت طولانی نمی توانستم باور کنم که عملکرد مورد نیاز من از دست رفته است. بعدها شواهد مستندی از این واقعیت پیدا کردم. من از این موضوع بسیار متحیر و ناامید شدم.

کار به آرامی به یک مشکل تبدیل شد.

گزینه ها چه بود؟

  • دو کلاینت در سرورهای مختلف ایجاد کنید که داده های لازم را با برخی از نرم افزارهای شخص ثالث مبادله می کنند. لازم بود این نرم افزار شخص ثالث را پیدا کنید که این قابلیت را اجرا کند - من چنین رنک را دوست ندارم، اما به نظر می رسید که این تنها راه حل سریع است.
  • اسکریپت خود را برای همگام سازی داده ها بین سرورها بنویسید. واقعیت این است که Kerio هر شی را به عنوان یک فایل جداگانه ذخیره می کند، بنابراین لازم بود یک اسکریپت برای کار با فایل ها ایجاد شود، اما با توجه به تعداد کافی منابع، کار تا حدودی پیچیده به نظر می رسید، به خصوص که لازم بود چندین مورد انجام شود. صحت داده ها را بررسی می کند، در صورتی که شخصی در همان بازه زمانی کار ایجاد کند و غیره و غیره.

با نگاهی به آینده، می‌گویم که اگرچه Kerio یک شی را به عنوان یک فایل جداگانه ذخیره می‌کند، اما آنقدر احمقانه نیست که هر بار که به شیء دسترسی پیدا می‌کنید بپرسید که سیستم فایل چگونه کار می‌کند.

پس از گذراندن زمان زیادی برای فکر کردن، کشیدن یک دسته کاغذ با برنامه های "تسخیر قلمرو دشمن"، در ساعت 6 دو تصمیم درست گرفتم:

  • اولین تصمیم این است که کار خودتان را انجام دهید و به دنبال چیزی از بیرون نباشید.
  • راه حل دوم خوابیدن است.

قبلاً صبح با یک فکر واحد و واقعی از خواب بیدار شدم که به چند حرف کاهش یافت - DFS

تصمیم

خود راه حل به این شکل بود

  • همه سرورهایی را که در همگام سازی شرکت می کنند به سیستم عامل ویندوز بیاورید. (بخشی از آن در لینوکس بود. انتقال داده های نامه به سیستم عامل دیگری لازم بود)
  • ساختار دایرکتوری هایی که در همگام سازی شرکت می کنند را تعیین کنید - آنها باید یکسان باشند.
  • همه سرورهای ایمیل را در یک دامنه با یک فضای DFS تعریف کنید.
  • دامنه Kerio توزیع‌شده فوق‌الذکر را ایجاد کنید، زیرا در مورد من همگام‌سازی داده‌ها نه تنها بین سرورها بلکه بین دامنه‌ها نیز لازم است؛ دومی می‌تواند توسط سرور Kerio به طور مستقل مدیریت شود. (بر خلاف اولی)
  • دایرکتوری های همگام شده را در فضای DFS تنظیم کنید.
  • با نوعی عصا بیایید (بالاخره، بدون عصا نمی توانید زندگی کنید)

اجرا

مثال در دو سرور ایمیل (شاید بیشتر)

1. Kerio Distributed domain

همگام سازی کامل پوشه های مشترک، مخاطبین، تقویم ها بین سرورهای Kerio Connect توزیع شده

استاد در هماهنگ سازی شرکت نمی کند، اما این یک پیش نیاز نیست.

من توضیح نمی دهم که چگونه می توان دامنه توزیع شده Kerio را افزایش داد، هیچ چیز پیچیده ای در مورد آن وجود ندارد، می توانید رسمی را مطالعه کنید دستکاری

در نهایت، باید تصویر زیر را در کنسول مدیریت ببینید:

همگام سازی کامل پوشه های مشترک، مخاطبین، تقویم ها بین سرورهای Kerio Connect توزیع شده

همگام سازی کامل پوشه های مشترک، مخاطبین، تقویم ها بین سرورهای Kerio Connect توزیع شده

بعد من به پوشه های مشترک علاقه مند شدم؛ در سرور Master می توانید گزینه های زیر را مشخص کنید:

همگام سازی کامل پوشه های مشترک، مخاطبین، تقویم ها بین سرورهای Kerio Connect توزیع شده

همگام سازی کامل پوشه های مشترک، مخاطبین، تقویم ها بین سرورهای Kerio Connect توزیع شده

مخصوص هر دامنه - سرور پوشه های عمومی را بین دامنه ها همگام نمی کند

مشترک برای همه دامنه ها - همه سرورها پوشه های عمومی موجود در هر دامنه را رها می کنند و پوشه های تک جدید را برای همه دامنه ها در هر سرور ایمیل ایجاد می کنند.

اخطار! اگرچه این گزینه سیاست پیکربندی را در همه سرورها تغییر می دهد، اما به طور جداگانه از هر سرور همگام می شود (یعنی بدون یک فضای مشترک واحد)

مدیر همچنان توانایی توزیع دسترسی بین کاربران را خواهد داشت.
در مورد من، همه آنها مال من هستند و من به همگام سازی کامل نیاز دارم (در مورد شما، راه حل ممکن است متفاوت باشد) در هر سرور باید مجموعه های یکسانی از دامنه ها ایجاد کنید که باید همگام شوند.

2. دایرکتوری های داده Kerio

اکنون باید دایرکتوری های مشترک یکسانی ایجاد کنید که باید روی هر یک از سرورها همگام شوند. پوشه ها، تقویم ها، مخاطبین.

مشاوره - دایرکتوری ها را به زبان انگلیسی ایجاد کنید، اگر آنها را به زبان لاتین ایجاد کنید، دایرکتوری نامی در کدگذاری نامفهوم خواهد داشت، این حداقل ناخوشایند است.

اکنون باید مسیرهای فیزیکی پوشه های ایمیل را در هر سرور پیدا کنید.

مشترک برای همه دامنه ها ~DataMailmail#publicСинхронизируемый каталог#msgs
مخصوص هر دامنه ~DataMailmail**Domain**#publicСинхронизируемый каталог#msgs

لطفاً توجه داشته باشید که ما کل دایرکتوری، بلکه فقط ظرف را با داده ها همگام نمی کنیم #پیام - خود اشیا در اینجا ذخیره می شوند، تمام داده های دیگر باید برای هر سرور جداگانه باشد.

3.DFS

من به طور دقیق نحوه پیکربندی DFS را توضیح نمی دهم، اطلاعات کافی در مورد این موضوع وجود دارد.

DFS یک سرویس نقش در ویندوز سرور است که امکان ترکیب پوشه های به اشتراک گذاشته شده در سرورهای مختلف را فراهم می کند
پیوند به سند MS DFS

قبل از راه‌اندازی DFS، باید همه سرورهای ایمیلی را که در همگام‌سازی داده‌ها شرکت می‌کنند، متوقف کنید.

پس از اتمام تنظیمات، باید تصویر زیر را برای هر یک از پوشه های همگام سازی شده دریافت کنید

همگام سازی کامل پوشه های مشترک، مخاطبین، تقویم ها بین سرورهای Kerio Connect توزیع شده

به طور طبیعی، ما نیازی به انتشار پوشه های تکراری نداریم.

همگام سازی کامل پوشه های مشترک، مخاطبین، تقویم ها بین سرورهای Kerio Connect توزیع شده

پس از تکرار (و هیچ چیز خاصی برای تکرار وجود ندارد - پوشه ها خالی هستند)، سرورهای ایمیل می توانند راه اندازی شوند.

در مرحله بعد، می توانید یکی از سرورهای ایمیل را با داده پر کنید و بررسی کنید که داده ها به درستی تکثیر شده اند.

4. عصا

شرح بازتاب

همانطور که می بینید پس از شروع همگام سازی داده ها (DFS)، اگر چیزی را در سرور اول ایجاد کرده باشید، به نوعی در سرور دوم چیزی ظاهر نمی شود، یا ظاهر می شود اما به نوعی نه همیشه.

ناامید نشوید، البته دیر یا زود در آنجا ظاهر می شود، اما زودتر از دیرتر بهتر است. زیرا 6 تا 12 ساعت دیگر خیلی دیر است.

نکته این است که به محض اینکه چیزی در سرور اول ایجاد کردید، در سرورهای دوم و بعدی، فایل به لطف سیستم DFS بلافاصله ظاهر می شود، اما در صورتی که این فهرست ایمیل قبلاً توسط شخصی خوانده شده باشد. و دوباره درخواست می‌شود، سرور پوشه #msgs را دوباره نمی‌خواند، بلکه داده‌ها را از فهرست خود بیرون می‌دهد، که ممکن است دیگر با واقعیت ما مطابقت نداشته باشد.

Kerio مکانیزمی برای بازخوانی شاخص دارد، اما می تواند در حدود شش ساعت کار کند و در طول این 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

جایی که %Computername% نام سرور فعلی است (دایرکتوری می‌تواند فهرستی از همه سرورها را به طور همزمان داشته باشد.)

فایل %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 نیاز دارید، پایتون باید به گواهی Kerio اعتماد کند.

همچنین در فایل باید یک حساب کاربری با حقوق برای انجام این عملکرد (Adm - پوشه‌های پست عمومی) سرور ایمیل مشخص کنید.

امیدوارم مقاله من برای مدیران Kerio Connect مفید باشد.

منبع: www.habr.com

اضافه کردن نظر