เรียนรู้เกี่ยวกับ GlusterFS และวิธีติดตั้ง GlusterFS บน Ubuntu 16.04

อยากเอา Storage จากหลาย ๆ เครื่องมารวมกัน เครื่องพังไฟล์ไม่หาย แถมเข้าจากที่ไหนก็ได้ต้องทำอย่างไร

            GlusterFS[1] คือ filesystem รูปแบบหนึ่งสามารถรวม Storage จากหลาย ๆ เครื่อง และทำการกระจายข้อมูลเก็บโดยมีระบบคล้าย ๆ RAID ที่ช่วยป้องกันเวลาเครื่องใดเครื่องหนึ่งพัง โดย Access ได้หลาย Protocol แล้วแต่ว่าการทำไปใช้งานกับอะไร
Gluster FS มีโครงสร้างระบบไฟล์ 2 ส่วน[2]คือ

  • Brick คือ Directory ที่อยู่บนแต่ละเครื่อง โดยจะสร้าง Partition เพิ่มจาก Partition ปกติ (จะ Disk ใหม่ Disk เดิมก็ได้) หรือจะใช้เป็น Directory ที่อยู่บน Partition เดิมก็ได้ โดย recommend เวลาสร้าง partition ให้เป็น xfs (รองรับ inode หรือจำนวนไฟล์ได้สูงกว่า ext4 ถ้าใช้ ext4 อาจจะเจอว่าเนื้อที่ยังไม่หมดแต่สร้างไฟล์ไม่ได้แล้วเนื่องจาก inode หมด) 
  • Volume คือชุดของข้อมูลที่ให้บริการ กล่าวง่าย ๆ คือ การเอา Brick จากแต่ละเครื่องมาให้บริการภายใต้ Volume นั้น ๆ (อาจจะเทียบได้ประมาณ เอา HDD หลาย ๆ ก้อนมารวมกันแล้วทำ RAID 5 ตั้งชื่อ Volume แล้วผู้ใช้ก็มีหน้าที่ใช้งานอย่างเดียว)

ประเภทของ Volume[3]         

  1. Distributed Glusterfs Volume : เป็น default volume ของ glusterfs คือการเมื่อสร้างไฟล์ลงใน volume นั้น ๆ ก็จะกระจายไปเก็บยัง Brick ต่าง ๆ ถ้าเครื่องไหน Brick พังไฟล์ในเครื่องนั้นก็จะพังไปด้วยเพราะไม่มีสำรอง ข้อดีที่คือประหยัดที่ ข้อเสียคือการป้องกันไฟล์เสียหายขึ้นอยู่กับ Hardware RAID เครื่องอย่างเดียว
  2. Replicated Glusterfs Volume : รูปแบบนี้จะมีการทำสำเนาข้อมูลไฟล์นั้น ๆ ไปยังอีกเครื่อง ซึ่งจะตั้งให้เก็บกี่สำเนาก็ได้แล้วแต่จะกำหนด ถ้า Brick ใดเสียก็สามารถ Access ไฟล์นั้นจากอีก Brick แทน


  3. Distributed Replicated Glusterfs Volume : รูปแบบนี้จะซับซ้อนขึ้นแต่ก็ประมาณ ไฟล์หนึ่งจะกำหนดให้เก็บกี่สำเนา ส่วนจะไปอยู่เครื่องใดบ้าง ระบบจัดการให้เอง แต่จำนวนสำเนาต้องสอดคล้องกับจำนวน Brick นั่นเอง (ผมไม่อธิบายมากนะครับ เพราะยังไม่ค่อยเข้าใจมากนั้น เพราะไม่ได้ลอง)


  4. Striped Glusterfs Volume : คือการใช้หลักการในข้อ 1 เพิ่มเติมคือหั่นไฟล์ย่อย ๆ และเก็บกระจาย


  5. Distributed Striped Glusterfs Volume : คือการใช้หลักการในข้อ 2 เพิ่มเติมคือหั่นไฟล์ย่อย ๆ และเก็บกระจายเช่นเดียวกัน


  6. Distributed Replicated and Striped Glusterfs Volume : เป็นรูปแบบทีทั้งหั่นไฟล์ และสำเนาไฟล์ ซึ่งจะดีที่สุด แต่จะเปลืองเนื้อที่ที่สุด (ไม่มีรูปตัวอย่าง)
    ถ้าสรุปง่าย ๆ Strip เพื่อให้ได้เนื้อที่เยอะ ๆ โดยเอามาจากหลาย ๆ node ในส่วนของ Replicate เพื่อป้องกันข้อมูลหาย ตัวอย่างวิธีการคิดขนาดในแต่ละ Volume Type[3]


