เมื่อ Cluster = เครื่องที่บ้าน + เครื่องบนคลาวด์

เรื่องมีอยู่ว่า แต่ไหนแต่ไรผมให้บริการหน้าเว็บต่างๆ ผ่านทางเน็ตบ้านกับ Raspberry Pi มาตลอด และเพราะเป็นเน็ตบ้านและอยู่ที่บ้าน มันก็จะได้รับผลกระทบจากปัญหาจำพวกไฟดับ/เน็ตหลุด/ฯลฯ อยู่เรื่อยๆ ดังนั้น ในเดือนพฤษจิกายนปีที่แล้ว ผมจึงตัดสินใจเช่าเครื่อง VPS จาก DigitalOcean เพื่อช่วยให้บริการหน้าเว็บในเวลาที่เครื่องที่บ้านมีปัญหา แต่ถ้าผมจะย้ายทุกอย่างมาที่ VPS เครื่องนี้ แล้วผมจะมี Raspberry Pi ไปเพื่อ?????

เครื่องที่บ้านต้องมาก่อน

ดังนั้นมันก็เลยมีสูตรอีรุงตุงนังที่ทำให้เครื่อง Raspberry Pi ที่บ้านกับ VPS ที่ DigitalOcean ทำงานร่วมกันได้ โจทย์ก็คือ VPS จะเป็นตัวช่วยในการให้บริการเมื่อที่บ้านมีปัญหา ไม่ใช่แทนที่ Raspberry Pi ผมจึงออกแบบให้ Raspberry Pi เป็นเครื่องหลัก เครื่อง VPS เป็นเครื่องรอง (แม้ว่า VPS จะเร็วกว่ามากก็ตาม….)

เครือข่ายเสมือน

เริ่มจากการสร้างเครือข่ายเสมือนขึ้นมาระหว่างเครื่อง 2 เครื่องนี้ เพื้อให้เสมือนอยู่ในเครือข่ายเดียวกัน และเป็นการเข้ารหัสการคุยกันทั้งหมดระหว่าง 2 เครื่องนี้ด้วย

ซึ่งแน่นอน ให้ Linux คุยกับ Linux ก็ต้องใช้ OpenVPN อยู่แล้ว เราก็ตั้ง OpenVPN Server ที่ Raspberry Pi ขึ้นมา การตั้งค่าก็เหมือนกับเซ็ตอัพทั่วไป ต่างกันแค่ว่าของเรานี่จะบังคับไอพีคงที่สำหรับเครื่อง VPS ให้ไม่เปลี่ยนไปเปลี่ยนมา จะได้ตั้งค่าซอฟต์แวร์อื่นต่อไปได้ง่าย

File synchronization

จากนั้น เนื่องจากเว็บ WordPress จะต้องมีการอัพโหลดไฟล์เกิดขึ้น ดังนั้น จะต้องมีระบบที่ทำให้ไฟล์ทั้ง 2 เครื่องตรงกัน ตอนแรกผมมองไปทาง GlusterFS แต่พบว่าระบบนี้ไม่เหมาะที่จะใช้กับเครื่องที่อยู่ห่างกันและมี Latency สูงๆ ทำให้เวลาอ่านไฟล์จะนานมาก ก็เลยล้มเลิกไป

ผมจึงมองหาทางเลือกอื่น ที่จะทำให้ไฟล์อัพเดทตรงกันได้ โดยที่ไม่กระทบเวลาในการอ่านไฟล์ สุดท้ายก็มาลงเอยกับ Csync2 + lsyncd ซึ่ง Csync2 ทำให้ไฟล์ตรงกัน แต่มันไม่สามารถตรวจจับการเปลี่ยนแปลงได้ lsyncd จึงมารับหน้าที่นี้แทน

Database Replication

เนื่องจาก WordPress เนี่ยใช้ฐานข้อมูลเป็นหลักๆๆๆ เลย ดังนั้นเราก็ต้องตั้งค่า MySQL ด้วย ครั้นจะให้เครื่อง VPS เชื่อมต่อมาที่เครื่อง RPi ทุกครั้งก็เหมือนจะไม่ตอบโจทย์เวลาเครื่อง RPi ต่อไม่ได้ซักเท่าไหร่ ผมก็เลยตั้ง MySQL server ที่เครื่อง VPS ด้วย

ตอนแรก ผมก็ว่าจะทำแบบ Master-Master แต่ผมลองค้นข้อมูล ผมพบว่าต้องใช้ MySQL รุ่นพิเศษ แล้วไอ้รุ่นเนี่ยมันไม่มีไบนารีสำหรับ Raspbian (เป็นระบบที่ผมรันบน RPi) ผมก็เลยว่า เออ ทำแค่ Master-Slave ก็ได้ เอา RPi เป็น Master แล้วเอา VPS เป็น Slave ซะ ถ้า WordPress จะอ่านก็อ่านเอากับเครื่องตัวเอง แต่ถ้าจะเขียน ก็ไปเขียนที่เครื่อง RPi

