Tag Archive for 'MySQL'

MySQL Replication

เคยอยู่ดีๆ ทำงานกับ Server ผ่าน Terminal สลึมสลือ.. aptitude เสร็จ อยากจะรีสตาร์ทเครื่อง แทนที่จะใช้คำสั่ง shutdown -r now แต่ดันผิดว่า shutdown -P now เคาะ Enter ตูม… บ้างไหม

อ้า แล้วไงหละ ก็เดินไปที่หน้าเครื่องแล้วเปิดมันขึ้นมาใหม่ก็หมดเรื่อง

แต่สำหรับผมมันไม่ใช่ ผมนั่งอยู่ที่ นคปฐม แต่ไอ้เครื่อง Server มันอยู่ห่างออกไป 650 กิโลเมตร ที่สุราษฎร์ เวลาที่ผมสั่งคำนี้ เป็นเวลาตีสี่ และรุ่งขึ้นเป็นวันอาทิตย์ แน่นอนไม่มีผีที่ไหนอยู่เฝ้าศูนย์คอมตอนตีสี่ และไม่มีใครใจดีมาทำงานวันอาทิตย์ให้เดินเข้าไปจิ้มปุ่ม Power หน้าเครื่องสักคนเลย

เครื่องเจ้ากรรมเป็น Database Server ของระบบทั้งหมดบนเว็บ ยกเว้นที่ฮิตมากอย่างกระดานข่าวพึ่งจะย้ายออกไปไม่กี่วัน ถ้าเกิดกระดานข่าวยังใช้เครื่องนี้เป็น Database หลักอยู่รับรองผมโดนเกรียนด่าแหลก

จริงๆประเด็นไม่มีอะไร ก็แค่ระบบใช้งานไม่ได้ แต่นี่มันเป็นความผิดพลาดเล็กๆน้อยๆ ที่เกิดขึ้นโดยมนุษย์ (เล็กน้อยจริงหรือ) แล้วถ้ามันเกิดความผิดพลาดโดยอุบัติเหตุ กู้คืนมาไม่ได้ง่ายๆเหมือนเดินไปจิ้มปุ่ม Power หน้าเครื่องจะเกิดอะไรขึ้น

เลยเป็นชนวนให้ต้องไปหาวิธี Clone หรือสำรองข้อมูล ซึ่งตอนนี้อยู่บน MySQL เกือบทั้งหมด ก่อนที่จะสายเกินแก้ จำได้ว่า MySQL มีเรื่อง Replication เป็นคุณสมบัติปกติอยู่แล้ว แต่ไม่เคยใช้มันสักที เอาหละคราวนี้ได้ลงมือทำ

MySQL Replication เป็นการทำงานแบบ Master - Slave คือมี Server หลักอยู่หนึ่งเครื่องเป็น Master จากนั้นเมื่อมีการเปลี่ยนแปลงข้อมูลที่เครื่อง Master ตัวเครื่อง Slave ก็จะดึงเอาข้อมูลที่ Master มาเป็น mirror เอาไว้ที่ตัวเองด้วย เราจะให้มีการสำรองข้อมูลตลอดเวลา หรือว่าจะตั้งเวลาล่วงหน้าก็ได้ เช่นสี่โมงเย็นให้ทำการสำรองข้อมูลมาไว้ที่ Slave อัตโนมัติ

ไม่เหมือนวิธีการ Black Up ข้อมูลลงมาจาก Server ในการ Back Up ข้อมูลเราใช้วิธีการดึงข้อมูลทั้งหมดลงมาเก็บไว้ที่เครื่องอื่น แต่การทำ Replication มันฉลาดพอที่จะเลือกว่ามีจุดไหนของข้อมูลที่ถูกเปลี่ยนแปลง มันเลือกที่จะปรับปรุงข้อมูลแค่จุดนั้นให้เหมือนกับ Master

ที่เครื่อง Master ในส่วน [mysqld] ให้ระบุ id

[mysqld]
server-id=1

แล้วเพิ่มสิทธิ์ให้ User จากเครื่อง Slave สามารถเข้ามาดึงข้อมูลได้ เช่น

GRANT REPLICATION SLAVE ON . TO wanchana@”slave.domain” IDENTIFIED BY ‘password’;

ทีนี้มาที่เครื่องที่เป็น Slave ให้เราเพิ่มข้อมูลของเครื่อง Master ที่จะไปดึงข้อมูลมา

[mysqld]
master-host=master.domain
master-user=wanchana
master-password=password
master-port=3306
server-id=2

สังเกตจาก config ได้ว่าเราสามารถเอาไปพลิกแพลงได้ ไม่จำเป็นจะต้องทำตามหลักการเสมอไป อยู่ที่การประยุกต์ใช้กับงานมากกว่า

SQLite

ถ้าเรามี Apache + PHP5 อยู่แล้วก็ไม่ต้องทำอะไรเลย จัดการไปที่ php.ini แล้วเปิด Extension PDO, SQLite ให้มันทำงาน จากนั้น Restart Apache ก็เรียบร้อยแล้วหละ

SQLite เป็นไฟล์ ที่มีส่วนรับและประมวลผลคำสั่ง SQL รวมอยู่ในตัวไฟล์เลย นอกจากนั้นเรายังสามารถเขียน หรือเปลี่ยนแปลง Function ที่อยู่ในไฟล์ข้อมูลของเราด้วยก็ได้ ด้วยความที่มันเป็นไฟล์ เพราะฉะนั้นการใช้งาน หรือการเข้าถึงข้อมูลที่ต้องการก็ง่ายมาก