ตัวอย่างการออกแบบผังการเชื่อมต่อเครือข่าย[4]         

 

ซึ่งที่แนะนำปกติจะให้มี Storage Network เพื่อใช้ในการคุยกันระหว่าง Block(ชื่อ Node) และมี Data Network สำหรับใช้ในการดึงข้อมูล และมี Management Network ไว้เผื่อในกรณีฉุกเฉิน Data Network ข้อมูลเต็ม จะได้เข้าไป Config อะไรได้

วิธีการติดตั้ง GlusterFS บน Ubuntu 16.04[5]

  1. ติดตั้ง ubuntu 16.04 ให้เรียบร้อย
  2. เพิ่ม ppa เข้าไปใน apt ดังนี้
    sudo apt install software-properties-common
    sudo add-apt-repository ppa:gluster/glusterfs-3.8
  3. จากนั้นทำการ Update และ ติดตั้ง Glusterfs Server
    sudo apt update
    sudo apt install glusterfs-server
  4. Start Glusterfs Server
    sudo service glusterfs-server start
  5. สุดท้ายต้องทำการเปิด Firewall ให้เครื่องที่จะให้ใช้งานเข้าถึงดังนี้ (ถ้าจะระบุ Port ให้ระบุ TCP 24007-24008 และ TCP 49152-49156)
    sudo ufw allow from 10.x.x.x
    sudo ufw allow from 192.x.x.x
    sudo ufw allow ssh
    sudo ufw default deny incoming
    sudo ufw default alllow outgoing
    sudo ufw enable

วิธีการสร้าง xfs partition บน Ubuntu 16.04[6]

  1. ทำการจัดการ Partition ด้วย fdisk (ในกรณีขนาดเกิน 2TB ต้องใช้ parted ซึ่งไม่ขออธิบายครับ) ในตัวอย่างเป็น sdb
    sudo fdisk /dev/sdb
    
  2. กด n (New Partition) ตามด้วย p (Primary Partition) จากนั้นกด Enter ไป 3 ครั้ง จบด้วยกด w (Write Partition)
  3. จากนั้นทำการสร้าง Partition ด้วย mk.xfs
    sudo mkfs.xfs /dev/sdb1
    
  4. จากนั้นทำการสร้าง path ที่ต้องการ mount ยกตัวอย่างดังนี้
    sudo mkdir /cluster
    
  5. ทำการแก้ fstab เพื่อให้ automount ทุกครั้งที่ boot ดังนี้
    sudo vim /etc/fstab
    
  6. เพิ่มข้อความท้ายไฟล์ประมาณนี้
    /dev/sdb1      /cluster      xfs     defaults     0      0
    
  7. สั่ง mount (ในกรณีที่ไม่ได้รีเครื่อง)
    sudo mount -a
    
  8. สามารถใช้งาน path ที่ mount ได้แล้ว

