Dağıtılmış Kerio Connect sunucuları arasında paylaşılan klasörlerin, kişilerin ve takvimlerin tam senkronizasyonu

İyi günler Habr!

Görev

Kuruluşum Kerio Connect platformunda bir posta sunucusu kullanıyor; kullanıcılarına hizmet vermek için farklı şehirlerde posta sunucuları kuruluyor. Başlangıçta, alan adları sitenin şehrini gösterecek şekilde üçüncü düzeyde farklılık gösterdiğinden dağıtılmış bir yapı yoktu. Her şey yolunda gitti ve herkes mutluydu. Güzel bir gün, yönetim bir görev belirledi; tüm siteler arasında ortak bir etkinlik takvimi!

tarih öncesi

Başlangıçta fikir, Kerio Dağıtılmış Posta Alanını yükseltmekti ve her şeyi kendisi yapacaktı. Söylendiği gibi, dağıtılmış bir alan oluşturuldu, ancak durum böyle değildi; sunucu, aynı sunucuda bulunan alanlar arasında takvimleri, klasörleri ve kişileri senkronize etmeye hazırdı, ancak birkaç kişi arasındaki verileri hiç senkronize etmeyecekti. sunucular.

Elbette böyle bir yakalama beklemiyordum ve uzun süre ihtiyacım olan işlevselliğin eksik olduğuna inanamadım. Daha sonra bu gerçeğin belgesel kanıtını buldum. Bu duruma çok şaşırdım ve hayal kırıklığına uğradım.

Görev sorunsuz bir şekilde soruna dönüştü.

Seçenekler nelerdi?

  • Farklı sunucularda, bazı üçüncü taraf yazılımlarla gerekli verileri paylaşan iki istemci oluşturun. Bu işlevselliği uygulayacak bu üçüncü taraf yazılımı bulmak gerekiyordu - bu tür komisyonlardan hoşlanmıyorum, ancak tek hızlı çözüm bu gibi görünüyordu.
  • Sunucular arasında veri senkronizasyonu için kendi komut dosyanızı yazın. Gerçek şu ki, Kerio her nesneyi ayrı bir dosya olarak saklıyor, bu nedenle dosyalarla çalışmak için bir komut dosyası geliştirmek gerekliydi, ancak yeterli sayıda kaynak göz önüne alındığında, özellikle birden fazla işlemin gerçekleştirilmesi gerektiğinden görev biraz karmaşık görünüyordu. Birisinin aynı zaman diliminde görev oluşturması vb. durumunda verilerin doğruluğunu kontrol eder.

İleriye baktığımda şunu söyleyeceğim: Her ne kadar Kerio bir nesneyi ayrı bir dosya olarak saklasa da, nesneye her eriştiğinizde dosya sisteminin nasıl çalıştığını soracak kadar aptalca değil.

Düşünmek için çok zaman harcadım ve saat 6'da "düşman bölgesini ele geçirme" planlarını içeren bir sürü kağıt parçası hazırladım ve iki doğru karar verdim:

  • İlk karar kendi işini yapmak ve dışarıdan hiçbir şey aramamak.
  • İkinci çözüm ise uyumak.

Zaten sabah, birkaç harfe indirgenmiş tek ve gerçek bir düşünceyle uyandım - DFS

karar

Çözümün kendisi şuna benziyordu

  • Senkronizasyona katılacak tüm sunucuları OS Windows'a getirin. (Bunun bir kısmı Linux'taydı. Posta verilerinin başka bir işletim sistemine taşınması gerekiyordu)
  • Senkronizasyona katılacak dizinlerin yapısını belirleyin; bunların aynı olması gerekir.
  • Tek bir DFS alanı ile tüm posta sunucularını tek bir alan adı altında tanımlayın.
  • Yukarıda belirtilen dağıtılmış Kerio alanını oluşturun, çünkü benim durumumda veri senkronizasyonu sadece sunucular arasında değil aynı zamanda alanlar arasında da gereklidir; ikincisi Kerio sunucusu tarafından bağımsız olarak işlenebilir. (ilkinden farklı olarak)
  • Senkronize edilmiş dizinleri DFS alanına ayarlayın.
  • Bir tür koltuk değneği bulun (sonuçta koltuk değneği olmadan yaşayamazsınız)

uygulama

İki posta sunucusundaki örnek (belki daha fazla)

1. Kerio Dağıtılmış alan adı

Dağıtılmış Kerio Connect sunucuları arasında paylaşılan klasörlerin, kişilerin ve takvimlerin tam senkronizasyonu

Master senkronizasyona katılmaz ancak bu bir ön koşul değildir.

Kerio dağıtılmış alan adının nasıl yükseltileceğini açıklamayacağım, bunda karmaşık bir şey yok, resmi inceleyebilirsiniz manul

Sonuçta yönetim konsolunda aşağıdaki resmi görmelisiniz:

