การซิงโครไนซ์โฟลเดอร์แชร์ รายชื่อ ปฏิทินระหว่างเซิร์ฟเวอร์ Kerio Connect แบบกระจายโดยสมบูรณ์

สวัสดีตอนบ่ายฮับ!

งาน

องค์กรของฉันใช้เมลเซิร์ฟเวอร์บนแพลตฟอร์ม Kerio Connect โดยมีการติดตั้งเมลเซิร์ฟเวอร์ในเมืองต่างๆ เพื่อให้บริการผู้ใช้ เริ่มแรกไม่มีโครงสร้างแบบกระจาย เนื่องจากโดเมนแตกต่างกันในระดับที่สาม ซึ่งระบุเมืองของไซต์ ทุกอย่างได้ผลและทุกคนก็มีความสุข วันหนึ่งฝ่ายบริหารได้กำหนดงาน ซึ่งเป็นปฏิทินกิจกรรมร่วมกันระหว่างทุกไซต์งาน!

ประวัติศาสตร์

ในตอนแรก แนวคิดคือการยกระดับ Kerio Distributed Mail Domain และจะทำทุกอย่างด้วยตัวเอง ไม่ช้ากว่าจะเสร็จสิ้น โดเมนแบบกระจายก็ถูกสร้างขึ้น แต่นั่นไม่ใช่กรณี เซิร์ฟเวอร์ก็พร้อมที่จะซิงโครไนซ์ปฏิทิน โฟลเดอร์ ผู้ติดต่อ - ระหว่างโดเมนที่อยู่บนเซิร์ฟเวอร์เดียวกัน แต่ไม่ได้ซิงโครไนซ์ข้อมูลระหว่างหลาย ๆ เลย เซิร์ฟเวอร์

แน่นอนว่าฉันไม่ได้คาดหวังถึงสิ่งที่จับได้เช่นนี้และเป็นเวลานานที่ไม่อยากจะเชื่อเลยว่าฟังก์ชันที่ฉันต้องการหายไป ต่อมาฉันพบหลักฐานเชิงสารคดีเกี่ยวกับข้อเท็จจริงนี้ ฉันสับสนและผิดหวังมากกับสิ่งนี้

งานก็กลายเป็นปัญหาไปได้อย่างราบรื่น

มีตัวเลือกอะไรบ้าง?

  • สร้างไคลเอนต์สองเครื่องบนเซิร์ฟเวอร์ที่แตกต่างกันเพื่อแลกเปลี่ยนข้อมูลที่จำเป็นกับซอฟต์แวร์ของบริษัทอื่น จำเป็นต้องค้นหาซอฟต์แวร์บุคคลที่สามที่จะใช้ฟังก์ชันนี้ - ฉันไม่ชอบคราดแบบนี้ แต่ดูเหมือนว่านี่จะเป็นวิธีแก้ปัญหาที่รวดเร็วเท่านั้น
  • เขียนสคริปต์ของคุณเองสำหรับการซิงโครไนซ์ข้อมูลระหว่างเซิร์ฟเวอร์ ความจริงก็คือ Kerio เก็บแต่ละวัตถุเป็นไฟล์แยกกัน ดังนั้นจึงจำเป็นต้องพัฒนาสคริปต์สำหรับการทำงานกับไฟล์ แต่เมื่อพิจารณาถึงแหล่งที่มาที่เพียงพอ งานจึงดูค่อนข้างซับซ้อน โดยเฉพาะอย่างยิ่งเมื่อจำเป็นต้องดำเนินการหลายไฟล์ ตรวจสอบความถูกต้องของข้อมูล กรณีมีคนสร้างงานในช่วงเวลาเดียวกัน เป็นต้น

เมื่อมองไปข้างหน้า ฉันจะบอกว่าแม้ว่า Kerio จะจัดเก็บอ็อบเจ็กต์เป็นไฟล์แยกต่างหาก แต่ก็ไม่ได้โง่นักที่จะถามว่าระบบไฟล์ทำงานอย่างไรทุกครั้งที่คุณเข้าถึงอ็อบเจ็กต์

หลังจากใช้เวลาคิดมากมายเขียนกระดาษแผ่นหนึ่งโดยมีแผน "ยึดดินแดนของศัตรู" เมื่อเวลา 6 โมงเช้า ฉันได้ตัดสินใจถูกต้องสองครั้ง:

  • การตัดสินใจอย่างแรกคือลงมือทำเองและไม่มองหาอะไรจากภายนอก
  • วิธีแก้ไขที่สองคือเข้านอน