วิธี config glusterfs cluster node บน ubuntu 16.04

            โดยขั้นต้นในการสื่อสารระหว่าง node ต้องมีชื่อ node ซึ่งเครื่องแต่ละเครื่องจะจด domain ก็ได้ แต่ในที่นี้ใช้วิธีกำหนดไปใน host ไฟล์ (ป้องกัน dns หรือ data network มีปัญหา server ก็จะยังคุยกันได้ แต่ถ้าต้องการให้ client ใช้งานได้ต้องจดชื่อจริงทั้งหมด เพราะเมื่อ client ต่อก็จะมีการไล่ check ไปตาม node อื่น ๆ ด้วย ถ้าไม่จดชื่อจะ mount ไม่สำเร็จ) ทำได้ดังนี้

  • ทำการแก้ไขไฟล์ /etc/hosts
    sudo vim /etc/hosts
  • เพิ่มข้อความในส่วนของ ipv4 ประมาณนี้ครับ
    10.x.x.10 gluster-cluster1.x.y.z gluster-cluster1
    10.x.x.11 gluster-cluster2.x.y.z gluster-cluster2
    10.x.x.12 gluster-cluster3.x.y.z gluster-cluster3
    10.x.x.13 gluster-cluster4.x.y.z gluster-cluster4
    
  • ทำการค้นหา node อื่น ๆ ให้เข้ามาอยู่ใน cluster เดียวกันดังนี้ (เข้าทีหลังเครื่อง และค้นหาเฉพาะที่ไม่ใช่ node ตัวเอง) ยกตัวอย่างคำสั่งที่ใช้ใน gluster-cluster1 (ทำแค่ node เดียว)
    sudo gluster peer probe gluster-cluster2.x.y.z
    sudo gluster peer probe gluster-cluster3.x.y.z
    sudo gluster peer probe gluster-cluster4.x.y.z
  • คำสั่งที่ใช้ในการดูสถานะของ node ใน cluster ซึ่งเมื่อดูจาก node ที่ไม่ได้เพิ่มก็จะขึ้นสถานะเหมือนกัน
    sudo gluster peer status

  • คำสั่งสำหรับดู pool list (อีกมุมมอง) ใช้คำสั่งดังนี้
    sudo gluster pool list

  • ในกรณีที่ต้องการเอาเครื่องออก สั่งดังนี้
    sudo gluster peer detach <node> force

วิธีการสร้าง glusterfs volume บน ubuntu 16.04[2]

ยกตัวอย่างจากหัวข้อก่อนหน้า กำหนดให้ใช้ Volume Type แบบ Distributed Replicated and Striped Glusterfs Volume มี 4 node (4 brick) โดย Stripe ข้อมูล 2 node และกำหนดให้ Replicate จำนวน 2 ชุดข้อมูล (พังได้ 1 node ที่เป็นคู่กัน)

  • ทำการสร้าง Volume ตามเงื่อนไขข้างต้น
    sudo gluster volume create cluster1_volume replica 2 strip 2 \
    transport tcp \
    gluster-cluster1.x.y.z:/cluster \
    gluster-cluster2.x.y.z:/cluster \
    gluster-cluster3.x.y.z:/cluster \
    gluster-cluster4.x.y.z:/cluster \
    force

  • จากนั้นทำการ Start volume
    sudo gluster volume start cluster1_volume

  • ทำการตรวจสอบ volume ดังนี้
    sudo gluster volume list
  • อีกคำสั่งในการตรวจสอบทำได้ดังนี้
    sudo gluster volume status

  • ในกรณีที่ต้องการ Stop volume ใช้คำสั่งดังนี้
    sudo gluster volume stop cluster1_volume
  • คำสั่งในการลบ volume ดังนี้
    sudo gluster volume delete cluster1_volume

วิธีการ mount glusterfs จาก client บน ubuntu 16.04[7]

  • ให้สร้างเครื่อง client ubuntu 16.04 เพื่อเชื่อมต่อ glusterfs
  • ทำการติดตั้ง glusterfs-client
    sudo apt install glusterfs-client attr
  • ทำการทดสอบ mount ไปยัง glusterfs-server ตามที่ตั้งไว้ในหัวข้อข้างต้น (ต้องจดชื่อที่แล้ว ถ้าไม่ได้จดต้องบันทึก list server ทั้งหมดใน /etc/hosts เช่นเดียวกัน)
    sudo mkdir /glusterfs
    sudo mount -t glusterfs gluster-cluster1.x.y.z:/cluster1_volume /glusterfs
  • หลังจากนั้นจะได้ mount volume ซึ่งสามารถใช้งานได้เลยดังรูป
  • ในกรณีที่ต้องการสร้างเป็น fstab สามารถทำได้โดยแก้ไข /etc/fstab ดังนี้
    sudo vim /etc/fstab
  • ทำการเพิ่มท้ายไฟล์ประมาณนี้ครับ
    gluster-cluster1.x.y.z:/cluster1_volume /glusterfs glusterfs defaults,_netdev 0 0

