รีวิว Backblaze กับ Jottacloud อย่างย่อ

เนื่องจาก FileSystem มีปัญหา (คิดว่าไม่ใช่ HardDisk เพราะ SMART test บอกปกติดี อาจจะเพราะใช้ Windows Storage Space + WSL2 + Window Update ละมั้ง) ทำให้จำเป็นต้องกู้ข้อมูลจาก Cloud มา เลยจะมารีวิวสั้นให้ฟังกันครับ

มารู้จักกับ Backblaze กับ Jottacloud กันก่อน

Backblaze และ Jottacloudเป็นบริการสำรองข้อมูลใน Cloud ที่ราคาค่อนข้างถูก คล้ายๆกับพวก Google Drive, OneDrive หรือ Dropbox แต่มีฟังชั่นต่างๆน้อยกว่า เช่นไม่มีระบบการแชร์ไฟล์ให้คนอื่น หรือระบบ Sync จากโปรแกรมเป็นแบบทางเดียวคือเอาจากเครื่องขึ้น Cloud แต่ไม่ได้เอาจาก Cloud ลงมาบนคอมพิวเตอร์ และข้อดีคือทั้ง 2 บริการเป็นแบบจ่ายคงที่ต่อเดือน แต่ได้ Unlimited Storage คือ ไม่จำกัดขนาดข้อมูลที่เราสามารถสำรองได้ (แต่ Jottacloud เขียนบอกว่าความเร็วการ Upload จะลดลงเมื่อขนาดมากกว่า 5 TB) และมีระบบกู้ไฟล์ที่ถูกลบได้ใน 30 วัน (Backblaze สามารถซื้อเพิ่มได้ในราคา 2 USD / เดือน เพื่อขยายเวลาเป็น 1 ปีได้) มีระบบกู้ข้อมูลไฟล์ที่ถูกแก้ไขได้ (ถ้ามีการแก้ไขไฟล์ทับ สามารถกู้เอาไฟล์ก่อนแก้ไขมาได้)

สาเหตุที่ผมต้องใช้ระบบสำรองข้อมูลอันนี้

เนื่องจากว่าข้อมูลต่างๆของผมนั้นมีความสำคัญ (จริงๆมีแค่บางส่วนแหละ แต่อยากเก็บหมด) จึงไม่อยากให้หายไป ถึงแม้ว่าผมจะทำ RAID 5 เพื่อป้องกัน HardDisk พังไว้แล้ว (จริงๆคือ Windows Storage Space Parity Mode + 3 HardDisk) แต่มันไม่ได้ป้องกันในเรื่องแบบที่ผมกำลังเจอ ณ ตอนนี้คือ FileSystem Corrupted คือมันพังระดับ Software หรือในกรณีที่โดน Ransomware เป็นต้น

จริงๆแล้วเราสามารถใช้ Google Drive, OneDrive หรือ Dropbox แทนได้ แต่หากขนาดข้อมูลเกิน 1 TB แล้วละก็ จะหาที่เก็บได้ยากมากเลยครับ โดยราคารายเดือนจะเป็นตามนี้ครับ (ไม่นับราคา Family เพราะ Account Sync จะมีแค่อันเดียว)

  • Jottacloud ราคาจะอยู่ที่ 9.9 USD ต่อเดือน (เงินไทยประมาณ 350 บาท) ไม่จำกัดขนาด (ฟรี 5 GB ตลอดอายุการใช้งาน)
  • Backblaze ราคาจะอยู่ที่ 6 USD ต่อเดือน (เงินไทยประมาณ 210 บาท) ไม่จำกัดขนาด (มีทดลองใช้ 15 วัน)
  • Google Drive ราคาจะอยู่ที่ 350 บาทต่อเดือน เก็บได้แค่ 2 TB และโดดไป 10 TB ที่ราคา 1750 บาทต่อเดือนเลย
  • OneDrive ราคาอยู่ที่ 209.99 บาทต่อเดือน เก็บได้แค่ 1 TB
  • Dropbox ราคาจะอยู่ที่ 11.99 USD ต่อเดือน (ราคาไทยประมาณ 419.65 บาท) เก็บได้ 2 TB หรือ 19.99 USD ต่อเดือน เก็บได้ 3 TB (ราคาไทยประมาณ 699.65 บาท)