ในตอนเช้าฉันตื่นขึ้นมาด้วยความคิดเดียวที่แท้จริงซึ่งลดลงเหลือเพียงตัวอักษรสองสามตัว - DFS

การตัดสิน

วิธีแก้ปัญหามีลักษณะเช่นนี้

  • นำเซิร์ฟเวอร์ทั้งหมดที่จะมีส่วนร่วมในการซิงโครไนซ์กับระบบปฏิบัติการ Windows (ส่วนหนึ่งเป็นบน Linux จำเป็นต้องมีการย้ายข้อมูลเมลไปยังระบบปฏิบัติการอื่น)
  • กำหนดโครงสร้างของไดเร็กทอรีที่จะมีส่วนร่วมในการซิงโครไนซ์ - จะต้องเหมือนกัน
  • กำหนดเมลเซิร์ฟเวอร์ทั้งหมดภายใต้โดเมนเดียวด้วยพื้นที่ DFS เดียว
  • สร้างโดเมน Kerio แบบกระจายที่กล่าวถึงข้างต้น เนื่องจากในกรณีของฉันจำเป็นต้องมีการซิงโครไนซ์ข้อมูล ไม่เพียงแต่ระหว่างเซิร์ฟเวอร์เท่านั้น แต่ยังระหว่างโดเมนด้วย ส่วนที่สองสามารถจัดการโดยเซิร์ฟเวอร์ Kerio ได้อย่างอิสระ (ไม่เหมือนอันแรก)
  • ตั้งค่าไดเร็กทอรีที่ซิงโครไนซ์เป็นพื้นที่ DFS
  • หาไม้ค้ำยันมาบ้าง (ท้ายที่สุดคุณไม่สามารถอยู่ได้โดยปราศจากไม้ค้ำยัน)

การดำเนินงาน

ตัวอย่างบนเมลเซิร์ฟเวอร์สองตัว (อาจจะมากกว่านั้น)

1. โดเมนแบบกระจาย Kerio

การซิงโครไนซ์โฟลเดอร์แชร์ รายชื่อ ปฏิทินระหว่างเซิร์ฟเวอร์ Kerio Connect แบบกระจายโดยสมบูรณ์

ต้นแบบไม่ได้มีส่วนร่วมในการซิงโครไนซ์ แต่นี่ไม่ใช่ข้อกำหนดเบื้องต้น

ฉันจะไม่อธิบายวิธีเพิ่มโดเมนแบบกระจาย Kerio ไม่มีอะไรซับซ้อนเกี่ยวกับเรื่องนี้ คุณสามารถศึกษาอย่างเป็นทางการได้ มานูล

ในที่สุด คุณควรเห็นภาพต่อไปนี้ในคอนโซลการดูแลระบบ:

การซิงโครไนซ์โฟลเดอร์แชร์ รายชื่อ ปฏิทินระหว่างเซิร์ฟเวอร์ Kerio Connect แบบกระจายโดยสมบูรณ์

การซิงโครไนซ์โฟลเดอร์แชร์ รายชื่อ ปฏิทินระหว่างเซิร์ฟเวอร์ Kerio Connect แบบกระจายโดยสมบูรณ์

ต่อไป ฉันสนใจโฟลเดอร์แชร์ บนเซิร์ฟเวอร์ Master คุณสามารถระบุตัวเลือกต่อไปนี้:

การซิงโครไนซ์โฟลเดอร์แชร์ รายชื่อ ปฏิทินระหว่างเซิร์ฟเวอร์ Kerio Connect แบบกระจายโดยสมบูรณ์

การซิงโครไนซ์โฟลเดอร์แชร์ รายชื่อ ปฏิทินระหว่างเซิร์ฟเวอร์ Kerio Connect แบบกระจายโดยสมบูรณ์

เฉพาะสำหรับแต่ละโดเมน - เซิร์ฟเวอร์จะไม่ซิงโครไนซ์โฟลเดอร์สาธารณะระหว่างโดเมน

