Penyegerakan penuh folder kongsi, kenalan, kalendar antara pelayan Kerio Connect yang diedarkan

Selamat petang, Habr!

Petugas

Organisasi saya menggunakan pelayan mel pada platform Kerio Connect; pelayan mel dipasang di bandar yang berbeza untuk melayani pengguna mereka. Pada mulanya tiada struktur teragih, kerana domain berbeza pada tahap ketiga, menunjukkan bandar tapak. Semuanya berfungsi dan semua orang gembira. Satu hari yang baik, pihak pengurusan menetapkan tugas, kalendar umum aktiviti antara semua tapak!

prasejarah

Pada mulanya, ideanya adalah untuk menaikkan Domain Mel Teragih Kerio dan ia akan melakukan segala-galanya sendiri. Tidak lama kemudian, domain teragih telah dibuat, tetapi itu tidak berlaku, pelayan bersedia untuk menyegerakkan kalendar, folder, kenalan - antara domain yang terletak pada pelayan yang sama, tetapi tidak sama sekali akan menyegerakkan data antara beberapa pelayan.

Saya, tentu saja, tidak menjangkakan tangkapan sedemikian dan untuk masa yang lama tidak percaya bahawa fungsi yang saya perlukan hilang. Kemudian saya menemui bukti dokumentari fakta ini. Saya sangat hairan dan kecewa dengan ini.

Tugas dengan lancar bertukar menjadi masalah.

Apakah pilihannya?

  • Buat dua pelanggan pada pelayan berbeza yang menukar data yang diperlukan dengan beberapa perisian pihak ketiga. Ia adalah perlu untuk mencari perisian pihak ketiga yang akan melaksanakan fungsi ini - Saya tidak suka menyapu seperti itu, tetapi nampaknya ini adalah satu-satunya penyelesaian pantas.
  • Tulis skrip anda sendiri untuk penyegerakan data antara pelayan. Hakikatnya ialah Kerio menyimpan setiap objek sebagai fail yang berasingan, jadi ia adalah perlu untuk membangunkan skrip untuk bekerja dengan fail, tetapi memandangkan bilangan sumber yang mencukupi, tugas itu kelihatan agak rumit, terutamanya kerana ia perlu melakukan pelbagai menyemak ketepatan data, sekiranya seseorang membuat tugasan dalam tempoh masa yang sama, dsb., dsb.

Melihat ke hadapan, saya akan mengatakan bahawa walaupun Kerio menyimpan objek sebagai fail yang berasingan, ia tidak begitu bodoh untuk bertanya bagaimana sistem fail berfungsi setiap kali anda mengakses objek tersebut.

Setelah menghabiskan banyak masa berfikir, merangka sekumpulan kertas dengan rancangan "untuk merebut wilayah musuh," pada pukul 6 saya membuat dua keputusan yang tepat:

  • Keputusan pertama adalah untuk melakukan perkara anda sendiri dan tidak mencari apa-apa dari luar.
  • Penyelesaian kedua ialah tidur.

Sudah pada waktu pagi saya bangun dengan satu pemikiran tunggal dan benar, yang dikurangkan kepada beberapa huruf - DFS

keputusan

Penyelesaian itu sendiri kelihatan seperti ini

  • bawa semua pelayan yang akan mengambil bahagian dalam penyegerakan ke OS Windows. (Sebahagian daripadanya adalah pada Linux. Penghijrahan data mel ke OS lain diperlukan)
  • Tentukan struktur direktori yang akan mengambil bahagian dalam penyegerakan - mereka mestilah sama.
  • Tentukan semua pelayan mel di bawah satu domain dengan satu ruang DFS.
  • Cipta domain Kerio teragih yang disebutkan di atas, kerana dalam kes saya penyegerakan data diperlukan, bukan sahaja antara pelayan tetapi juga antara domain; yang kedua boleh dikendalikan oleh pelayan Kerio secara bebas. (tidak seperti yang pertama)
  • Tetapkan direktori disegerakkan kepada ruang DFS.
  • Datang dengan sejenis tongkat (lagipun, anda tidak boleh hidup tanpa tongkat)

РСализация

Contoh pada dua pelayan mel (mungkin lebih)

1. Domain Teragih Kerio

Penyegerakan penuh folder kongsi, kenalan, kalendar antara pelayan Kerio Connect yang diedarkan

Master tidak mengambil bahagian dalam penyegerakan, tetapi ini bukan prasyarat.

Saya tidak akan menerangkan cara menaikkan domain teragih Kerio, tidak ada yang rumit mengenainya, anda boleh mengkaji rasmi manul

Akhirnya, anda harus melihat imej berikut dalam konsol pentadbiran:

