จดๆจาก Live ไขข้อสงสัย Database บน Container ควร หรือ ไม่ควรทำ

สำหรับ Live เต็มๆ ตามนี้เลยครับ https://www.facebook.com/Sikiryl/videos/1209836093389959

วันนี้มี Speaker 3 ท่านมาจัด Live เฉพาะกิจครับ คุณเดียร์ (Opsta) / คุณโจโจ้ (JumpBox) / คุณดำรงศักดิ์ (ดำทำไร)

มันเป็นประเด็นที่ผมสงสัยเหมือนกัน เพราะหลายปีก่อน ผมเคยจะเอา DB ขึ้น Container แต่เจอ DBA มาเบรกช้าก่อนนนนน มันช้ามากนะ Container และจบอยู่ที่ VM ครับ

ก่อนจะเริ่ม คุณเดียร์เคยลอง docker 0.6 10 ปี ม้้ง เคยเอา db ลง docker แต่เป็นบทเรียนที่ 1 แยก Data ออกมาให้ชัดเจน 2 อย่างทำ snapshot db ด้วยการ docker commit มันไม่ดี มีเคส data corrupt และ คุณโจโจ้มันเป็นคำถาม 10 ปีที่แล้ว ตอนปี 13 มีคนถาม และปี 24 ก็ยังมีคนถาม

ก่อนจะถกเรื่อง Performance ต้องเข้าใจก่อนว่า Run Container ที่ไหน

  • ต้องดูก่อนเรา Run Container บนไหน Bare Mental / Virtualization หรือ ลอง Test Local Docker Desktop มีหลายเคส Load Test กับ Docker Desktop มันมี VM คั่นกลางนะ เข้าใจผิด อาจะตีความผิดได้ ว่ารันแบบอื่น stack อื่น ต้องได้ผลเหมือนกัน
  • ส่วน Bare Mental / Virtualization การทำงานบน Virtualization มันมีผ่านตัว Hypervisor นะตัว Hypervisor มาแบ่ง resource แล้วถ้ามีดูอีกว่า มันแบ่งลง แต่ตัวยังไง VM > Container ยังไง
  • อีกภาพเราจะลองผิดไป ภาพที่คุณเดียร์เสนอ Container Engine ไม่ได้ เพิ่มให้งานมันช้านะ มันเป็นตัวประสาน (ผมเองอาจจะต้องแก้ Slide ที่สอนเหมือนกัน วาดเป็นอีกชั้น) แล้วที่เหลือ Container มันจัดการคุยกับ Kernel เองนะ อันต้องไป proof
    - ถ้าเราไป Kill Process Container Engine แล้วมันยังอยู่ไหม
    - หรือ ลอง htop -t เมื่อก่อนจะอยู่ใต้ Docker ตอนนี้หละ ? เดี๋ยวน่าจะได้ลองใกล้ๆนี้ ช่วงนี้ VM โดนกินเรียบ T_T

Host Network / Expose Post มีผลต่างกันไหม

ตอนสร้าง Container มันจะได้ network namespace มาด้วยนะ

  • Expose Port container > network container > container engine bridge > nat (IP Table) >Lan card เครื่อง มันช้ากว่า Host Network มี Layer มาขวางเพิ่ม ก็เพิ่ม Latency
  • Host Network - network namespace ของ Lan card เครื่อง ข้อดีพุ่งตรง แต่เราจอง Port ไว้คนเดียวเลยนะ คนอื่นออก 80 ไม่ได้ และเปิดประตูสู่ข้างนอกแล้ว

แต่ต้องแลกเรื่องการจัดการ และ Security ด้วยนะ

ปกติ Container Run แล้วของหาย ?

ต้องเข้าใจการงานของ Container ก่อน มันแยก 2 ส่วน Image > c group ns > read write layer > intance ปกติตัว container มันทำงานบน read write layer ถ้าลบ mark flag

จากนั้นพอเข้าใจการทำงานแล้ว read write layer ถ้าปิด Stop มันก็หาย ต้องหาทางเอาออกมามี 3 ท่า bind mount เอา path / volume / tmpfs (ใช้ RAM) อันหลังเราเองก็ไม่เคยใช้