จะเห็นว่าส่วนใหญ่จะได้แค่ประมาณ 1-2 TB เท่านั้น ถ้ามากกว่านั้นจะเริ่มใช้ลำบากทันที เพราะต่อให้ใช้ OneDrive Family Plan ก็ยังมีการจำกัดต่อ Account อยู่อีกที ส่วนอันอื่นที่เดิน 2 TB ก็ราคาโดดไปเลย (จริงๆตอนมาทำเพิ่งเห็นว่า Dropbox มี 3 TB ด้วย)

เรื่องระบบการสำรองข้อมูล

Backblaze

สำหรับ Backblaze นั้นใช้งานค่อนข้างง่าย (มั้ง จำไม่ค่อยได้ครับ 55+) โดยแค่ลงโปรแกรม Sync จากนั้น Login เลือก Drive ที่จำสำรองข้อมูล (ถ้าจำไม่ผิดไม่สามารถเลือก External Harddisk ได้) จากนั้นที่เหลือก็แค่รอระบบค่อยๆอับโหลดขึ้นไปให้ครบก็พอ แต่สิ่งที่ต้องระวังคือการตั้งค่าเริ่มต้นของ Backblaze จะไม่ได้อับโหลดทุกไฟล์ขึ้นไป ต้องเข้าไปในหน้า Setting > Exclusions เพื่อดูรายละเอียดต่างๆ เราสามารถปรับเพิ่มลดได้ ว่าจะไม่สนไฟล์นามสกุลไหนหรือโฟลเดอร์ไหนบ้าง แนะนำให้เช็คในส่วนตั้งค่ายกเว้นนามสกุลนะครับ เพราะถ้าจำไม่ผิดมันจะมี exe, dll, iso อยู่ ซึ่งบางคนอาจจะอยากให้อับโหลดไปด้วย

Jottacloud

สำหรับ Jottacloud นั้นใช้งานง่ายเช่นกัน เหมือน Backblaze เลย ลงโปรแกรม Login แต่สิ่งที่ต่างจาก Backblaze คือโดยเริ่มต้นนั้น Jottacloud จะ ไม่ได้เลือก Drive และโดยเริ่มต้นจะสำรองแค่บางส่วนเท่านั้น ต้องกด Add Folder แล้วเลือก Drive ที่อยากสำรองข้อมูลขึ้นไปแทน โดย Jottacloud สามารถเลือก Exclude subfolder ได้อยู่ (เลือกที่จะไม่สำรองข้อมูลให้กับโฟลอเดอร์ที่เรากำหนด) แต่จะสำรองทุกอย่างที่เราไม่ได้เลือก Exclude ไว้

เรื่องระบบการกู้ข้อมูล

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

Backblaze

การกู้ข้อมูลของ Backblaze มี 4 วิธีคือ

  • Download Zip file โดยระบบจะให้เราดาวโหลดไฟล์ ตามที่เราเลือก โดยขนาดรวมต้อครั้งต้องไม่เกิน 500GB และทำได้พร้อมกันสูงสุดได้ไม่เกิน 5 ไฟล์ เก็บรักษาไว้ 7 วัน
  • Save Files to B2 (zip เหมือนกัน) โดยระบบจะทำการ Upload ไฟล์ไปที่ระบบ B2 (คิดง่ายๆ ก็เหมือนกับ AWS S3 หรือ Space ของ Digitalocean นั่นแหละ) ไม่จำกัดขนาดไฟล์ (มั้่ง) โดยในคู่มือระบุว่าคาดหวังว่าจะได้ความเร็วที่ 1 GB / นาที (แต่มันก็ขึ้นกับขนาดและจำนวนไฟล์) และมีคำแนะนำว่าถ้าขนาดมากกว่า 1 TB แนะนำให้แยกไฟล์ (มีค่าใช้จ่ายในการเก็บไฟล์ และคิดตาม Bandwidth ที่ดาวโหลด)
  • USB Flash Drive ตามชื่อเลยครับ เค้าจะส่ง Flashdrive ขนาดสูงสุด 256 GB แต่มีค่าใช้จ่าย 99 USD ต่อครั้ง ซึ่งสามารถขอคืนได้ ถ้าส่ง Flashdrive คืนใน 30 วันหลังจากได้รับ
  • USB Hard Drive ตามชื่อเหมือนข้อบนเลย เค้าจะส่ง Harddisk มาให้ขนาดสูงสุด 8 TB แต่มีค่าใช้จ่าย 189 USD ต่อครั้ง ซึ่งสามารถขอคืนได้ ถ้าส่ง Harddisk คืนใน 30 วันหลังจากได้รับ

