Đồng bộ hóa đầy đủ các thư mục chia sẻ, danh bạ, lịch giữa các máy chủ Kerio Connect được phân phối

Chào buổi chiều, Habr!

Nhiệm vụ

Tổ chức của tôi sử dụng máy chủ thư trên nền tảng Kerio Connect; máy chủ thư được cài đặt ở các thành phố khác nhau để phục vụ người dùng của họ. Ban đầu không có cấu trúc phân tán vì các tên miền khác nhau ở cấp độ thứ ba, biểu thị thành phố của địa điểm. Mọi thứ đều thành công và mọi người đều vui vẻ. Một ngày đẹp trời, ban quản lý đặt ra một nhiệm vụ, một lịch hoạt động chung giữa tất cả các địa điểm!

thời tiền sử

Ban đầu, ý tưởng là nâng cao Miền thư phân phối Kerio và nó sẽ tự thực hiện mọi việc. Nói sớm hơn làm, một miền phân tán đã được tạo, nhưng thực tế không phải vậy, máy chủ đã sẵn sàng đồng bộ hóa lịch, thư mục, danh bạ - giữa các miền nằm trên cùng một máy chủ, nhưng hoàn toàn không đồng bộ hóa dữ liệu giữa một số miền. may chủ.

Tất nhiên, tôi không mong đợi thành công như vậy và trong một thời gian dài không thể tin rằng chức năng tôi cần lại bị thiếu. Sau này tôi tìm thấy bằng chứng tài liệu về sự thật này. Tôi rất bối rối và thất vọng vì điều này.

Nhiệm vụ suôn sẻ biến thành một vấn đề.

Các lựa chọn là gì?

  • Tạo hai máy khách trên các máy chủ khác nhau để trao đổi dữ liệu cần thiết với một số phần mềm của bên thứ ba. Cần phải tìm phần mềm của bên thứ ba có thể triển khai chức năng này - Tôi không thích kiểu cào như vậy, nhưng có vẻ như đây là giải pháp nhanh chóng duy nhất.
  • Viết tập lệnh của riêng bạn để đồng bộ hóa dữ liệu giữa các máy chủ. Thực tế là Kerio lưu trữ từng đối tượng dưới dạng một tệp riêng biệt, do đó cần phải phát triển một tập lệnh để làm việc với các tệp, nhưng do có đủ số lượng nguồn nên nhiệm vụ này có vẻ hơi phức tạp, đặc biệt là vì cần phải thực hiện nhiều đối tượng. kiểm tra tính chính xác của dữ liệu, trong trường hợp ai đó tạo tác vụ trong cùng một khoảng thời gian, v.v., v.v.

Nhìn về phía trước, tôi sẽ nói rằng mặc dù Kerio lưu trữ một đối tượng dưới dạng một tệp riêng biệt, nhưng sẽ không ngu ngốc đến mức hỏi hệ thống tệp đang hoạt động như thế nào mỗi khi bạn truy cập vào đối tượng.

Sau nhiều thời gian suy nghĩ, soạn ra một đống giấy tờ kế hoạch “chiếm lãnh thổ địch”, đến 6 giờ tôi đã đưa ra hai quyết định đúng đắn:

  • Quyết định đầu tiên là hãy làm việc của riêng bạn và không tìm kiếm bất cứ điều gì từ bên ngoài.
  • Giải pháp thứ hai là đi ngủ.

Vào buổi sáng, tôi thức dậy với một suy nghĩ duy nhất và chân thật, được rút gọn thành vài chữ cái - DFS

phán quyết

