مزامنة كاملة للمجلدات المشتركة وجهات الاتصال والتقويمات بين خوادم Kerio Connect الموزعة

مساء الخير يا حبر!

مهمة

تستخدم مؤسستي خادم بريد على نظام Kerio Connect، ويتم تثبيت خوادم البريد في مدن مختلفة لخدمة مستخدميها. في البداية لم تكن هناك بنية موزعة، حيث تختلف المجالات في المستوى الثالث، مما يدل على مدينة الموقع. كل شيء على ما يرام وكان الجميع سعداء. في أحد الأيام، حددت الإدارة مهمة، وهي تقويم مشترك للأنشطة بين جميع المواقع!

قبل التاريخ

في البداية، كانت الفكرة هي رفع مجال البريد الموزع كيريو وسوف يفعل كل شيء بنفسه. لم يكد يقال ذلك، تم إنشاء مجال موزع، ولكن لم يكن الأمر كذلك، كان الخادم جاهزًا لمزامنة التقويمات والمجلدات وجهات الاتصال - بين المجالات الموجودة على نفس الخادم، ولكن لم يكن على الإطلاق مزامنة البيانات بين عدة مجالات الخوادم.

بالطبع، لم أتوقع مثل هذا المصيد ولم أصدق لفترة طويلة أن الوظيفة التي أحتاجها مفقودة. في وقت لاحق وجدت أدلة وثائقية على هذه الحقيقة. لقد كنت في حيرة كبيرة وخيبة أمل من هذا.

تحولت المهمة بسلاسة إلى مشكلة.

ما هي الخيارات؟

  • قم بإنشاء عميلين على خوادم مختلفة لتبادل البيانات الضرورية مع بعض برامج الطرف الثالث. كان من الضروري العثور على برنامج الطرف الثالث الذي من شأنه أن ينفذ هذه الوظيفة - أنا لا أحب مثل هذه أشعل النار، ولكن يبدو أن هذا كان الحل السريع الوحيد.
  • اكتب البرنامج النصي الخاص بك لمزامنة البيانات بين الخوادم. الحقيقة هي أن كيريو يقوم بتخزين كل كائن كملف منفصل، لذلك كان من الضروري تطوير برنامج نصي للعمل مع الملفات، ولكن بالنظر إلى العدد الكافي من المصادر، بدت المهمة معقدة إلى حد ما، خاصة أنه كان من الضروري إجراء عمليات متعددة التحقق من صحة البيانات، في حالة قيام شخص ما بإنشاء مهمة في نفس الفترة الزمنية، وما إلى ذلك، وما إلى ذلك.

بالنظر إلى المستقبل، سأقول أنه على الرغم من قيام Kerio بتخزين كائن كملف منفصل، فليس من الغباء أن نسأل كيف يعمل نظام الملفات في كل مرة تصل فيها إلى الكائن.

بعد أن أمضيت الكثير من الوقت في التفكير، ورسم مجموعة من الأوراق التي تحتوي على خطط "للاستيلاء على أراضي العدو"، اتخذت قرارين صحيحين في الساعة السادسة:

  • القرار الأول هو أن تفعل ما تريد ولا تبحث عن أي شيء من الخارج.
  • الحل الثاني هو الذهاب إلى النوم.

بالفعل في الصباح، استيقظت بفكرة واحدة وحقيقية، والتي تم اختصارها إلى بضعة أحرف - DFS

حل

بدا الحل نفسه هكذا

  • إحضار جميع الخوادم التي ستشارك في المزامنة مع نظام التشغيل Windows. (كان جزء منه على Linux. وكان ترحيل بيانات البريد إلى نظام تشغيل آخر مطلوبًا)
  • تحديد بنية الدلائل التي ستشارك في المزامنة - يجب أن تكون متطابقة.
  • تحديد جميع خوادم البريد ضمن مجال واحد بمساحة DFS واحدة.
  • قم بإنشاء مجال كيريو الموزع المذكور أعلاه، لأنه في حالتي تكون مزامنة البيانات مطلوبة، ليس فقط بين الخوادم ولكن أيضًا بين النطاقات؛ ويمكن التعامل مع النطاق الثاني بواسطة خادم كيريو بشكل مستقل. (على عكس الأول)
  • قم بتعيين الدلائل المتزامنة على مساحة DFS.
  • ابتكر نوعًا من العكاز (فبعد كل شيء، لا يمكنك العيش بدون عكاز)

تطبيق

مثال على خادمي بريد (وربما أكثر)

1. المجال الموزع كيريو

مزامنة كاملة للمجلدات المشتركة وجهات الاتصال والتقويمات بين خوادم Kerio Connect الموزعة