Jottacloud

ข้อมูลตรงนี้อาจจะไม่ครบนะครับ เป็นเท่าที่ผมเห็นมีดังนี้

  • Download ผ่านหน้าเว็บ
  • Download ผ่านทาง App ของมันเอง

สั้นและง่าย ไม่มีอะไรรายละเอียดมากมายนักครับ

ประสบการณ์การกู้ข้อมูล

เนื่องจากผมต้องการกู้ข้อมูลจาก Filesystem มีปัญหา แต่ไฟล์ทั้งหมดมีขนาดใหญ่มาก ประมาณ 2.7 TB เนื่องจากผมไม่รู้ไฟล์ไหนเสียบ้าง เลยต้องโหลดมาหมดเลยจ้า

Backblaze

ตัวเลือกที่ผมจะเลือกตอนแรกคือ Download Zip file แต่ไม่สามารถทำได้เนื่องจากขนาดใหญ่เกิน จึงเลือก Save Files to B2 ต้องยอมรับว่าโง่จริง แทนที่จะเลือกแบ่งดาวโหลด 5 ไฟล์ แล้วเอาเศษนิดหน่อยขึ้น B2 ดันเอาขึ้น B2 หมดเลย เลยต้องเสียค่าใช้จ่ายไปนิดหน่อย

ความเร็วในการดาวโหลดคิดว่าน่าจะใช้ได้เลย (พอดีเนื้อที่ผมไม่พอ เลยไปใช้ Google Compute Engine สำหรับ Download มาก่อน เพื่อเอามาเช็ค CRC32 เทียบกับข้อมูลใน Local อันนี้ก็โง่อีก ผมมี HDD 4 TB ที่เป็นที่เก็บไฟล์ชั่วคราว สำหรับ Build RAID ใหม่จากเหตการณ์นี้) ได้ความเร็วต่อไฟล์ 30 – 50 MBps (B = Bytes) โดยเช็คจากที่ Chrome บอกมานะครับ

แต่ความเร็วในการอับโหลดขึ้น B2 นี่ค่อนข้างช้าเลยครับ ความเร็วเป็นดังต่อไปนี้

  • กด Backup ไฟล์ทั้งหมด ขนาด 2969.2 GB จำนวนไฟล์ 380841 ไฟล์ (ตบมาจาก JSON ที่ API ของ backblaze ส่งมา) สั่งไปตั้งแต่ วันที่ 2020-07-23 เกือบๆเที่ยงคืน จนตอนนี้ 2020-07-28 ยังไม่เสร็จครับ
  • backup1 (เนื่องจากข้างบนรอนานไป เลยแบ่งมันเป็น 3 ไฟล์) ขนาด 1,519.5 GB จำนวนไฟล์ 12514 สั่งไปวันที่ 2020-07-24 เสร็จประมาณ 2020-07-26
  • backup 2 ขนาด 708.2 GB จำนวนไฟล์ 144012 สั่งไปวันที่ 2020-07-24 เสร็จประมาณ 2020-07-25
  • backup 3 ขนาด 476.3 GB จำนวนไฟล์ 224719 สั่งไปวันที่ 2020-07-24 เสร็จประมาณ 2020-07-25