(แต่ ณ ตอนนี้ ผมเพิ่งรู้นะครับว่าจริงๆ ผมทำ Master-Master กับ MySQL ปกติก็ได้ แต่ผมขี้เกียจจะไปแก้ละ แบบนี้ก็ง่ายดี ไม่มีปัญหาว่าเขียนพร้อมกัน 2 เครื่องแล้วชนกัน เนาะ)

HyperDB

อันที่จริง เรื่องคลัสเตอร์ WordPress ใหญ่ๆ นี่ต้องดูของ https://wordpress.com เค้านะ เค้าให้บริการเว็บ WordPress ให้กับเว็บเป็นล้านๆ ถามว่าระบบเค้าจัดการฐานข้อมูลยังไง เค้าใช้สิ่งที่เรียกว่า HyperDB

HyperDB เป็นปลั๊กอินที่ทำให้ WordPress ใช้ฐานข้อมูลหลายๆ ที่ได้ สั่งให้อ่านจากเครื่องนึง เขียนอีกเครื่องนึงก็ได้ ทำอะไรได้หลากหลายกว่านี่ ก็ยังได้ ทาง Automattic บริษัทเจ้าของ WordPress.com เค้าใจดี ยอมให้เราทุกคนใช้ได้ฟรีๆ ผมก็เลยเอามาใช้ในเว็บผม

แต่มันมีก้างขวางคออยู่ชิ้นนึง ผมมีปลั๊กอิน W3 Total Cache อยู่ด้วย แล้วเค้าก็มี Cache ของ Database ซึ่งมันดันทับซ้อนกับ HyperDB พอดี! งานนี้มันต้องมีผ่าตัดกันบ้างหละ

W3 Total Cache กับระบบที่ออกแบบมาให้ต่อยอดได้

โชคดีที่คนทำ W3 Total Cache น่าจะคิดไว้แล้ว จึงออกแบบโค้ดของระบบแคชฐานข้อมูลให้ทำงานบนฐานของโค้ดของระบบฐานข้อมูลใดๆ ก็ได้ โดยการ Subclass ออกมาจากคลาส wpdb ของ WordPress เอง

ซึ่งก็เข้าทางผมสิครับ ผมจับแก้ให้โค้ดของ W3 Total Cache ไป Subclass ออกมาจากคลาส hyperdb แทน คราวนี้ W3 Total Cache ก็จะเรียก HyperDB เวลาที่ค้นในแคชแล้วไม่เจอ

Cluster ที่ห่างไกล ต้องใช้ Load Balancer ระดับโลก

ส่วนสุดท้ายของสมการคือสิ่งที่กระจายโหลดไปยังหลายๆ เครื่อง ผมใช้ Cloudflare ตลอดเวลาตั้งแต่เปิดไซต์ใหม่ (ก็ถ้าไม่มีนะ ผมคาดว่า Raspberry Pi น่าจะบินตั้งแต่เปิดเว็บแรกๆ แล้วแหละ) เมื่อเร็วๆ นี้ Cloudflare เพิ่งทดลองเปิดให้บริการ Load Balancer ที่ทำให้เราสามารถกระจายการเข้าเว็บจากผู้ใช้ไปที่หลายๆ เครื่องได้ ผมจึงได้เริ่มใช้บริการนี้เพื่อแบ่งโหลดของการเข้าเว็บให้เท่าๆ กัน และเวลาที่ RPi มีการใช้งานมากไป (หรือว่าเน็ตหลุด ไฟดับ) Cloudflare ก็จะไปเข้าที่เครื่อง VPS แทน

อันที่จริง ก็เพราะ Cloudflare เปิดบริการนี้นี่แหละ ทำให้ผมตัดสินใจทำระบบพิศดารนี้ขึ้นมา

การปรับปรุงเบื้องหลังอีกเล็กน้อย

อันที่จริง ที่ Raspberry Pi ผมได้มีการปรับปรุงอะไรอีกเล็กน้อยเกี่ยวกับ Caching ดังนั้น ไม่ว่าจะบังเอิญเข้าที่เครื่องไหน ก็จะรู้สึกเร็วขึ้นอย่างชัดเจนเลยหละ

เรื่องที่ขอ

และนั่นคือทั้งหมดในวันนี้ ขอขอบคุณทุกคนที่อ่านมาถึงตรงนี้ ถ้าใครอุตส่าห์อ่านมาถึงตรงนี้จริงๆ ผมขออีกอย่างนะ ช่วยใส่ Comment ด้านล่างซักนิดนึงนะครับ ตั้งแต่เปิดบล็อกมานี่ ไม่มีใครคอมเมนต์เลย

คือไม่ใช่อะไร ระบบ Comment ที่ผมใช้ มันไปใช้ระบบของเว็บที่ชื่อ Disqus อีกที แล้วผมก็เลยไม่เคยรู้ว่าตกลงระบบมันทำงานถูกมั้ย ยังไง ก็ ขอบคุณล่วงหน้าครับ 😀