لا يشارك السيد في المزامنة، ولكن هذا ليس شرطا أساسيا.

لن أصف كيفية رفع مجال كيريو الموزع، لا يوجد شيء معقد في هذا الأمر، يمكنك دراسة المسؤول مانول

في النهاية، يجب أن تشاهد الصورة التالية في وحدة التحكم الإدارية:

مزامنة كاملة للمجلدات المشتركة وجهات الاتصال والتقويمات بين خوادم Kerio Connect الموزعة

مزامنة كاملة للمجلدات المشتركة وجهات الاتصال والتقويمات بين خوادم Kerio Connect الموزعة

بعد ذلك، كنت مهتمًا بالمجلدات المشتركة؛ على الخادم الرئيسي، يمكنك تحديد الخيارات التالية:

مزامنة كاملة للمجلدات المشتركة وجهات الاتصال والتقويمات بين خوادم Kerio Connect الموزعة

مزامنة كاملة للمجلدات المشتركة وجهات الاتصال والتقويمات بين خوادم Kerio Connect الموزعة

خاص بكل مجال - لن يقوم الخادم بمزامنة المجلدات العامة بين المجالات

مشترك لجميع المجالات - ستتخلى جميع الخوادم عن المجلدات العامة الموجودة في كل نطاق وستنشئ مجلدات فردية جديدة لجميع النطاقات على كل خادم بريد.

تحذير! على الرغم من أن هذا الخيار يغير سياسة التكوين على كافة الخوادم، إلا أنه تتم مزامنته بشكل منفصل عن كل خادم (أي بدون مساحة مشتركة واحدة)

سيظل لدى المسؤول القدرة على توزيع الوصول بين المستخدمين.
في حالتي، جميعها ملكي وأحتاج إلى مزامنة كاملة (في حالتك، قد يكون الحل مختلفًا) على كل خادم تحتاج إلى إنشاء مجموعات متطابقة من النطاقات التي تحتاج إلى المزامنة.

2. أدلة بيانات كيريو

أنت الآن بحاجة إلى إنشاء أدلة مشتركة متطابقة تحتاج إلى مزامنتها على كل خادم. المجلدات والتقويمات وجهات الاتصال.

نصيحة - قم بإنشاء أدلة باللغة الإنجليزية، إذا قمت بإنشائها باللغة اللاتينية، فسيكون للدليل اسم في بعض الترميز غير المفهوم، على الأقل غير مريح.

أنت الآن بحاجة إلى العثور على المسارات الفعلية لمجلدات البريد على كل خادم.

مشترك لجميع المجالات ~DataMailmail#publicСинхронизируемый каталог#msgs
خاص بكل مجال ~DataMailmail**Domain**#publicСинхронизируемый каталог#msgs

يرجى ملاحظة أننا لن نقوم بمزامنة الدليل بأكمله، ولكن فقط الحاوية التي تحتوي على البيانات #msgs - يتم تخزين الكائنات نفسها هنا، ويجب أن تكون جميع البيانات الأخرى منفصلة لكل خادم.

3.DFS

لن أصف بالتفصيل كيفية تكوين DFS، هناك معلومات كافية حول هذه المشكلة.

DFS هي خدمة دور في Windows Server توفر القدرة على دمج المجلدات المشتركة الموجودة على خوادم مختلفة
رابط إلى وثيقة MS DFS

قبل إعداد DFS، يجب عليك إيقاف كافة خوادم البريد التي ستشارك في مزامنة البيانات.

عند الانتهاء من الإعداد، يجب أن تتلقى الصورة التالية لكل مجلد من المجلدات المتزامنة

مزامنة كاملة للمجلدات المشتركة وجهات الاتصال والتقويمات بين خوادم Kerio Connect الموزعة

وبطبيعة الحال، لا نحتاج إلى نشر المجلدات المنسوخة.

مزامنة كاملة للمجلدات المشتركة وجهات الاتصال والتقويمات بين خوادم Kerio Connect الموزعة

بعد حدوث النسخ المتماثل (وليس هناك شيء خاص للنسخ المتماثل هناك - المجلدات فارغة)، يمكن بدء تشغيل خوادم البريد.

بعد ذلك، يمكنك ملء أحد خوادم البريد بالبيانات والتحقق من نسخ البيانات بشكل صحيح.

4. عكاز

وصف الانعكاس

كما ترون بعد بدء مزامنة البيانات (DFS)، إذا قمت بإنشاء شيء ما على الخادم الأول، فلن يظهر شيء على الخادم الثاني بطريقة أو بأخرى، أو يظهر ولكن بطريقة ما ليس دائمًا.