เหมือนกันกับทุกโดเมน - เซิร์ฟเวอร์ทั้งหมดจะละทิ้งโฟลเดอร์สาธารณะที่มีอยู่ในแต่ละโดเมน และสร้างโฟลเดอร์เดี่ยวใหม่สำหรับทุกโดเมนในแต่ละเซิร์ฟเวอร์อีเมล

คำเตือน! แม้ว่าตัวเลือกนี้จะเปลี่ยนนโยบายการกำหนดค่าบนเซิร์ฟเวอร์ทั้งหมด แต่จะซิงโครไนซ์แยกจากแต่ละเซิร์ฟเวอร์ (นั่นคือ ไม่มีพื้นที่ส่วนกลางเดียว)

ผู้ดูแลระบบจะยังคงสามารถกระจายการเข้าถึงระหว่างผู้ใช้ได้
ในกรณีของฉัน ทั้งหมดนี้เป็นของฉันและฉันต้องการการซิงโครไนซ์แบบเต็ม (ในกรณีของคุณ วิธีแก้ไขอาจแตกต่างกัน) ในแต่ละเซิร์ฟเวอร์ คุณต้องสร้างชุดโดเมนที่เหมือนกันซึ่งจำเป็นต้องซิงโครไนซ์

2. ไดเร็กทอรีข้อมูล Kerio

ตอนนี้คุณต้องสร้างไดเรกทอรีที่ใช้ร่วมกันที่เหมือนกันซึ่งจำเป็นต้องซิงโครไนซ์ในแต่ละเซิร์ฟเวอร์ โฟลเดอร์ ปฏิทิน รายชื่อติดต่อ

คำแนะนำ - สร้างไดเร็กทอรีเป็นภาษาอังกฤษหากคุณสร้างเป็นภาษาละตินไดเร็กทอรีจะมีชื่อในการเข้ารหัสที่ไม่สามารถเข้าใจได้ซึ่งอย่างน้อยก็ไม่สะดวก

ตอนนี้คุณต้องค้นหาเส้นทางทางกายภาพของโฟลเดอร์เมลในแต่ละเซิร์ฟเวอร์

เหมือนกันกับทุกโดเมน ~DataMailmail#publicСинхронизируемый каталог#msgs
เฉพาะสำหรับแต่ละโดเมน ~DataMailmail**Domain**#publicСинхронизируемый каталог#msgs

โปรดทราบว่าเราจะไม่ซิงโครไนซ์ไดเรกทอรีทั้งหมด แต่จะซิงโครไนซ์เฉพาะคอนเทนเนอร์กับข้อมูลเท่านั้น #ข้อความ — ออบเจ็กต์ถูกเก็บไว้ที่นี่ ข้อมูลอื่น ๆ ทั้งหมดจะต้องแยกจากกันสำหรับแต่ละเซิร์ฟเวอร์

3.ดีเอฟเอส

ฉันจะไม่อธิบายรายละเอียดวิธีกำหนดค่า DFS แต่มีข้อมูลเพียงพอสำหรับปัญหานี้

DFS เป็นบริการบทบาทใน Windows Server ที่ให้ความสามารถในการรวมโฟลเดอร์ที่ใช้ร่วมกันที่อยู่บนเซิร์ฟเวอร์ที่แตกต่างกัน
ลิงก์ไปยังเอกสาร MS DFS

ก่อนตั้งค่า DFS คุณต้องหยุดเซิร์ฟเวอร์เมลทั้งหมดที่จะมีส่วนร่วมในการซิงโครไนซ์ข้อมูล

เมื่อเสร็จสิ้นการตั้งค่า คุณควรได้รับรูปภาพต่อไปนี้สำหรับแต่ละโฟลเดอร์ที่ซิงโครไนซ์

การซิงโครไนซ์โฟลเดอร์แชร์ รายชื่อ ปฏิทินระหว่างเซิร์ฟเวอร์ Kerio Connect แบบกระจายโดยสมบูรณ์

โดยปกติแล้ว เราไม่จำเป็นต้องเผยแพร่โฟลเดอร์ที่จำลองแบบ

การซิงโครไนซ์โฟลเดอร์แชร์ รายชื่อ ปฏิทินระหว่างเซิร์ฟเวอร์ Kerio Connect แบบกระจายโดยสมบูรณ์

