กรณีศึกษา การสำรองข้อมูล Neo4j Graph Database

สวัสดีครับ

บทความนี้เป็นกรณีศึกษาเกี่ยวกับการสำรองข้อมูล Neo4j Graph Database เรื่องมันมีอยู่ว่า สำนักนวัตกรรมดิจิทัลและระบบอัจฉริยะ หรือชื่อเดิมคือ ศูนย์คอมพิวเตอร์ ได้พัฒนาระบบเอกสารอิเล็คทรอนิกส์ เวอร์ชั่นใหม่ ซึ่งได้เปลี่ยนเทคโนโลยีในการเก็บข้อมูลมาใช้ Neo4j Graph Database แทนของเดิมที่ใช้ Microsoft SQL Server จึงต้องมีการวางแผนความเสี่ยงในเรื่องของการสำรองข้อมูล คราวนี้ตัวผมเองไม่ได้มีความเชี่ยวชาญหรือรู้จักกับ Neo4j Graph Database มากเท่าไหร่ แต่น้องที่สำนักนวัตกรรมที่เป็นผู้พัฒนาระบบและเรียนรู้การใช้งานก็ได้ไปศึกษา ทดสอบวิธีการส่งออกและนำเข้าข้อมูลจนมีความรู้ ความเข้าใจ ก็ได้มาถ่ายทอดต่อ ส่วนตัวผมเองก็นำวิธีการนี้ไปบวกกับความรู้เรื่อง Batch Script + PowerShell เล็กน้อย ทำเป็นระบบสำรองข้อมูลขึ้นมา ซึ่งขณะนี้ได้ทดสอบมาประมาณ 1 เดือนก็ยังสามารถทำงานได้ จึงจะขอมาเล่าสู่กันฟังในบทความนี้ครับ

ข้อมูลที่ได้รับมาก็คือ

1. Neo4j Graph Database ที่ใช้เป็นรุ่น Community ข้อดีคือ ไม่มีค่าใช้จ่ายในการใช้งาน แต่จะมีข้อจำกัดคือ ในการส่งออกและนำเข้าไฟล์ฐานข้อมูลนั้นจะไม่มีเครื่องมือให้ใช้งานมากมายจะต้องใช้คำสั่่งผ่านทาง Command Line

2. ข้อจำกัดอีกอย่างคือ การส่งออกไฟล์นั้นจะทำในขณะ Neo4j ทำงานอยู่ไม่ได้ ต้องหยุดการทำงานก่อนเสร็จแล้วจึงทำการสตาร์ท Neo4่j ขึ้นมาทำงานใหม่

นำข้อมูลที่ได้มาวางแผนการเขียน Script

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

– เนื่องจากมีหลายขั้นตอนในการทำงานจีงใช้วิธีเขียนไฟล์ Script แยกการทำงานออกไป เช่น

  • Batch File ชื่อ neo4j-stop.bat เอาไว้หยุดการทำงาน Neo4j
  • Batch File ชื่อ neo4j-dump.bat เอาไว้ส่งออกไฟล์ฐานข้อมูล Neo4j ออกมา

เมื่อได้รับข้อมูลและวางแผนการทำงานเรียบร้อยแล้ว จึงเริ่มต้นเขียน Script ตามลำดับขั้นตอนดังนี้

1. สร้าง Batch File ชื่อ neo4j-stop.bat เอาไว้สำหรับหยุดการทำงานของ Neo4j จะมีคำสั่งที่เขียน ดังนี้

@echo off