แต่ก็ดันมีปัญหาเกิดขึ้น เนื่องจากครั้งนี้ผมเขียนโปรแกรมสำหรับเทียบไฟล์ที่มีในเครื่องกับที่มีบน Cloud เลยรู้ว่ามันตอนมันเอาไฟล์ใส่ Zip แล้วอับโหลดขึ้น B2 มันอับไฟล์มาไม่ครบ คือในระบบมองเห็นและ Download ได้จากหน้าเว็บ แต่ใน Zip มันไม่มีเฉยเลย (EDIT อาจจะติด maximum path length ของ zip เลยใส่มาไม่ได้ เพราะชื่อไฟล์ยาวเกิน)

สรุปคือตอนกู้ของ Backblaze นี่ค่อนข้างช้า และแย่พอสมควรเลย ไม่แน่ใจว่าถ้าสั่งมาเป็น harddisk จะได้ครบไหมนะครับ

Jottacloud

อันนี้ทำผมสับสนพอสมควรเลย เพราะว่าโปรแกรมมันไม่ได้ Sync เหมือน Google Drive, OneDrive หรือ Dropbox คือผมกด Restore ใน Web Console แล้ว แต่มันไม่ Sync ลงมา ตอนแรกนึกว่าตัวไฟล์บน Cloud ก็พังไปแล้วด้วย แต่จริงๆคือไม่ มันแค่ Restore จาก Trash กลับไปที่บน Cloud แต่ข้อมูลในเครื่องไม่มี

ความเร็วในการกู้ข้อมูลจัดว่าค่อนข้างเร็วเลย ผมใช้โปรแกรมของมันสั่ง Download ไฟล์ไปที่ Harddisk อีกตัว ถ้าเป็นไฟล์ใหญ่ผมได้ความเร็ว 150+ Mbps เลยครับ (อันนี้ใช้เฯ้ตบ้านความเร็ว 200 Mbps มันเลยต่างจากข้างบนที่เอาไปลง Google Cloud) แต่ไฟล์เล็กๆอาจจะช้ากว่านี้ครับ

เพิ่มเติมคือ Jottacloud มีฟีเจอร์นึงที่ดีมากคือถ้าเราลบไฟล์เป็นจำนวนมาก มันจะส่งเมลมาบอก (OneDrive ก็มีถ้าลบไฟล์ใน Cloud เป็นจำนวนมากมันจะส่งเมลบอก แต่เจ้าอื่นไม่แน่ใจ ยังไม่เคยเห็น) ซึ่งผมชอบมากเลย เพราะมันทำให้ผมรู้ว่า Drive D ผมมีความผิดปกติเกิดขึ้นครับ

Script สำหรับ Backup ข้อมูล ย้อนหลัง 7 วัน

อันนี้เป็น Script สำหรับ Backup ข้อมูลผ่าน rsync โดย Backup ย้อนหลัง 7 วัน (สามารถปรับได้)

สิ่งที่ต้องเตรียมก่อนใช้

  1. Linux/Unix Only
  2. ติดตั้ง rsync
  3. เครื่อง Backup ต้องสามารถ SSH Without Password เข้าเครื่องเป้าหมายได้ (ลองอ่านอันนี้ หรืออันนี้ดูครับ)
  4. เครื่อง Backup ต้องติดตั้ง PHP (ไม่จำเป็นต้องมี Apache)
  5. เครื่องเป้าหมายควรมี MySQL Tools (พวก mysqldump เป็นต้น) ในกรณ๊ต้องการสำรองข้อมูลจาก MySQL

Script ที่ใช้

<?php
chdir(__DIR__);

$SOURCE_HOST = '[email protected]';
$SOURCE_PATH = '/home/user/';

$MYSQL_USERNAME = "DATABASE_USERNAME";
$MYSQL_PASSWORD = "DATABASE_PASSWORD";

$dateFormat = 'Ymd';

$before = date($dateFormat,strtotime('yesterday'));
$dateKey = date($dateFormat);
$delDate = date($dateFormat,strtotime('-7 days'));

$excludeDirs = [
	'cache1/*',
	'cache2/*',
];

system("ssh {$SOURCE_HOST} \"mysqlcheck --all-databases -u{$MYSQL_USERNAME} -p{$MYSQL_PASSWORD} -r\"");
system("ssh {$SOURCE_HOST} \"mysqldump -u {$MYSQL_USERNAME} -p{$MYSQL_PASSWORD} --lock-tables=false --all-databases  | gzip --rsyncable -f -c - > {$SOURCE_PATH}/backupdb/backup.sql.gz\"");