หลังจากการจำลองแบบเกิดขึ้น (และไม่มีอะไรพิเศษให้ทำซ้ำที่นั่น - โฟลเดอร์ว่างเปล่า) เซิร์ฟเวอร์เมลสามารถเริ่มต้นได้

จากนั้น คุณสามารถกรอกข้อมูลลงในเมลเซิร์ฟเวอร์ตัวใดตัวหนึ่ง และตรวจสอบว่าข้อมูลได้รับการจำลองอย่างถูกต้อง

4. ไม้ค้ำยัน

คำอธิบายของการสะท้อน

ดังที่คุณเห็นหลังจากที่ข้อมูลเริ่มซิงโครไนซ์ (DFS) หากคุณสร้างบางสิ่งบนเซิร์ฟเวอร์แรก ไม่มีอะไรปรากฏบนเซิร์ฟเวอร์ที่สอง หรือปรากฏขึ้นแต่ก็ไม่เสมอไป

อย่าสิ้นหวัง แน่นอนว่ามันจะปรากฏที่นั่นไม่ช้าก็เร็ว แต่ก็ดีกว่าในภายหลัง เพราะมันสายเกินไปใน 6 – 12 ชั่วโมง

ประเด็นก็คือทันทีที่คุณสร้างบางสิ่งบนเซิร์ฟเวอร์เครื่องแรกบนเซิร์ฟเวอร์ที่สองและเซิร์ฟเวอร์ถัดไปไฟล์จะปรากฏขึ้นทันทีแน่นอนด้วยระบบ DFS แต่ในกรณีที่ใครบางคนเคยอ่านไดเร็กทอรีอีเมลนี้มาก่อน และได้รับการร้องขออีกครั้ง เซิร์ฟเวอร์จะไม่อ่านโฟลเดอร์ #msgs ซ้ำ แต่จะคายข้อมูลจากดัชนีของตัวเอง ซึ่งอาจไม่สอดคล้องกับความเป็นจริงของเราอีกต่อไป

Kerio มีกลไกในการอ่านดัชนีซ้ำ แต่สามารถทำงานได้ภายในเวลาประมาณหกชั่วโมง และในระหว่าง 6 ชั่วโมงนี้ ความเกี่ยวข้องของงานในปฏิทินอาจหายไปบ้าง
เพื่อทดสอบการซิงโครไนซ์ในตอนนี้ คุณสามารถลบไฟล์ในไดเรกทอรีที่ซิงโครไนซ์ได้ index.fld หลังจากเข้าถึงโฟลเดอร์บนเมลเซิร์ฟเวอร์อีกครั้ง และหากไฟล์นี้หายไป Kerio จะอ่านไดเร็กทอรีและข้อมูลอีกครั้ง จะปรากฏขึ้น ดูเหมือนว่านี่คือวิธีแก้ปัญหา ให้ลบไฟล์เมื่อข้อมูลเปลี่ยนแปลง แต่วิธีนี้ใช้ไม่ได้ผลทุกครั้ง แต่เป็นเพียงครั้งแรกเท่านั้น Kerio ด้วยเหตุผลบางประการจึงหมดความสนใจใน index.fld
นอกจากนี้ยังเริ่มพ่นข้อความที่ผู้ใช้ไม่สามารถเข้าใจได้ - เกี่ยวกับดัชนีบางประเภทและกำลังทำบางอย่างอยู่ที่นั่นแล้ว

มีตัวเลือกอื่นในการสร้างบางสิ่งบางอย่าง - ในขณะที่สร้างวัตถุใหม่ เซิร์ฟเวอร์ก็ตระหนักทันทีว่าชื่อไฟล์ที่ต้องการกำหนดนั้นถูกใช้ไปแล้ว แต่มันมีหิมะตกและนี่คือตัวเลือกทางตัน

เป็นอย่างไร

ถ้าเรากลับมาสนใจภาพที่เราคุ้นเคยอยู่แล้วอีกครั้ง

การซิงโครไนซ์โฟลเดอร์แชร์ รายชื่อ ปฏิทินระหว่างเซิร์ฟเวอร์ Kerio Connect แบบกระจายโดยสมบูรณ์

แต่บนเครื่องบินอีกลำหนึ่ง คุณจะเห็นปุ่มที่น่าสนใจมากที่เราต้องการตอนนี้ - จัดทำดัชนีโฟลเดอร์ใหม่