ถ้าอยากรู้ว่าเก็บที่ไหน inspect > docker inspect เลย

ถ้ามองในมุม performance ขึ้นกับรูปแบบการ mount ถ้าอยากเร็วขึ้น เลือก Disk ที่ดีขึ้นมาแก้ปัญหาได้

Maintain (Configuration) ?

มันเหมือนกัน ก่อนใช้ Container อยู่ตรงไหน เวลาเอามาใช้ มีเหมือนกัน โดยท่าที่ทำได้

  • dockerfile ใหม่ กำหนด env ทีต้องการลงไปแล้ว Build อาจจะมีปัญหา image source
  • mount config อันนี้ดีนะ แก้ไข config และ restart ได้

Note แต่เราต้องดู Official Image Doc ก่อนทำนะ

Maintain (Update / Patch) ?

  • แยก Data ออกมาก่อนนะ
  • อ่าน Release Note ก่อน ว่ามีอะไร Breaking Change ไหม ? คุณโจ้เคยมีแชร์ว่าลอง MySQL 7 > 8 เจอ Breaking Change ลองขยับตาม minor version //อ่านเพิ่มเติม Semantic Version
  • อย่าใช้ Tag Latest (Latest วันนี้ กับเมื่อวานไม่เหมือนกัน) ฟังแล้วขำจริง นอกจาก Container มีผลหมด พวก Lib ก็เป็นเหมือนกัน
  • ทดสอบก่อน Run นะ โดย dump data มาอีกที cp นั้นแหละ แล้วเอา Container ตัวใหม่ //ที่เคยลองเอา nginx คั่นไว้ แล้วให้มี redirect เก่าใหม่
  • ทำจริง ต้องทำ plan downtime / rollout / rollback ด้วย จากนั้นลุยจริงตามที่เทส

Container มาช่วงลดเวลาจะ จากเดิมต้องขอ VM IP มาทำ มันนาน เรามาเปลี่ยน image แทน ไม่ต้องมา Run Path Command ขยับ อารมณ์เหมือนสลับเครื่องยนต์ รวมถึงเรื่อง rollout / rollback

Backup / Restore ?

ถ้าเป็น VM เรา Snapshot ทั้ง VM แต่ถ้าเป็น Container ต้อง Design Path ให้ชัดเจน รวมถึงพฤติกรรมแต่ละ DB บางเจ้าอย่าง mysql ถ้า dump มัน อาจจะ lock และเขียนไม่ได้นะ หรือ ลองไปใช้ Tool ตัวอื่น percon dump เป็นต้น

หรือ เจ้าอื่นๆ อย่างผมเองมีอีก Keyword online/offline backup

ตอน Mount อาจจะต้องดูที่สิทธิ และ permission ด้วยนะ

High Availability ?

ถ้าบน VM ทำยังไง บน Container จะคล้ายๆกัน //เออจริง เคยลอง MSSQL DB2 คล้ายกัน อ่าน doc ให้ชัดเจน

Scale ?

ไม่ต่าง process บนเครื่อง / container ได้ scale up (เพิ่ม spec) / scale out (เพิ่ม Node)

แต่ Query / Schema ต้องออกมาแบบมาดีด้วย

พัง แล้วซ่อม ยังไง ?

คล้ายกับ Linux เลย ใน Session ยกตัวอย่างเคสเรื่องสิทธิ ถ้ามีความเข้าใจ หรือปรับสิทธิมากกว่าปกตินิดนึง เพื่อเอา Data ออกมาก่อน และปรับระบบให้มันเข้าที่เข้าทางได้

สรุป ไม่ผิด
- ถ้าเรา Control มันได้
- เข้าใจ Context ในการใช้งานของมันในแต่ละสถานการณ์
- และ มีคนดูแลต่อ เข้าใจและมีใจพร้อมลุยไปกับมัน งานยากการสอน ส่งต่อจัดการดูต่อไป

ที่ผมเข้าใจแบบนี้นะ

หลายเคสที่เราได้ยินว่า Database ที่เรียนๆ ยังไม่ต้องใช้ Container เพราะตามสรุปข้างบน เรายังใหม่ อาจจะไม่เข้าใจมาพอ อารมณ์แบบเดวธาตุไฟเข้าแทรก

Reference


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.