Dağıtılmış Kerio Connect sunucuları arasında paylaşılan klasörlerin, kişilerin ve takvimlerin tam senkronizasyonu

Dağıtılmış Kerio Connect sunucuları arasında paylaşılan klasörlerin, kişilerin ve takvimlerin tam senkronizasyonu

Daha sonra paylaşılan klasörlerle ilgilendim; Ana sunucuda aşağıdaki seçenekleri belirleyebilirsiniz:

Dağıtılmış Kerio Connect sunucuları arasında paylaşılan klasörlerin, kişilerin ve takvimlerin tam senkronizasyonu

Dağıtılmış Kerio Connect sunucuları arasında paylaşılan klasörlerin, kişilerin ve takvimlerin tam senkronizasyonu

Her alana özel - sunucu, etki alanları arasındaki ortak klasörleri senkronize etmeyecektir

Tüm alan adları için ortak - tüm sunucular, her etki alanındaki mevcut ortak klasörleri terk edecek ve her posta sunucusundaki tüm etki alanları için yeni tek klasörler oluşturacaktır.

Uyarı! Bu seçenek tüm sunuculardaki yapılandırma ilkesini değiştirse de, her sunucudan ayrı olarak (yani tek bir ortak alan olmadan) eşitleme yapar.

Yönetici hâlâ erişimi kullanıcılar arasında dağıtma olanağına sahip olacaktır.
benim durumumda hepsi benim ve tam senkronizasyona ihtiyacım var (Sizin durumunuzda çözüm farklı olabilir), her sunucuda senkronize edilmesi gereken aynı etki alanı kümeleri oluşturmanız gerekir.

2. Kerio veri dizinleri

Artık sunucuların her birinde senkronize edilmesi gereken aynı paylaşılan dizinleri oluşturmanız gerekiyor. Klasörler, Takvimler, Kişiler.

Tavsiye - İngilizce dizinler oluşturun, bunları Latince oluşturursanız, dizinin anlaşılmaz bir kodlamada bir adı olacaktır, bu en azından sakıncalıdır.

Artık her sunucudaki posta klasörlerinin fiziksel yollarını bulmanız gerekiyor.

Tüm alan adları için ortak ~DataMailmail#publicСинхронизируемый каталог#msgs
Her alana özel ~DataMailmail**Domain**#publicСинхронизируемый каталог#msgs

Lütfen dizinin tamamını senkronize etmeyeceğimizi, yalnızca veri içeren kapsayıcıyı senkronize edeceğimizi unutmayın. #mesajlar — nesnelerin kendisi burada saklanır; diğer tüm veriler her sunucu için ayrı olmalıdır.

3.DFS

DFS'nin nasıl yapılandırılacağını detaylı olarak anlatmayacağım, bu konuda yeterli bilgi var.

DFS, Windows Server'da farklı sunucularda bulunan paylaşılan klasörleri birleştirme olanağı sağlayan bir rol hizmetidir
MS DFS belgesine bağlantı

DFS'yi kurmadan önce veri senkronizasyonuna katılacak tüm posta sunucularını durdurmalısınız.

Kurulumun tamamlanmasının ardından senkronize edilen klasörlerin her biri için aşağıdaki görüntüyü almalısınız.

Dağıtılmış Kerio Connect sunucuları arasında paylaşılan klasörlerin, kişilerin ve takvimlerin tam senkronizasyonu

Doğal olarak çoğaltılmış klasörleri yayınlamamıza gerek yok.

Dağıtılmış Kerio Connect sunucuları arasında paylaşılan klasörlerin, kişilerin ve takvimlerin tam senkronizasyonu

Çoğaltma gerçekleştikten sonra (ve orada çoğaltılacak özel bir şey yoktur - klasörler boştur), posta sunucuları başlatılabilir.

Daha sonra posta sunucularından birini verilerle doldurabilir ve verilerin doğru şekilde kopyalandığını kontrol edebilirsiniz.

4. Koltuk değneği

Yansıma açıklaması

Veriler senkronize edilmeye (DFS) başladıktan sonra görebileceğiniz gibi, eğer birinci sunucuda bir şey oluşturduysanız, ikinci sunucuda bir şekilde hiçbir şey görünmüyor veya görünüyor ama bir şekilde her zaman olmuyor.

Umutsuzluğa kapılmayın; elbette er ya da geç orada görünecektir, ama er ya da geç olması daha iyidir. Çünkü 6 – 12 saat sonra çok geç.

Mesele şu ki, ilk sunucuda bir şey oluşturduğunuzda, ikinci ve sonraki sunucularda dosya elbette DFS sistemi sayesinde hemen görünecektir, ancak bu posta dizininin daha önce birisi tarafından okunmuş olması durumunda ve tekrar istendiğinde, sunucu #msgs klasörünü yeniden okumayacak ancak kendi dizinindeki verileri yayınlayacaktır; bu da artık bizim gerçekliğimizle örtüşmeyebilir.