Penyegerakan penuh folder kongsi, kenalan, kalendar antara pelayan Kerio Connect yang diedarkan

Penyegerakan penuh folder kongsi, kenalan, kalendar antara pelayan Kerio Connect yang diedarkan

Seterusnya saya berminat dengan folder kongsi; pada pelayan Master anda boleh menentukan pilihan berikut:

Penyegerakan penuh folder kongsi, kenalan, kalendar antara pelayan Kerio Connect yang diedarkan

Penyegerakan penuh folder kongsi, kenalan, kalendar antara pelayan Kerio Connect yang diedarkan

Khusus untuk setiap domain - pelayan tidak akan menyegerakkan folder awam antara domain

Biasa kepada semua domain - semua pelayan akan meninggalkan folder awam sedia ada dalam setiap domain dan mencipta folder tunggal baharu untuk semua domain pada setiap pelayan mel.

Amaran! Walaupun pilihan ini mengubah dasar konfigurasi pada semua pelayan, ia menyegerak secara berasingan daripada setiap pelayan (iaitu, tanpa satu ruang biasa)

Pentadbir masih mempunyai keupayaan untuk mengedarkan akses antara pengguna.
dalam kes saya, semuanya milik saya dan saya memerlukan penyegerakan penuh (Dalam kes anda, penyelesaiannya mungkin berbeza) pada setiap pelayan anda perlu mencipta set domain yang sama yang perlu disegerakkan.

2. Direktori data Kerio

Kini anda perlu mencipta direktori kongsi yang sama yang perlu disegerakkan pada setiap pelayan. Folder, Kalendar, Kenalan.

Nasihat - buat direktori dalam bahasa Inggeris, jika anda menciptanya dalam bahasa Latin, direktori itu akan mempunyai nama dalam beberapa pengekodan yang tidak dapat difahami, ini sekurang-kurangnya menyusahkan.

Kini anda perlu mencari laluan fizikal folder mel pada setiap pelayan.

Biasa kepada semua domain ~DataMailmail#publicΠ‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³#msgs
Khusus untuk setiap domain ~DataMailmail**Domain**#publicΠ‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³#msgs

Sila ambil perhatian bahawa kami tidak akan menyegerakkan keseluruhan direktori, tetapi hanya bekas dengan data #msgs β€” objek itu sendiri disimpan di sini, semua data lain mesti berasingan untuk setiap pelayan.

3.DFS

Saya juga tidak akan menerangkan secara terperinci cara mengkonfigurasi DFS, terdapat maklumat yang mencukupi mengenai isu ini.

DFS ialah perkhidmatan peranan dalam Windows Server yang menyediakan keupayaan untuk menggabungkan folder kongsi yang terletak pada pelayan berbeza
Pautan ke dokumen MS DFS

Sebelum menyediakan DFS, anda mesti menghentikan semua pelayan mel yang akan mengambil bahagian dalam penyegerakan data.

Setelah selesai persediaan, anda harus menerima imej berikut untuk setiap folder yang disegerakkan

Penyegerakan penuh folder kongsi, kenalan, kalendar antara pelayan Kerio Connect yang diedarkan

Sememangnya, kami tidak perlu menerbitkan folder yang direplikasi.

Penyegerakan penuh folder kongsi, kenalan, kalendar antara pelayan Kerio Connect yang diedarkan

Selepas replikasi berlaku (dan tiada apa-apa yang istimewa untuk ditiru di sana - folder kosong), pelayan mel boleh dimulakan.

Seterusnya, anda boleh mengisi salah satu pelayan mel dengan data dan menyemak sama ada data itu direplikasi dengan betul.

4. Tongkat

Penerangan refleksi

Seperti yang anda boleh lihat selepas data mula disegerakkan (DFS), jika anda sama ada mencipta sesuatu pada pelayan pertama, entah bagaimana tiada apa yang muncul pada pelayan kedua, atau ia muncul tetapi entah bagaimana tidak selalu.

Jangan putus asa; sudah tentu, ia akan muncul di sana lambat laun, tetapi lebih baik lebih awal daripada kemudian. Kerana ia terlalu lewat dalam 6 - 12 jam.

Masalahnya ialah sebaik sahaja anda telah mencipta sesuatu pada pelayan pertama, pada pelayan kedua dan seterusnya, fail itu akan segera muncul terima kasih kepada sistem DFS, tetapi sekiranya direktori mel ini telah dibaca oleh seseorang sebelum ini. dan diminta sekali lagi, pelayan tidak akan membaca semula folder #msgs tetapi akan mengeluarkan data daripada indeksnya sendiri, yang mungkin tidak lagi sesuai dengan realiti kami.