Bản thân giải pháp trông như thế này

  • đưa tất cả các máy chủ sẽ tham gia đồng bộ hóa vào hệ điều hành Windows. (Một phần là trên Linux. Cần phải di chuyển dữ liệu thư sang hệ điều hành khác)
  • Xác định cấu trúc của các thư mục sẽ tham gia đồng bộ hóa - chúng phải giống hệt nhau.
  • Xác định tất cả các máy chủ thư trong một miền bằng một không gian DFS duy nhất.
  • Tạo miền Kerio phân tán được đề cập ở trên, vì trong trường hợp của tôi, cần phải đồng bộ hóa dữ liệu, không chỉ giữa các máy chủ mà còn giữa các miền; miền thứ hai có thể được máy chủ Kerio xử lý độc lập. (không giống cái đầu tiên)
  • Đặt các thư mục được đồng bộ hóa vào không gian DFS.
  • Nghĩ ra một loại nạng nào đó (dù sao thì bạn cũng không thể sống thiếu nạng)

Thực hiện

Ví dụ về hai máy chủ thư (có thể nhiều hơn)

1. Miền phân phối Kerio

Đồng bộ hóa đầy đủ các thư mục chia sẻ, danh bạ, lịch giữa các máy chủ Kerio Connect được phân phối

Master không tham gia đồng bộ hóa nhưng đây không phải là điều kiện tiên quyết.

Tôi sẽ không mô tả cách tạo miền phân tán Kerio, không có gì phức tạp, bạn có thể nghiên cứu chính thức manul

Cuối cùng, bạn sẽ thấy hình ảnh sau trong bảng điều khiển quản trị:

Đồng bộ hóa đầy đủ các thư mục chia sẻ, danh bạ, lịch giữa các máy chủ Kerio Connect được phân phối

Đồng bộ hóa đầy đủ các thư mục chia sẻ, danh bạ, lịch giữa các máy chủ Kerio Connect được phân phối

Tiếp theo tôi quan tâm đến các thư mục dùng chung; trên máy chủ Master, bạn có thể chỉ định các tùy chọn sau:

Đồng bộ hóa đầy đủ các thư mục chia sẻ, danh bạ, lịch giữa các máy chủ Kerio Connect được phân phối

Đồng bộ hóa đầy đủ các thư mục chia sẻ, danh bạ, lịch giữa các máy chủ Kerio Connect được phân phối

Cụ thể cho từng miền - máy chủ sẽ không đồng bộ hóa các thư mục chung giữa các miền

Chung cho tất cả các miền - tất cả các máy chủ sẽ loại bỏ các thư mục chung hiện có trong mỗi miền và tạo các thư mục đơn mới cho tất cả các miền trên mỗi máy chủ thư.

Cảnh báo! Mặc dù tùy chọn này thay đổi chính sách cấu hình trên tất cả các máy chủ, nhưng nó sẽ đồng bộ hóa riêng biệt với từng máy chủ (nghĩa là không có một không gian chung duy nhất)

Quản trị viên vẫn có khả năng phân phối quyền truy cập giữa những người dùng.
trong trường hợp của tôi, tất cả đều là của tôi và tôi cần đồng bộ hóa hoàn toàn (Trong trường hợp của bạn, giải pháp có thể khác nhau) trên mỗi máy chủ, bạn cần tạo các nhóm miền giống hệt nhau cần được đồng bộ hóa.

2. Thư mục dữ liệu Kerio

Bây giờ bạn cần tạo các thư mục chia sẻ giống hệt nhau cần được đồng bộ hóa trên mỗi máy chủ. Thư mục, Lịch, Danh bạ.

Lời khuyên - hãy tạo thư mục bằng tiếng Anh, nếu bạn tạo chúng bằng tiếng Latinh, thư mục đó sẽ có tên bằng một số mã hóa khó hiểu, điều này ít nhất là bất tiện.

Bây giờ bạn cần tìm đường dẫn vật lý của các thư mục thư trên mỗi máy chủ.

Chung cho tất cả các miền ~DataMailmail#publicСинхронизируемый каталог#msgs
Cụ thể cho từng miền ~DataMailmail**Domain**#publicСинхронизируемый каталог#msgs

Xin lưu ý rằng chúng tôi sẽ không đồng bộ hóa toàn bộ thư mục mà chỉ đồng bộ hóa vùng chứa dữ liệu #tin nhắn — bản thân các đối tượng được lưu trữ ở đây, tất cả các dữ liệu khác phải riêng biệt cho từng máy chủ.