for /f %%a in (‘powershell -Command “Get-Date -format ‘HH:mm:ss'”‘) do set “TimeStart=%%a”echo === Start Backup Neo4j On %DATE% %TimeStart% === > log.txt

net stop neo4j >> log.txt

call neo4j-dump.bat

อธิบายได้ดังนี้
– เริ่มต้นจะมีการรับค่าวันและเวลาปัจจุบัน คือ %DATE% และ %TimeStart%
– จากนั้นจึงเริ่มใช้คำสั่งหยุดการทำงานของ Neo4j
– สังเกตว่าทุกคำสั่งจะมีการส่งออกไปเก็บที่ log.txt
– เสร็จแล้วจะมีการเรียก Batch Script neo4j-dump.bat ให้ทำงานต่อ

2. สร้าง Batch File ชื่อ neo4j-dump.bat เอาไว้สำหรับส่งออกไฟล์ Neo4j จะมีคำสั่งที่เขียน ดังนี้

@echo off

for /f %%a in (‘powershell -Command “Get-Date -format ‘HH:mm:ss'”‘) do set “TimeDumpStart=%%a”

echo == Start Dump Database On %TimeDumpStart% == >> log.txt

neo4j-admin dump –database=neo4j –to=C:\neo4j_dump\backup_%date:~10,4%%date:~4,2%%date:~7,2%.dump > logtmp.txt 2>> log.txt & call neo4j-start.bat

อธิบายได้ดังนี้
– จะมีคำสั่ง dump ฐานข้อมูล Neo4j ออกมาเก็บไว้ที่ C:\neo4j_dump ตั้งชื่อไฟล์ว่า backup ต่อด้วยวันที่สร้าง เช่น backup_20220531.dump
– เสร็จแล้วจะมีการเรียก Batch Script neo4j-start.bat ให้ทำงานต่อ

3. สร้าง Batch File ชื่อ neo4j-start.bat เอาไว้สำหรับสตาร์ทการทำงานของ Neo4j จะมีคำสั่งที่เขียน ดังนี้

@echo off

net start neo4j >> log.txt

call backup-to-nas03.bat

อธิบายได้ดังนี้
– จะมีคำสั่งสตาร์ทการทำงานของ Neo4j
– เสร็จแล้วจะมีการเรียก Batch Script backup-to-nas03.bat ให้ทำงานต่อ

4. สร้าง Batch File ชื่อ backup-to-nas03.bat เอาไว้สำหรับส่งไฟล์สำรองข้อมูล Neo4j ไปเก็บยัง Nas Server Backup จะมีคำสั่งที่เขียน ดังนี้

@echo off

for /f %%a in (‘powershell -Command “Get-Date -format ‘HH:mm:ss'”‘) do set “TimeSendNas03Start=%%a”

echo == Start Send Backup File to Nas03 On %TimeSendNas03Start% == >> log.txt

net use z: \\nas03.psu.ac.th\backup2\docs /user:[user] [password] >> log.txt

“C:\Program Files\7-Zip\7z.exe” a -tzip z:\docs_db_%date:~10,4%%date:~4,2%%date:~7,2%.zip C:\neo4j_dump\backup_%date:~10,4%%date:~4,2%%date:~7,2%.dump >> log.txt

net use z: /delete /yes >> log.txt

for /f %%a in (‘powershell -Command “Get-Date -format ‘HH:mm:ss'”‘) do set “TimeEnd=%%a”

echo === Finish All Process Backup Neo4j On %DATE% %TimeEnd% === >> log.txt

xcopy log.txt C:\admin-scripts\logs\log_%date:~10,4%%date:~4,2%%date:~7,2%.txt*

Powershell.exe -executionPolicy ByPass -noexit -File C:\admin-scripts\sendmail.ps1

อธิบายได้ดังนี้
– จะมีคำสั่งสำหรับสร้าง Map Drive z: ที่ Mount มาจาก Nas Server Backup

   – /user:[user] [password] คือ parameter ที่เป็นการระบุชื่อผู้ใช้และรหัสผ่านที่มีสิทธิ์เข้าถึงพื้นที่ที่กำหนดไว้

– จะใช้โปรแกรม 7zip ทำการบีบอัดไฟล์ backup ที่ได้สร้างขึ้นจากข้อที่ 2 ตั้งชื่อว่า docs_db ต่อด้วยวันที่สร้าง เช่น docs_db_20220531.zip ไฟล์ดังกล่าวจะไปสร้างที่ Nas Server Backup โดยตรง
– เสร็จแล้วจะมีคำสั่ง Powershell เรียกไฟล์ sendmail.ps1 ให้ทำงานต่อ

5. สร้างไฟล์ Powershell ชื่อ sendmail.ps1 เอาไว้สำหรับส่งเมลแจ้งไปยังผู้ดูแลพร้อมกับส่ง log.txt ไปกับอีเมลด้วยเพื่อให้สามารถตรวจสอบได้

$DateTime = Get-Date -format ‘yyyy-MM-dd’
$From = “docsdb@psu.ac.th”
$To = “somchai.wa@psu.ac.th”
$Copy = “somchai.wanathanasin@gmail.com”
$Attachment = “C:\admin-scripts\log.txt”
$Subject = “Server DocsDB Backup Successfully on $DateTime”
$Body = “Dear Admin,

The System send log file backup docsdb.Please see details in attached file.

Thank you”
$SMTPServer = “smtp.psu.ac.th”
$SMTPPort = “25”

Send-MailMessage -From $From -to $To -Cc $Copy -Subject $Subject -Body $Body -SmtpServer $SMTPServer -Port $SMTPPort -Attachments $Attachment

stop-process -id $PID -Force

อธิบายได้ดังนี้
– ใน Powershell จะมีคำสั่งที่ใช้ในการส่งเมลคือ Send-MailMessage ซึ่งจะประกอบไปด้วยพารามิเตอร์หลายค่าที่จะต้องระบุให้ถูกต้อง โดยด้านบนจะมีการสร้างตัวแปรต่าง ๆ เพื่อเก็บค่าไว้ นำไปใช้ในการส่งอีเมล
– ข้อสังเกตคือ ด้านล่างสุดจะมีคำสั่ง stop-process -id $PID -Force คำสั่งนี้เป็นการสั่งให้ Powershell หยุดทำงานคือปิดตัวลงไปทันทีที่ทำงานเสร็จ เพราะเคยพบปัญหาว่าเมื่อมีการรัน Script นี้แล้ว Process Powershell จะยังคงเปิดอยู่ ทำให้ Script ทำงานผิดพลาด

6. จะสร้าง Batch File Script ที่ชื่อ backup-docsdb.bat เอาไว้สำหรับระบุพื้นที่เก็บ Script ไฟล์ทั้งหมดและทำการเรียกไฟล์ neo4j-stop.bat ให้ทำงานเป็นลำดับแรก จะมีคำสั่งที่เขียน ดังนี้

@echo off

cd C:\admin-scripts

call neo4j-stop.bat

อธิบายได้ดังนี้
– Script ที่เขียนทั้งหมดจะทำงานอยู่ที่ C:\admin-scripts รวมทั้ง log ไฟล์ก็จะเก็บอยู่ที่นี้

7. เพื่อให้กระบวนการสำรองข้อมูลทำงานอัตโนมัติทุกคืนตอนเวลา 02:00 น. โดยจะต้องไปสร้าง Task Schedule ใน Windows แล้วเรียกไฟล์ backup-docsdb.bat ให้ทำงานอัตโนมัติ

8. ตัวอย่างเมลที่ส่งมาแจ้งผู้ดูแล มีดังนี้

ขอจบการเขียนบทความแต่เพียงเท่านี้ หวังว่าผู้อ่านคงได้ประโยชน์ไปไม่มากก็น้อย

ขอบคุณครับ