system("cp -al {$before} {$dateKey}");

$excludeStr = '';
foreach($excludeDirs as $dir){
        $excludeStr .= " --exclude '{$dir}'";
}

system("rsync -a --delete {$excludeStr} {$SOURCE_HOST}:{$SOURCE_PATH} {$dateKey}/");

if(!empty($delDate)){
system("rm -rf ./{$delDate}");
}

echo "COMPLETE";

อธิบายคำสั่ง

บรรทัดที่ 1 – 14 เป็นการตั้งค่าเครื่องเป้าหมาย ว่าจะ backup จาก host ใดและ path ใด ข้อมูลการเข้าถึง Database และจำนวนวันที่ backup ย้อนหลัง โดยสามารถตั้งวันที่ backup สูงสุดได้ในบรรทัดที่ 14

บรรทัดที่ 16-19 เป็นการตั้งค่าว่าจะไม่ backup file ใด้บ้าง เช่นพวก cache เราอาจจะไม่ backup เป็นต้น

บรรทัดที่ 21-22 เป็นการสั่ง backup ฐานข้อมูล ให้ออกมาเป็น file.sql

บรรทัดที่ 24 เป็นการสั่งคัดลอก folder เมื่อวาน แบบ Hardlink มาเป็นโฟลเดอร์วันที่ปัจจุบัน โดยการทำ Hardlink จะช่วยประหยักเนื้อที่ได้มากในกรณีที่ไม่เปลี่ยนแปลง เช่นถ้าเราสั่งคัดลอก a.zip ขนาด 1GB ไปเป็น b.zip แบบ Hardlink ขนาดที่จะถูกใช้บน Harddisk จะถูกใช้แค่ 1GB เท่านั้น ไม่ใช่ 2GB แบบปกติ เพราะไฟล์เก็บที่เดียวกัน (อ่านเพิ่มเติมได้ที่นี่)

บรรทัดที่ 26-29 เป็นการสร้าง exclude parameter หรือก็คือเอา บรรทัด 16-19 มาแปลงให้ rsync เข้าใจได้

บรรทัดที่ 31 เป็นการสั่ง rsync จากต้นฉบับมาโฟลเดอร์ปัจจุบัน โดยจะดึงเฉพาะไฟล์ที่มีการเปลี่ยนแปลงหลังจากเมื่อวานเท่านั้น ทำให้ Backup ได้อย่างรวดเร็ว

บรรทัดที่ 33-35 คือสั่งให้ลบโฟลเดอร์ backup ที่เกิน 7 วันทิ้ง

คำแนะนำอื่นๆ

อย่าใช้ script นี้ผ่าน http เพราะมันจะ timeout ให้ตั้ง cronjob เป็นประมาณ php backup.php

ในกรณที่ MySQL เราใช้แต่ InnoDB และไม่มี MyISAM สามารถเอาบรรทัดที่ 21 ออกได้ (บรรทัด mysqlcheck) เพราะ check ไปก็ทำไรไม่ได้ InnoDB ไม่ Support

ในบรรทัดที่ 22 เราจะเห็นว่ามี –lock-tables=false ซึ่งหมายถึงเราจะไม่ lock table ในการเขียน ซึ่งทำให้เว็บสามารถทำงานได้ปกติตอน dump ข้อมูลออก แต่ข้อมูลที่ได้อาจจะไม่ตรงกัน เช่น table a ถึก dump เสร็จแล้ว ในระหว่างที่ dump table b ออกมา มีการเขียนที่ table a และ c ซึ่ง table c ต้องใช้ข้อมูลจาก table a แบบนี้จตะเกิดปัญหาได้ เพราะ table c ที่ถูก dump มีข้อมูลบางอย่างที่ต้องพึ่ง table a แต่ตอน dump table a ตัว table a ยังไม่มีข้อมูลนั้น ทางแก้มี 2 แบบ

  1. ตั้ง –lock-tables=true
  2. ในกรณีที่มีแต่ InnoDB ให้ใช้ –single-transaction แทน