3.DFS

Tôi sẽ không mô tả chi tiết cách định cấu hình DFS, có đủ thông tin về vấn đề này.

DFS là một dịch vụ vai trò trong Windows Server cung cấp khả năng kết hợp các thư mục dùng chung nằm trên các máy chủ khác nhau
Liên kết tới tài liệu MS DFS

Trước khi thiết lập DFS, bạn phải dừng tất cả các máy chủ thư sẽ tham gia đồng bộ hóa dữ liệu.

Sau khi hoàn tất thiết lập, bạn sẽ nhận được hình ảnh sau cho từng thư mục được đồng bộ hóa

Đồng bộ hóa đầy đủ các thư mục chia sẻ, danh bạ, lịch giữa các máy chủ Kerio Connect được phân phối

Đương nhiên, chúng tôi không cần xuất bản các thư mục sao chép.

Đồng bộ hóa đầy đủ các thư mục chia sẻ, danh bạ, lịch giữa các máy chủ Kerio Connect được phân phối

Sau khi sao chép xảy ra (và không có gì đặc biệt để sao chép ở đó - các thư mục trống), máy chủ thư có thể được khởi động.

Tiếp theo, bạn có thể điền dữ liệu vào một trong các máy chủ thư và kiểm tra xem dữ liệu có được sao chép chính xác hay không.

4. Nạng

Mô tả sự phản ánh

Như bạn có thể thấy sau khi dữ liệu bắt đầu đồng bộ hóa (DFS), nếu bạn đã tạo nội dung nào đó trên máy chủ đầu tiên thì bằng cách nào đó không có gì xuất hiện trên máy chủ thứ hai hoặc nó xuất hiện nhưng không phải lúc nào cũng xuất hiện.

Đừng tuyệt vọng; tất nhiên, sớm hay muộn nó sẽ xuất hiện ở đó, nhưng sớm hay muộn thì tốt hơn. Bởi vì đã quá muộn trong 6 – 12 giờ.

Vấn đề là ngay sau khi bạn tạo một thứ gì đó trên máy chủ đầu tiên, trên máy chủ thứ hai và các máy chủ tiếp theo, tệp tất nhiên sẽ xuất hiện ngay lập tức nhờ hệ thống DFS, nhưng trong trường hợp thư mục thư này đã được ai đó đọc trước đó. và được yêu cầu lại, máy chủ sẽ không đọc lại thư mục #msgs mà sẽ trích xuất dữ liệu từ chỉ mục của chính nó, dữ liệu này có thể không còn tương ứng với thực tế của chúng ta.

Kerio có cơ chế đọc lại chỉ mục, nhưng nó có thể hoạt động trong khoảng sáu giờ và trong 6 giờ này, mức độ liên quan của nhiệm vụ trong lịch có thể bị mất đi phần nào.
Để kiểm tra sự đồng bộ ngay bây giờ, bạn có thể xóa file trong thư mục đã đồng bộ tương ứng index.fld, sau khi truy cập lại vào thư mục trên mail server và nếu thiếu file này Kerio sẽ đọc lại thư mục và dữ liệu sẽ xuất hiện. Có vẻ như đây là giải pháp, xóa tệp khi dữ liệu thay đổi, nhưng điều này không phải lần nào cũng có tác dụng mà chỉ là lần đầu tiên, sau đó Kerio vì lý do nào đó mất hết hứng thú với index.fld
Nó cũng bắt đầu đưa ra những thông báo mà người dùng không thể hiểu được - về một loại chỉ mục nào đó và rằng nó đã đang làm gì đó ở đó.

Có một tùy chọn khác, để tạo một cái gì đó - tại thời điểm tạo một đối tượng mới, máy chủ đột nhiên nhận ra rằng tên tệp mà nó muốn gán đã được sử dụng, nhưng nó lăn tròn và đây là một tùy chọn ngõ cụt.