และแน่นอน หากเราคลิกที่ปุ่มนี้บนเมลเซิร์ฟเวอร์ที่ไม่ทราบว่ามีบางอย่างเปลี่ยนแปลงไปในการซิงโครไนซ์ #msgs เราจะได้ผลลัพธ์ที่เสถียรและรวดเร็ว ทุกสิ่งที่ซ่อนอยู่จะชัดเจน

ในบันทึก คุณสามารถดูได้ว่ากระบวนการนี้ใช้เวลานานเท่าใด ในกรณีของฉันที่มีบันทึกหลายพัน (15) รายการ จะใช้เวลาประมาณ 3-4 นาที

สิ่งที่เราต้องทำคือหาวิธีกดปุ่มนี้เมื่อเราต้องการ

ปรากฎว่า เคริโอ มีของตัวเอง API

ลักษณะ
เอกสาร

ฟังก์ชั่นที่ทำงานของเรามีลักษณะดังนี้:
session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

จากทั้งหมดข้างต้น เราจำเป็นต้องเขียนสคริปต์ที่จะตรวจสอบสถานะของโฟลเดอร์ที่สนใจ และหากมีการเปลี่ยนแปลงใดๆ ให้ทำหน้าที่ที่เราต้องการ

ฉันอยากจะบอกว่าฉันเขียนสคริปต์หลายเวอร์ชันที่ทำการตรวจสอบต่างกัน และตัดสินด้วยเวอร์ชันที่สรุปผลทั้งหมดตามจำนวนไฟล์

การใช้สคริปต์

ตัวอย่างและคำอธิบายสคริปต์ CMD

ทำดัชนีใหม่อีกครั้ง

@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

สำเนาของสคริปต์ทำงานบนเมลเซิร์ฟเวอร์แต่ละตัว (สามารถใช้เป็นบริการได้ ไม่จำเป็นต้องใช้สิทธิ์ผู้ดูแลระบบ)

สคริปต์จะอ่านไฟล์ Setup%Computername%.List

โดยที่ %Computername% คือชื่อของเซิร์ฟเวอร์ปัจจุบัน (ไดเร็กทอรีสามารถมีรายการของเซิร์ฟเวอร์ทั้งหมดในคราวเดียว)

ไฟล์ %Computername%.List – มีพาธแบบเต็มของไดเร็กทอรีที่ซิงโครไนซ์ แต่ละพาธจะเขียนขึ้นบรรทัดใหม่ และไม่ควรมีบรรทัดว่าง

หลังจากการเปิดตัวครั้งแรก สคริปต์จะดำเนินการขั้นตอนการจัดทำดัชนี โดยไม่คำนึงว่าจำเป็นหรือไม่ และสคริปต์ยังสร้างดัชนีของจำนวนไฟล์ในแต่ละไดเร็กทอรีที่ซิงโครไนซ์ด้วย

วัตถุประสงค์ของสคริปต์คือการนับไฟล์ทั้งหมดในไดเร็กทอรีที่ระบุ

ในตอนท้ายของการนับแต่ละไดเร็กทอรี หากในอย่างน้อยหนึ่งไดเร็กทอรี ค่าปัจจุบันของไฟล์ไม่ตรงกับไดเร็กทอรีก่อนหน้า สคริปต์จะลบไฟล์ออกจากไดเร็กทอรีรากของไดเร็กทอรีเมลที่ซิงโครไนซ์: index.fld, indexlog.fld, search.fld และเริ่มกระบวนการสร้างดัชนีของโฟลเดอร์เมลที่แชร์

ข้อมูลเกี่ยวกับการดำเนินงานจะถูกเทลงในไดเร็กทอรี LOG

กระบวนการจัดทำดัชนี
กระบวนการจัดทำดัชนีลงมาเพื่อเรียกใช้ฟังก์ชัน Kerio API
เซสชัน = 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 python จะต้องเชื่อถือใบรับรอง Kerio

นอกจากนี้ในไฟล์คุณต้องระบุบัญชีที่มีสิทธิ์ในการทำหน้าที่นี้ (Adm - โฟลเดอร์เมลสาธารณะ) ของเมลเซิร์ฟเวอร์

ฉันหวังว่าบทความของฉันจะเป็นประโยชน์กับผู้ดูแลระบบ Kerio Connect

ที่มา: will.com

เพิ่มความคิดเห็น