Kerio'nun endeksi yeniden okumak için bir mekanizması var, ancak yaklaşık altı saat içinde çalışabilir ve bu 6 saat boyunca görevin takvimdeki alaka düzeyi bir miktar kaybolabilir.
Senkronizasyonu hemen test etmek için, e-posta sunucusundaki klasöre yeniden eriştikten sonra ilgili senkronize dizin index.fld'deki dosyayı silebilirsiniz ve bu dosya eksikse Kerio, dizini ve verileri yeniden okuyacaktır. görünecek. Çözüm bu gibi görünüyor, veriler değiştiğinde dosyayı silin, ancak bu her zaman işe yaramaz, yalnızca ilk seferde işe yarar, sonra Kerio bir nedenden dolayı index.fld'ye olan tüm ilgisini kaybeder.
Ayrıca, bir tür indeks hakkında ve orada zaten bir şeyler yaptığına dair kullanıcı için anlaşılmaz olan mesajlar vermeye başlar.

Bir şey yaratmak için başka bir seçenek daha var - yeni bir nesne oluşturma anında, sunucu aniden atamak istediği dosya adının zaten alındığını fark eder, ancak kartopu etkisi yaratır ve bu bir çıkmaz seçenektir.

Bu nasıl olabilir?

Zaten aşina olduğumuz resme bir kez daha dikkat edersek.

Dağıtılmış Kerio Connect sunucuları arasında paylaşılan klasörlerin, kişilerin ve takvimlerin tam senkronizasyonu

Ama başka bir düzlemde şu anda ihtiyacımız olan çok ilginç bir düğmeyi görebilirsiniz - Klasörleri yeniden dizinle

Ve gerçekten de. Senkronize edilen #msj'lerde bir şeylerin değiştiğini bilmeyen bir mail sunucusunda bu butona tıklarsak stabil, hızlı bir sonuç alırız. Saklanan her şey ortaya çıkacak.

Günlükte bu işlemin ne kadar sürdüğünü görebilirsiniz; benim durumumda birkaç bin (15 bin) kayıt varsa bu yaklaşık 3-4 dakika sürer.

Tek yapmamız gereken, ihtiyaç duyduğumuzda bu düğmeye nasıl basacağımızı bulmak.

Görünüşe göre Kerio kendi sahip API

Açıklama
Belgeleme

Görevimizi gerçekleştiren fonksiyon şuna benzer:
session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Yukarıdakilerin hepsinden, ilgilendiğimiz klasörlerin durumunu izleyecek ve bir şey değiştiyse ihtiyacımız olan işlevi gerçekleştirecek bir komut dosyası yazmamız gerekiyor.

Farklı kontroller gerçekleştiren komut dosyalarının birkaç farklı sürümünü yazdığımı ve dosya sayısına göre tüm sonuçları çıkaran sürüme karar verdiğimi söylemek istiyorum.

Komut dosyası uygulaması

CMD komut dosyası örneği ve açıklaması

Yeniden 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

Komut dosyasının bir kopyası her posta sunucusunda çalışır (hizmet olarak kullanılabilir, Yönetici hakları gerekli değildir)

Komut dosyası dosyayı okur Setup%Computername%.List

Burada %Bilgisayaradı% geçerli sunucunun adıdır (Dizin aynı anda tüm sunucuların listesini içerebilir.)

%Computername%.List dosyası – senkronize edilmiş dizinlerin tam yollarını içerir, her yol yeni bir satıra yazılır ve boş satırlar içermemelidir.

İlk başlatmanın ardından komut dosyası, gerekli olup olmadığına bakılmaksızın indeksleme prosedürünü gerçekleştirir ve komut dosyası ayrıca senkronize edilen her dizindeki dosya sayısının bir dizinini oluşturur.

Komut dosyasının amacı belirtilen dizindeki tüm dosyaları saymaktır.

Her dizini saymanın sonunda, eğer en az bir dizindeki dosyaların geçerli değeri öncekiyle eşleşmiyorsa, komut dosyası dosyaları senkronize edilmiş posta dizininin kök dizininden siler: index.fld, indexlog.fld, search.fld ve paylaşılan posta klasörlerinin indeksleme işlemini başlatır.

Görevin yürütülmesine ilişkin bilgiler LOG dizinine dökülür.

İndeksleme süreci
İndeksleme işlemi Kerio API fonksiyonunun yürütülmesine bağlıdır
Oturum = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Örnek bir uygulama – python'da verilmiştir.
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 olduğu gibi bırakabilirsiniz ancak HTTPS'ye ihtiyacınız varsa python'un Kerio sertifikasına güvenmesi gerekir.

Ayrıca dosyada, posta sunucusunun bu işlevini (Yönetici - genel posta klasörleri) gerçekleştirme haklarına sahip bir hesap belirtmeniz gerekir.

Umarım makalem Kerio Connect yöneticilerine faydalı olur.

Kaynak: habr.com

Yorum ekle