Làm thế nào để được?

Nếu chúng ta chú ý một lần nữa đến bức tranh vốn đã quen thuộc với chúng ta.

Đồng bộ hóa đầy đủ các thư mục chia sẻ, danh bạ, lịch giữa các máy chủ Kerio Connect được phân phối

Nhưng trên một mặt phẳng khác, bạn có thể thấy một nút rất thú vị mà chúng ta cần bây giờ - Lập lại chỉ mục thư mục

Và thực sự. Nếu chúng ta nhấp vào nút này trên một máy chủ thư mà không biết rằng có điều gì đó đã thay đổi trong #msgs được đồng bộ hóa, chúng ta sẽ nhận được kết quả nhanh chóng, ổn định. Mọi thứ ẩn giấu sẽ trở nên rõ ràng.

Trong nhật ký, bạn có thể thấy quá trình này mất bao lâu; trong trường hợp của tôi với vài nghìn (15 nghìn) bản ghi thì mất khoảng 3-4 phút.

Tất cả những gì chúng ta phải làm là tìm ra cách nhấn nút này khi chúng ta cần.

Hóa ra Kerio sở hưu của họ API

Описание
Tài liệu

Hàm thực hiện nhiệm vụ của chúng tôi trông như thế này:
session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Từ tất cả những điều trên, chúng ta cần viết một tập lệnh theo dõi trạng thái của các thư mục quan tâm và nếu có gì đó thay đổi, hãy thực hiện chức năng chúng ta cần.

Tôi muốn nói rằng tôi đã viết một số phiên bản tập lệnh khác nhau để thực hiện các bước kiểm tra khác nhau và quyết định một phiên bản rút ra tất cả kết luận dựa trên số lượng tệp.

Triển khai tập lệnh

Ví dụ và mô tả tập lệnh CMD

Lập chỉ mục lại.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

Một bản sao của tập lệnh chạy trên mỗi máy chủ thư (có thể được sử dụng làm dịch vụ, không cần có quyền Adm)

Kịch bản đọc tập tin Setup%Computername%.List

Trong đó %Computername% là tên của máy chủ hiện tại (Thư mục có thể chứa danh sách tất cả các máy chủ cùng một lúc.)

Tệp %Computername%.List – chứa đường dẫn đầy đủ của các thư mục được đồng bộ hóa, mỗi đường dẫn được ghi trên một dòng mới và không được chứa các dòng trống.

Sau lần khởi chạy đầu tiên, tập lệnh sẽ thực hiện quy trình lập chỉ mục, bất kể có cần thiết hay không và tập lệnh cũng tạo chỉ mục về số lượng tệp trong mỗi thư mục được đồng bộ hóa.

Mục đích của tập lệnh là đếm tất cả các tệp trong thư mục được chỉ định.

Khi kết thúc quá trình đếm từng thư mục, nếu trong ít nhất một thư mục, giá trị hiện tại của tệp không khớp với giá trị trước đó, tập lệnh sẽ xóa các tệp khỏi thư mục gốc của thư mục thư được đồng bộ hóa: index.fld, indexlog.fld, search.fld và bắt đầu quá trình lập chỉ mục các thư mục thư dùng chung.

Thông tin về việc thực hiện tác vụ được đưa vào thư mục LOG.

Quá trình lập chỉ mục
Quá trình lập chỉ mục bắt nguồn từ việc thực thi chức năng API Kerio
Phiên = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Một ví dụ triển khai được đưa ra trong – 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 bạn có thể để nguyên như vậy, nhưng nếu bạn yêu cầu HTTPS, python phải tin tưởng vào chứng chỉ Kerio.

Ngoài ra trong file bạn phải chỉ định một tài khoản có quyền thực hiện chức năng này (Adm - thư mục thư công cộng) của máy chủ thư.

Mình hy vọng bài viết của mình sẽ hữu ích với các quản trị viên Kerio Connect.

Nguồn: www.habr.com

Thêm một lời nhận xét