ตัวอย่างงาน
ผมต้องการ Bakcup ไฟล์จาก โฟเดอร์ uploads
ที่มีไฟล์จำนวนมาก หลายล้านไฟล์ ไปยังปลายทางที่เป็นสื่อบันทึกความเร็วต่ำ
สิ่งที่ต้องรู้
- สื่อบันทึกความเร็วต่ำที่ผมใช้เป็น HDD จานหมุน ถ้านำไฟล์หลายล้านไฟล์ไปรวมกันอยู่โฟเดอร์เดียว เครื่องน่าจะไม่ไหวต้องใช้วิธีแบ่งแยกย่อย
- ต้องการมีบันทึกว่า ส่วนไหนย้ายสำเร็จแล้ว เพื่อที่จะได้เช็คตามหลัง หรือ รันซ้ำเฉพาะกลุ่มที่ไม่สำเร็จได้
- ไม่เอาไฟล์ที่เป็น thumbnail
- สร้างรายการไฟล์โดยแบ่งเป็นช่วง ในที่นี้แบ่งทีละ 3000 ไฟล์ หรือตามที่ต้องการ
- สร้างรายการไฟล์ทั้งหมด และไม่เอาชื่อไฟล์ที่มีคำว่า
thumbnail
mkdir filelist_upload cd uploads find ./ -type f | awk '!/thumbnail/' > ../fulllist.txt cd ..
- ก่อนใช้คำสั่งแบ่งรายการไฟล์ สามารถเอา
fulllist.txt
ไปเช็คกับอันที่เคยทำไปก่อนหน้าได้ เพื่อเอาเฉพาะไฟล์ที่เพิ่มเข้ามาใหม่ได้ - แบ่งรายการชื่อไฟล์ เป็นไฟล์ละ 3000 รายชื่อไว้ที่
filelist_upload/filelist_xxx
โดยที่ xxx ระบบจะเติ่มให้เองอัตโนมัติเป็นรูปแบบaa
tozzzzzzzzz
split -l 3000 fulllist.txt filelist_upload/filelist_
- สร้างคำสั่ง
sync.sh
ด้วย command ด้านล่าง
ระวังหาก run command นี้ซ้ำอาจมีไฟล์sync.sh
หลงเข้ามาในsync.sh
ก็ต้องลบออกด้วยไม่งั้นสริปจะติด loop ไปเรียกตัวเองซ้ำเรือยๆcd filelist_upload ls -1 |awk -F: '{printf "./bp3 %s\n",$1}' > sync.sh
- อย่าลืมเก็บไฟล์
fulllist.txt
ที่สร้างในตอนแรกไว้ด้วย สามารถเอาไปทำ ETL เพื่อคัดไม่ให้ backup ไฟล์ซ้ำได้ในอนาคต หรือ นำไปเช็คได้ว่าไฟล์ไหนเคยทำการ backup ไปแล้วmv ../fulllist.txt ./
- เตรียมไฟล์สำหรับช่วยในการทำสริปย่อย ในที่นี้จะใช้ชื่อว่า
bp3
อธิบาย ตัวอย่างไรไฟล์bp3
ตัวนี้จะถูกปรับrsync
ให้ทำงานได้เร็วและไม่ต้องสนใจอะไรมาก และมีการเก็บ log ของชุดไฟล์ที่rsync
ทำสำเร็จไว้ในlog3.txt
จำเป็นต้องใช้คำสั่งrsync
เป็นเพราะว่า ต้องแก้ไขปลายทาง และต้นทาง
bp3
echo "command ./bp3.sh $1" date time rsync -r --size-only --no-perms --no-owner --no-group -e 'ssh -p 22 -i /home/xxx/.ssh/no-p' --files-from=$1 --info=progress2 --stats --human-readable source@source_ip_domain:/home/xxx/app/uploads/ /mnt/h/uploads-$1/ && echo "$1 done" >> log3.txt date
- อย่าลืมย้ายโฟเดอร์
filelist_upload
ที่มีคำสั่งและ config ต่างๆ มายังเครื่องปลายทาง หรือ ปรับแต่งตามสะดวก - อย่าลืม
chmod +x bp3 sync.sh
- รันคำสั่ง
./sync.sh
ไฟล์คำสั่งที่จะให้ทำงาน สำหรับการรันซ้ำในเวลาอื่น เช่น VPN หลุดแล้วจะรันซ้ำ อันไหนสำเร็จแล้วก็ ลบๆไปบ้างก็ได้ จะได้เริ่มทำงานใหม่ได้เร็วๆ ไม่ต้องเสียเวลาไปเช็คกลุ่มที่สำเร็จแล้วซ้ำ
สำหรับไฟล์ log3.txt
จะถูกสร้างขึ้นอัตโนมัติ ตามตัวอย่างไฟล์ที่แนบมา เรียกไปเรื่อยๆ ด้วย a - z วนไฟเรื่อยๆ หากอันไหนไม่สำเร็จจะไม่มีอยู่ในนี้ ก็ไป run ตัวนั้นซ้ำตามหลังได้ เทคนิคที่ผมใช้คือ หา z อันสุดท้าย หารด้วย 26 ถ้าไม่มีเศษก็ถือว่าครบ บลาๆๆๆๆ