ตามปกติถ้าเราใช้ MySQL ก็จะต้องมีการเปิดการติดต่อระหว่างตัวโปรแกรมกับฐานข้อมูลก่อน จากนั้นจึงจะสามารถส่ง Query ไปยังฐานข้อมูลได้ ซึ่งมันก็ต้องกำหนดอะไรวุ่นวาย เปิดการติดต่อกับฐานข้อมูลแล้ว ก็ต้องแจ้งไปอีกว่าจะทำงานกับฐานข้อมูลชื่ออะไร

ด้วยความที่ SQLite อยู่ในรูปของไฟล์ ดังนั้นการทำงานกับมันก็เหมือนกับเราเปิดไฟล์ขึ้นมา ที่พิเศษหน่อยคืออยากได้อะไรก็ยัด SQL ไปหามัน แทนที่เราจะต้องเปิดไฟล์ อ่านข้อมูล หาข้อมูลเองแบบที่ทำกับไฟล์ข้อมูลจริงๆ เจ้านี่มันจะส่งข้อมูลกลับมาให้เราเลย ไม่ต้องวุ่นวาย

ทีนี้ต้องลองสักหน่อย ผมลอง INSERT ข้อมูลจำนวน 119,875 รายการยัดลง SQLite ซึ่งหวังว่าถ้ามันราบรื่น ก็น่าจะเอาไปทดลองใช้กับงานอื่นได้อีก แบบประมาณว่าประทับใจจึงใช้บริการต่ออะไรประมาณนั้น ซึ่งผมไม่ได้จริงจังอะไรมากมาย ดังนั้นไอ้การทดลองส่วนตัว มันก็คงจะเอาไปอ้างอิงอะไรไม่ได้อยู่แล้วนะ

เขียนสคริปดึงข้อมูลจาก MySQL ใส่ไว้ในตัวแปร จากนั้นเริ่มว่ากันที่การ Query ลงไปในไฟล์ ซึ่งการดึงข้อมูลจาก MySQL เราไม่สนใจ

ลองรันดู… นานพอใช้ได้ ซึ่งผลปรากฎว่าผิดหวังแฮะ มันเป็นแบบนี้

Warning: SQLiteDatabase::query() [function.SQLiteDatabase-query]: unable to open database file in D:\…\sqlite_test.php on line 59

Fatal error: Maximum execution time of 360 seconds exceeded in D:\…\sqlite_test.php on line 59

เปิดดูอีกที เปิดได้ไฟล์ไม่ได้พัง แต่ว่ามันทำงานไปได้แค่ 7 พันกว่ารายการ ก็จอดซะแล้วอย่างที่เห็น (ข้อเท็จจริง ลงไปอ่านความเห็นที่ 1)

คือจริงๆแล้วมันได้อย่างเสียอย่าง ด้วยข้อจำกัดของความที่มันเป็นไฟล์ ดังนั้นเวลาเขียนข้อมูลเข้าไป ก็จะติดปัญหาเรื่องการจัดการทรัพยากร ของระบบปฎิบัติการด้วยส่วนหนึ่ง แต่ว่าเมื่อลองเรียกข้อมูลจาก SQLite แล้วมันก็ถือว่าเร็วในระดับหนึ่งเลยหละ

ประเด็นคงอยู่ที่การนำไปรองรับกับภาระงาน บางงานที่เราไม่มีความจำเป็นเลยที่จะต้องโยนขึ้นไปบนฐานข้อมูล แต่ก็ไม่ได้วางใจได้ถึงขนาดจะเอาไปใส่ใน text file อันนี้ SQLite คงช่วยได้ อีกอย่างคือข้อมูลที่ถูกเรียกใช้งานบ่อยๆ มากๆ แต่มีการเปลี่ยนแปลง หรือว่าใช้งาน Insert, Update น้อยกว่า SQLite น่าจะเป็นตัวเลือกที่ดี งานที่มีข้อมูลเยอะมาก มีการเปลี่ยนแปลงตลอดเวลา MySQL น่าจะตอบสนองได้ดีกว่ามาก ถ้ามีโอกาสก็น่าจะเอาไปลองใช้ทดสอบ อย่างในช่วงการประกาศผลสอบนักเรียน ข้อมูลขนาดแสนรายการ ที่ไม่ต้องสนใจเรื่อง Insert/Update เพราะข้อมูลที่ประกาศย่อมเป็นคนละก้อน กับที่ฝ่ายวิชาการทำงานโดยตรงอยู่แล้ว

เรื่องที่ต้องระวังนิดหน่อย คือรูปแบบการเขียน SQL ร่วมกับ MySQL แล้วนำมาใช้กับ SQLite ด้วย บางทีอย่างเช่นชื่อตาราง หรือชื่อคอลัมส์ ผมมักจะใส่เขาเดี่ยวครอบให้เสมอ แต่พอมาทำงานกับ SQLite แล้วมันจะโวยวายทันที

SQLite เป็นอะไรที่น่าสนใจ น่าสนุกมากๆ ถ้าภาระงานในระดับที่ไม่ “ถึก” จนเกินไป เจ้านี่ดูจะมีอะไรน่าสนใจ น่าดึงดูดใจอยู่ในตัวมันเอง แต่ถ้างานระดับที่ต้องการความเชื่อถือของข้อมูลสูงมากๆ มีการทำ mirror หรือต้องการ Replication แล้วคงต้องกลับไปคบกับ MySQL คนเดิม

แถมท้ายด้วยกรณีที่เราใช้งาน SQLite บน Server แล้วไม่มั่นใจว่าจะมีใครดูดไฟล์ .sqlite ของเราไปได้หรือเปล่า ก็อาศัยสร้าง .htaccess ดักเอาไว้

<FilesMatch “\.(sqlite|sdb|s3db)$”>
Deny from all
</FilesMatch>