لا تيأس؛ بالطبع، سوف يظهر هناك عاجلاً أم آجلاً، ولكن عاجلاً وليس آجلاً أفضل. لأنه فات الأوان خلال 6 - 12 ساعة.

الشيء هو أنه بمجرد إنشاء شيء ما على الخادم الأول، سيظهر الملف على الخادم الثاني والخوادم اللاحقة بالطبع على الفور بفضل نظام DFS، ولكن في حالة قراءة دليل البريد هذا بالفعل بواسطة شخص ما من قبل وطلب مرة أخرى، لن يقوم الخادم بإعادة قراءة مجلد #msgs ولكنه سيخرج البيانات من فهرسه الخاص، والذي قد لا يتوافق مع واقعنا.

لدى كيريو آلية لإعادة قراءة الفهرس، ولكنها يمكن أن تعمل في حوالي ست ساعات، وخلال هذه الساعات الست قد تفقد أهمية المهمة في التقويم إلى حد ما.
من أجل اختبار المزامنة الآن، يمكنك حذف الملف الموجود في الدليل المتزامن المقابل Index.fld، بعد إعادة الوصول إلى المجلد الموجود على خادم البريد وإذا كان هذا الملف مفقودًا، فسيقوم كيريو بإعادة قراءة الدليل والبيانات سيظهر. يبدو أن هذا هو الحل، قم بحذف الملف عندما تتغير البيانات، ولكن هذا لا يعمل في كل مرة، ولكن في المرة الأولى فقط، ثم يفقد كيريو لسبب ما كل الاهتمام بملف Index.fld
ويبدأ أيضًا في إرسال رسائل غير مفهومة للمستخدم - حول نوع ما من الفهرس وأنه يفعل شيئًا ما هناك بالفعل.

هناك خيار آخر لإنشاء شيء ما - في لحظة إنشاء كائن جديد، يدرك الخادم فجأة أن اسم الملف الذي يريد تعيينه مأخوذ بالفعل، لكنه يتزايد وهذا خيار مسدود.

كيف يمكن أن يكون؟

إذا انتبهنا مرة أخرى إلى الصورة المألوفة لنا بالفعل.

مزامنة كاملة للمجلدات المشتركة وجهات الاتصال والتقويمات بين خوادم Kerio Connect الموزعة

لكن على مستوى آخر، يمكنك رؤية زر مثير جدًا نحتاجه الآن - إعادة فهرسة المجلدات

وحقيقة. إذا نقرنا على هذا الزر الموجود على خادم بريد لا يعلم أن شيئًا ما قد تغير بالفعل في #الرسائل المتزامنة، فسنحصل على نتيجة مستقرة وسريعة. كل شيء مخفي سوف يصبح واضحا.

في السجل، يمكنك معرفة المدة التي تستغرقها هذه العملية؛ في حالتي مع عدة آلاف (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

يتم تشغيل نسخة من البرنامج النصي على كل خادم بريد (يمكن استخدامه كخدمة، حقوق Adm غير مطلوبة)

يقرأ البرنامج النصي الملف Setup%Computername%.List

حيث %Computername% هو اسم الخادم الحالي (يمكن أن يحتوي الدليل على قوائم بجميع الخوادم في وقت واحد.)

يحتوي الملف %Computername%.List – على المسارات الكاملة للأدلة المتزامنة، ويتم كتابة كل مسار على سطر جديد، ويجب ألا يحتوي على أسطر فارغة.

بعد الإطلاق الأول، يقوم البرنامج النصي بإجراء الفهرسة، بغض النظر عما إذا كان ذلك ضروريًا أم لا، ويقوم البرنامج النصي أيضًا بإنشاء فهرس لعدد الملفات في كل دليل متزامن.

الغرض من البرنامج النصي هو حساب جميع الملفات الموجودة في الدليل المحدد.

في نهاية حساب كل دليل، إذا كانت القيمة الحالية للملفات في دليل واحد على الأقل لا تتطابق مع القيمة السابقة، فسيقوم البرنامج النصي بحذف الملفات من الدليل الجذر لدليل البريد المتزامن: index.fld, indexlog.fld, search.fld ويبدأ عملية فهرسة مجلدات البريد المشتركة.

يتم تفريغ المعلومات حول تنفيذ المهمة في دليل السجل.

عملية الفهرسة
تتلخص عملية الفهرسة في تنفيذ وظيفة Kerio API
الجلسة = callMethod("Domains.checkPublicFoldersIntegrity"،{}، الرمز المميز)

ويرد مثال على التنفيذ في - بيثون
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

إضافة تعليق