ทดสอบใช้งาน GlusterFS

  • ทดสอบให้ gluster volume เป็นแบบ 2 stripe และ 2 replica และให้ client ต่อไปยัง cluster1 ด้วยการ mount
  • จากนั้นทำการทดสอบสร้าง image ขนาด 5.2 GB ด้วยคำสั่ง dd ที่ client ดังนี้

    sudo dd if=/dev/zero of=test.img bs=512K count=10000

    ผลลัพธ์ได้ดังรูป

              จะเห็นได้ว่า ระบบจะแบ่งไฟล์ออกเป็น 2.5G และทำการ replicate กระจายไปยังอีกคู่ node (1:2->3:4)

  • จากนั้นทดสอบปิด glusterfs server node 1 ที่ client กำลังต่ออยู่ดูว่ายังเข้าถึงไฟล์จาก node อื่นได้ไหม

                จากการทดสอบพบว่ายังสามารถเข้าถึงไฟล์ได้อยู่ ซึ่งเมื่อสั่ง netstat ดูจะพบว่าเครื่องยังต่อไปยัง cluster ที่เหลืออยู่

  • การทดสอบสุดท้าย ทดสอบสร้างไฟล์ขณะที่ glusterfs server node 1 ปิดอยู่ แล้วลองเปิด node 1 กลับเข้ามา active ดูว่าไฟล์จะมาไหม ผลที่ได้คือไฟล์ถูก sync หลังจาก เปิด node 1 ขึ้นมา

                ซี่งปกติแล้ว Port TCP 24007-24008 ใช้สำหรับตรวจสอบข้อมูลของ GlusterFS Server node ต่าง ๆ (เดาว่าถ้าเราปิด node 1 ถ้ามีการเพิ่ม node อาจจะไม่เห็น node ใหม่ ใครว่างลองทดสอบดูครับ) และ TCP 49152-49156 ใช้สำหรับโอนถ่ายข้อมูล

  • จากการทดสอบสร้างไฟล์บน server พบว่าไม่มีการกระจายไฟล์ (เนื่องจากสร้างโดยไม่ผ่าน glusterfs-client) เพราะฉนั้นควรสร้างผ่านการ mount เป็น glusterfs เท่านั้น

                หวังว่าไม่ยาวไปนะครับ ไม่อยากแยกหลายบทความเดี๋ยวจะงง เอาเป็นบทความเดียวจบเลยนะครับ ตอนหน้าน่าจะพูดถึง docker management tools อย่าง kubernetes หรือไม่ก็ rancher ครับ……

==================================
Reference :

[1] Gluster : https://www.gluster.org/

[2] How to install and use GlusterFS : https://www.rmuti.ac.th/user/prakai/w/images/9/9c/How-to-install-and-use-GlusterFS-ARIT-Net-3.pdf

[3] GlusterFS Storage Cluster on CentOS 7 : https://wiki.centos.org/HowTos/GlusterFSonCentOS

[4] Gluster Docs – Architecture : http://gluster.readthedocs.io/en/latest/Quick-Start-Guide/Architecture/

[5] Gluster Docs – Install Gluster : https://gluster.readthedocs.io/en/latest/Install-Guide/Install/

[6] Format a Volume as XFS in Debian and Ubuntu : https://linhost.info/2012/08/format-a-volume-as-xfs-in-debian-and-ubuntu/

[7] Install and Configure GlusterFS on Ubuntu 16.04 / Debian 8 : http://www.itzgeek.com/how-tos/linux/ubuntu-how-tos/install-and-configure-glusterfs-on-ubuntu-16-04-debian-8.html