สวัสดีตอนบ่ายฮับ!
งาน
องค์กรของฉันใช้เมลเซิร์ฟเวอร์บนแพลตฟอร์ม Kerio Connect โดยมีการติดตั้งเมลเซิร์ฟเวอร์ในเมืองต่างๆ เพื่อให้บริการผู้ใช้ เริ่มแรกไม่มีโครงสร้างแบบกระจาย เนื่องจากโดเมนแตกต่างกันในระดับที่สาม ซึ่งระบุเมืองของไซต์ ทุกอย่างได้ผลและทุกคนก็มีความสุข วันหนึ่งฝ่ายบริหารได้กำหนดงาน ซึ่งเป็นปฏิทินกิจกรรมร่วมกันระหว่างทุกไซต์งาน!
ประวัติศาสตร์
ในตอนแรก แนวคิดคือการยกระดับ Kerio Distributed Mail Domain และจะทำทุกอย่างด้วยตัวเอง ไม่ช้ากว่าจะเสร็จสิ้น โดเมนแบบกระจายก็ถูกสร้างขึ้น แต่นั่นไม่ใช่กรณี เซิร์ฟเวอร์ก็พร้อมที่จะซิงโครไนซ์ปฏิทิน โฟลเดอร์ ผู้ติดต่อ - ระหว่างโดเมนที่อยู่บนเซิร์ฟเวอร์เดียวกัน แต่ไม่ได้ซิงโครไนซ์ข้อมูลระหว่างหลาย ๆ เลย เซิร์ฟเวอร์
แน่นอนว่าฉันไม่ได้คาดหวังถึงสิ่งที่จับได้เช่นนี้และเป็นเวลานานที่ไม่อยากจะเชื่อเลยว่าฟังก์ชันที่ฉันต้องการหายไป ต่อมาฉันพบหลักฐานเชิงสารคดีเกี่ยวกับข้อเท็จจริงนี้ ฉันสับสนและผิดหวังมากกับสิ่งนี้
งานก็กลายเป็นปัญหาไปได้อย่างราบรื่น
มีตัวเลือกอะไรบ้าง?
- สร้างไคลเอนต์สองเครื่องบนเซิร์ฟเวอร์ที่แตกต่างกันเพื่อแลกเปลี่ยนข้อมูลที่จำเป็นกับซอฟต์แวร์ของบริษัทอื่น จำเป็นต้องค้นหาซอฟต์แวร์บุคคลที่สามที่จะใช้ฟังก์ชันนี้ - ฉันไม่ชอบคราดแบบนี้ แต่ดูเหมือนว่านี่จะเป็นวิธีแก้ปัญหาที่รวดเร็วเท่านั้น
- เขียนสคริปต์ของคุณเองสำหรับการซิงโครไนซ์ข้อมูลระหว่างเซิร์ฟเวอร์ ความจริงก็คือ Kerio เก็บแต่ละวัตถุเป็นไฟล์แยกกัน ดังนั้นจึงจำเป็นต้องพัฒนาสคริปต์สำหรับการทำงานกับไฟล์ แต่เมื่อพิจารณาถึงแหล่งที่มาที่เพียงพอ งานจึงดูค่อนข้างซับซ้อน โดยเฉพาะอย่างยิ่งเมื่อจำเป็นต้องดำเนินการหลายไฟล์ ตรวจสอบความถูกต้องของข้อมูล กรณีมีคนสร้างงานในช่วงเวลาเดียวกัน เป็นต้น
เมื่อมองไปข้างหน้า ฉันจะบอกว่าแม้ว่า Kerio จะจัดเก็บอ็อบเจ็กต์เป็นไฟล์แยกต่างหาก แต่ก็ไม่ได้โง่นักที่จะถามว่าระบบไฟล์ทำงานอย่างไรทุกครั้งที่คุณเข้าถึงอ็อบเจ็กต์
หลังจากใช้เวลาคิดมากมายเขียนกระดาษแผ่นหนึ่งโดยมีแผน "ยึดดินแดนของศัตรู" เมื่อเวลา 6 โมงเช้า ฉันได้ตัดสินใจถูกต้องสองครั้ง:
- การตัดสินใจอย่างแรกคือลงมือทำเองและไม่มองหาอะไรจากภายนอก
- วิธีแก้ไขที่สองคือเข้านอน
ในตอนเช้าฉันตื่นขึ้นมาด้วยความคิดเดียวที่แท้จริงซึ่งลดลงเหลือเพียงตัวอักษรสองสามตัว - DFS
การตัดสิน
วิธีแก้ปัญหามีลักษณะเช่นนี้
- นำเซิร์ฟเวอร์ทั้งหมดที่จะมีส่วนร่วมในการซิงโครไนซ์กับระบบปฏิบัติการ Windows (ส่วนหนึ่งเป็นบน Linux จำเป็นต้องมีการย้ายข้อมูลเมลไปยังระบบปฏิบัติการอื่น)
- กำหนดโครงสร้างของไดเร็กทอรีที่จะมีส่วนร่วมในการซิงโครไนซ์ - จะต้องเหมือนกัน
- กำหนดเมลเซิร์ฟเวอร์ทั้งหมดภายใต้โดเมนเดียวด้วยพื้นที่ DFS เดียว
- สร้างโดเมน Kerio แบบกระจายที่กล่าวถึงข้างต้น เนื่องจากในกรณีของฉันจำเป็นต้องมีการซิงโครไนซ์ข้อมูล ไม่เพียงแต่ระหว่างเซิร์ฟเวอร์เท่านั้น แต่ยังระหว่างโดเมนด้วย ส่วนที่สองสามารถจัดการโดยเซิร์ฟเวอร์ Kerio ได้อย่างอิสระ (ไม่เหมือนอันแรก)
- ตั้งค่าไดเร็กทอรีที่ซิงโครไนซ์เป็นพื้นที่ DFS
- หาไม้ค้ำยันมาบ้าง (ท้ายที่สุดคุณไม่สามารถอยู่ได้โดยปราศจากไม้ค้ำยัน)
การดำเนินงาน
ตัวอย่างบนเมลเซิร์ฟเวอร์สองตัว (อาจจะมากกว่านั้น)
1. โดเมนแบบกระจาย Kerio
ต้นแบบไม่ได้มีส่วนร่วมในการซิงโครไนซ์ แต่นี่ไม่ใช่ข้อกำหนดเบื้องต้น
ฉันจะไม่อธิบายวิธีเพิ่มโดเมนแบบกระจาย Kerio ไม่มีอะไรซับซ้อนเกี่ยวกับเรื่องนี้ คุณสามารถศึกษาอย่างเป็นทางการได้
ในที่สุด คุณควรเห็นภาพต่อไปนี้ในคอนโซลการดูแลระบบ:
ต่อไป ฉันสนใจโฟลเดอร์แชร์ บนเซิร์ฟเวอร์ Master คุณสามารถระบุตัวเลือกต่อไปนี้:
เฉพาะสำหรับแต่ละโดเมน - เซิร์ฟเวอร์จะไม่ซิงโครไนซ์โฟลเดอร์สาธารณะระหว่างโดเมน
เหมือนกันกับทุกโดเมน - เซิร์ฟเวอร์ทั้งหมดจะละทิ้งโฟลเดอร์สาธารณะที่มีอยู่ในแต่ละโดเมน และสร้างโฟลเดอร์เดี่ยวใหม่สำหรับทุกโดเมนในแต่ละเซิร์ฟเวอร์อีเมล
คำเตือน! แม้ว่าตัวเลือกนี้จะเปลี่ยนนโยบายการกำหนดค่าบนเซิร์ฟเวอร์ทั้งหมด แต่จะซิงโครไนซ์แยกจากแต่ละเซิร์ฟเวอร์ (นั่นคือ ไม่มีพื้นที่ส่วนกลางเดียว)
ผู้ดูแลระบบจะยังคงสามารถกระจายการเข้าถึงระหว่างผู้ใช้ได้
ในกรณีของฉัน ทั้งหมดนี้เป็นของฉันและฉันต้องการการซิงโครไนซ์แบบเต็ม (ในกรณีของคุณ วิธีแก้ไขอาจแตกต่างกัน) ในแต่ละเซิร์ฟเวอร์ คุณต้องสร้างชุดโดเมนที่เหมือนกันซึ่งจำเป็นต้องซิงโครไนซ์
2. ไดเร็กทอรีข้อมูล Kerio
ตอนนี้คุณต้องสร้างไดเรกทอรีที่ใช้ร่วมกันที่เหมือนกันซึ่งจำเป็นต้องซิงโครไนซ์ในแต่ละเซิร์ฟเวอร์ โฟลเดอร์ ปฏิทิน รายชื่อติดต่อ
คำแนะนำ - สร้างไดเร็กทอรีเป็นภาษาอังกฤษหากคุณสร้างเป็นภาษาละตินไดเร็กทอรีจะมีชื่อในการเข้ารหัสที่ไม่สามารถเข้าใจได้ซึ่งอย่างน้อยก็ไม่สะดวก
ตอนนี้คุณต้องค้นหาเส้นทางทางกายภาพของโฟลเดอร์เมลในแต่ละเซิร์ฟเวอร์
เหมือนกันกับทุกโดเมน ~DataMailmail#publicСинхронизируемый каталог#msgs
เฉพาะสำหรับแต่ละโดเมน ~DataMailmail**Domain**#publicСинхронизируемый каталог#msgs
โปรดทราบว่าเราจะไม่ซิงโครไนซ์ไดเรกทอรีทั้งหมด แต่จะซิงโครไนซ์เฉพาะคอนเทนเนอร์กับข้อมูลเท่านั้น #ข้อความ — ออบเจ็กต์ถูกเก็บไว้ที่นี่ ข้อมูลอื่น ๆ ทั้งหมดจะต้องแยกจากกันสำหรับแต่ละเซิร์ฟเวอร์
3.ดีเอฟเอส
ฉันจะไม่อธิบายรายละเอียดวิธีกำหนดค่า DFS แต่มีข้อมูลเพียงพอสำหรับปัญหานี้
DFS เป็นบริการบทบาทใน Windows Server ที่ให้ความสามารถในการรวมโฟลเดอร์ที่ใช้ร่วมกันที่อยู่บนเซิร์ฟเวอร์ที่แตกต่างกัน
ก่อนตั้งค่า DFS คุณต้องหยุดเซิร์ฟเวอร์เมลทั้งหมดที่จะมีส่วนร่วมในการซิงโครไนซ์ข้อมูล
เมื่อเสร็จสิ้นการตั้งค่า คุณควรได้รับรูปภาพต่อไปนี้สำหรับแต่ละโฟลเดอร์ที่ซิงโครไนซ์
โดยปกติแล้ว เราไม่จำเป็นต้องเผยแพร่โฟลเดอร์ที่จำลองแบบ
หลังจากการจำลองแบบเกิดขึ้น (และไม่มีอะไรพิเศษให้ทำซ้ำที่นั่น - โฟลเดอร์ว่างเปล่า) เซิร์ฟเวอร์เมลสามารถเริ่มต้นได้
จากนั้น คุณสามารถกรอกข้อมูลลงในเมลเซิร์ฟเวอร์ตัวใดตัวหนึ่ง และตรวจสอบว่าข้อมูลได้รับการจำลองอย่างถูกต้อง
4. ไม้ค้ำยัน
คำอธิบายของการสะท้อน
ดังที่คุณเห็นหลังจากที่ข้อมูลเริ่มซิงโครไนซ์ (DFS) หากคุณสร้างบางสิ่งบนเซิร์ฟเวอร์แรก ไม่มีอะไรปรากฏบนเซิร์ฟเวอร์ที่สอง หรือปรากฏขึ้นแต่ก็ไม่เสมอไป
อย่าสิ้นหวัง แน่นอนว่ามันจะปรากฏที่นั่นไม่ช้าก็เร็ว แต่ก็ดีกว่าในภายหลัง เพราะมันสายเกินไปใน 6 – 12 ชั่วโมง
ประเด็นก็คือทันทีที่คุณสร้างบางสิ่งบนเซิร์ฟเวอร์เครื่องแรกบนเซิร์ฟเวอร์ที่สองและเซิร์ฟเวอร์ถัดไปไฟล์จะปรากฏขึ้นทันทีแน่นอนด้วยระบบ DFS แต่ในกรณีที่ใครบางคนเคยอ่านไดเร็กทอรีอีเมลนี้มาก่อน และได้รับการร้องขออีกครั้ง เซิร์ฟเวอร์จะไม่อ่านโฟลเดอร์ #msgs ซ้ำ แต่จะคายข้อมูลจากดัชนีของตัวเอง ซึ่งอาจไม่สอดคล้องกับความเป็นจริงของเราอีกต่อไป
Kerio มีกลไกในการอ่านดัชนีซ้ำ แต่สามารถทำงานได้ภายในเวลาประมาณหกชั่วโมง และในระหว่าง 6 ชั่วโมงนี้ ความเกี่ยวข้องของงานในปฏิทินอาจหายไปบ้าง
เพื่อทดสอบการซิงโครไนซ์ในตอนนี้ คุณสามารถลบไฟล์ในไดเรกทอรีที่ซิงโครไนซ์ได้ index.fld หลังจากเข้าถึงโฟลเดอร์บนเมลเซิร์ฟเวอร์อีกครั้ง และหากไฟล์นี้หายไป Kerio จะอ่านไดเร็กทอรีและข้อมูลอีกครั้ง จะปรากฏขึ้น ดูเหมือนว่านี่คือวิธีแก้ปัญหา ให้ลบไฟล์เมื่อข้อมูลเปลี่ยนแปลง แต่วิธีนี้ใช้ไม่ได้ผลทุกครั้ง แต่เป็นเพียงครั้งแรกเท่านั้น Kerio ด้วยเหตุผลบางประการจึงหมดความสนใจใน index.fld
นอกจากนี้ยังเริ่มพ่นข้อความที่ผู้ใช้ไม่สามารถเข้าใจได้ - เกี่ยวกับดัชนีบางประเภทและกำลังทำบางอย่างอยู่ที่นั่นแล้ว
มีตัวเลือกอื่นในการสร้างบางสิ่งบางอย่าง - ในขณะที่สร้างวัตถุใหม่ เซิร์ฟเวอร์ก็ตระหนักทันทีว่าชื่อไฟล์ที่ต้องการกำหนดนั้นถูกใช้ไปแล้ว แต่มันมีหิมะตกและนี่คือตัวเลือกทางตัน
เป็นอย่างไร
ถ้าเรากลับมาสนใจภาพที่เราคุ้นเคยอยู่แล้วอีกครั้ง
แต่บนเครื่องบินอีกลำหนึ่ง คุณจะเห็นปุ่มที่น่าสนใจมากที่เราต้องการตอนนี้ - จัดทำดัชนีโฟลเดอร์ใหม่
และแน่นอน หากเราคลิกที่ปุ่มนี้บนเมลเซิร์ฟเวอร์ที่ไม่ทราบว่ามีบางอย่างเปลี่ยนแปลงไปในการซิงโครไนซ์ #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)
นอกจากนี้ในไฟล์คุณต้องระบุบัญชีที่มีสิทธิ์ในการทำหน้าที่นี้ (Adm - โฟลเดอร์เมลสาธารณะ) ของเมลเซิร์ฟเวอร์
ฉันหวังว่าบทความของฉันจะเป็นประโยชน์กับผู้ดูแลระบบ Kerio Connect
ที่มา: will.com