Kerio mempunyai mekanisme untuk membaca semula indeks, tetapi ia boleh berfungsi dalam kira-kira enam jam, dan selama 6 jam ini kaitan tugas dalam kalendar mungkin agak hilang.
Untuk menguji penyegerakan sekarang, anda boleh memadamkan fail dalam direktori disegerakkan yang sepadan index.fld, selepas mengakses semula folder pada pelayan mel dan jika fail ini tiada, Kerio akan membaca semula direktori dan data akan muncul. Nampaknya ini adalah penyelesaiannya, padam fail apabila data berubah, tetapi ini tidak berfungsi setiap kali, tetapi hanya kali pertama, maka Kerio atas sebab tertentu kehilangan semua minat dalam index.fld
Ia juga mula mengeluarkan mesej yang tidak dapat difahami oleh pengguna - tentang beberapa jenis indeks dan bahawa ia sudah melakukan sesuatu di sana.

Terdapat satu lagi pilihan, untuk mencipta sesuatu - pada masa mencipta objek baru, pelayan tiba-tiba menyedari bahawa nama fail yang ingin diberikannya sudah diambil, tetapi ia menjadi bola salji dan ini adalah pilihan buntu.

Bagaimana yang boleh?

Jika kita perhatikan sekali lagi pada gambar yang sudah biasa kita lihat.

Penyegerakan penuh folder kongsi, kenalan, kalendar antara pelayan Kerio Connect yang diedarkan

Tetapi pada pesawat lain, anda boleh melihat butang yang sangat menarik yang kami perlukan sekarang - Indeks semula folder

Dan sesungguhnya. Jika kita mengklik butang ini pada pelayan mel yang tidak mengetahui bahawa sesuatu telah berubah dalam #msgs yang disegerakkan, kita akan mendapat hasil yang stabil dan pantas. Semua yang tersembunyi akan menjadi jelas.

Dalam log anda boleh melihat berapa lama proses ini mengambil masa; dalam kes saya dengan beberapa ribu (15 ribu) rekod, ia mengambil masa kira-kira 3-4 minit.

Apa yang perlu kita lakukan ialah memikirkan cara untuk menekan butang ini apabila kita memerlukannya.

Kesudahannya Kerio mempunyai sendiri API

ОписаниС
Dokumentasi

Fungsi yang melaksanakan tugas kami kelihatan seperti ini:
session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Daripada semua perkara di atas, kita perlu menulis skrip yang akan memantau keadaan folder yang diminati dan, jika sesuatu telah berubah, laksanakan fungsi yang kita perlukan.

Saya ingin mengatakan bahawa saya menulis beberapa versi skrip berbeza yang melakukan semakan berbeza, dan menyelesaikan satu yang membuat semua kesimpulan berdasarkan bilangan fail.

Pelaksanaan skrip

Contoh dan penerangan skrip 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

Salinan skrip berjalan pada setiap pelayan mel (boleh digunakan sebagai perkhidmatan, hak Adm tidak diperlukan)

Skrip membaca fail Setup%Computername%.List

Di mana %Computername% ialah nama pelayan semasa (Direktori boleh mengandungi senarai semua pelayan sekaligus.)

Fail %Computername%.List – mengandungi laluan penuh direktori yang disegerakkan, setiap laluan ditulis pada baris baharu dan tidak seharusnya mengandungi baris kosong.

Selepas pelancaran pertama, skrip melaksanakan prosedur pengindeksan, tidak kira sama ada perlu atau tidak, dan skrip juga mencipta indeks bilangan fail dalam setiap direktori yang disegerakkan.

Tujuan skrip adalah untuk mengira semua fail dalam direktori yang ditentukan.

Pada akhir mengira setiap direktori, jika dalam sekurang-kurangnya satu direktori nilai semasa fail tidak sepadan dengan yang sebelumnya, skrip memadamkan fail daripada direktori akar direktori mel yang disegerakkan: index.fld, indexlog.fld, search.fld dan memulakan proses pengindeksan folder mel kongsi.

Maklumat tentang pelaksanaan tugas dibuang ke dalam direktori LOG.

Proses pengindeksan
Proses pengindeksan datang untuk melaksanakan fungsi API Kerio
Session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Contoh pelaksanaan diberikan dalam – python
PublicFolds.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 anda boleh membiarkannya seperti sedia ada, tetapi jika anda memerlukan HTTPS, python mesti mempercayai sijil Kerio.

Juga dalam fail anda mesti menentukan akaun dengan hak untuk melaksanakan fungsi ini (Adm - folder mel awam) pelayan mel.

Saya harap artikel saya akan berguna kepada pentadbir Kerio Connect.

Sumber: www.habr.com

Tambah komen