กว่าจะมาเป็น MySQL Cluster
MySQL ถูกพัฒนาขึ้นจากภาษาซี มีรุ่นที่สำหรับทำงานบนระบบปฏิบัติการต่างๆ มากมาย สนับสนุนการใช้งานแบบมัลติเทรด (Multi-threading) ในระดับเคอเนลแบบสมบูรณ์ รองรับจำนวนตารางถึง 200,000 ตารางและข้อมูลมากกว่า 5,000,000,000 แถวข้อมูล (ข้อมูลจากคู่มือ MySQL)
ผู้เขียนเองเคยใช้งาน MySQL สมัยออกใหม่ๆ มีขนาดไฟล์ติดตั้งเพียง 5 MB. หลังจากทดลองใช้งานก็พบว่าไปใช้งาน PostgreSQL ดีกว่า ในช่วงปีหลัง ๆ มาทำบริษัทเอง ตลาดของ MySQL มีมากกว่าด้วยความที่ใช้งานง่าย ทำให้กลับมาจับฝั่งนี้อีกครั้ง และพบว่าหลังจากรุ่นที่ 4 เป็นต้นมา MySQL ได้มีวิวัฒนาการต่าง ๆ เพิ่มขึ้นอย่างมาก รองรับการทำวิว การ join การทำ Store Procedure และอื่น ๆ ตามเข้ามาเรื่อย ๆ จนกระทั่งมาพบกว่า MySQL Cluster และรอจนกระทั่งรู้สึกว่าเป็นรุ่นที่ใช้งานได้ จึงได้เริ่มรุกอย่างหนักขึ้น และตั้งใจจะเขียนหนังสือเล่มนี้เพื่อแบ่งปันความรู้ที่มีแก่ผู้ที่สนใจต่อไป
รูปจาก http://dev.mysql.com/doc/refman/5.1/en/pluggable-storage-overview.html
โครงสร้างการทำงานของ MySQL หากเราพิจารณาให้ดีจะพบว่าตรงส่วนที่เรียกว่า สตอเรจเอนจิ้น (Storage Engine) เป็นส่วนที่มีตัวเลือกหลากหลายแบบ ที่เราคุ้นเคยก็คือ MyISAM และ InnoDB ซึ่งสตอเรจเอนจิ้นในส่วนนี้เป็นส่วนที่จัดการกับข้อมูลที่จัดเก็บอยู่ซึ่งจะมีลักษณะการทำงานและความสามารถที่แตกต่างกันไป พออธิบายโดยสังเขปดังต่อไปนี้
MyISAM เป็นตัวมาตรฐาน (Default) มาแต่เริ่มต้น ทำงานได้ดี แต่ไม่รองรับ Foreign Key
InnoDB เป็นตัวมาตรฐานในปัจจุบัน หลังจากที่บริษัทออราเคิล ได้ซื้อกิจการบริษัท ซัน ไมโครซิสเต็ม ก็ได้เปลี่ยนให้ MySQL ใช้ InnoDB เป็นสตอเรจเอนจิ้นมาตรฐานแทน MyISAM ซึ่ง InnoDB นี้ มีจุดเด่นที่เหนือกว่า MyISAM คือรองรับ Foreign Key และสนับสนุนการทำงานทรานเซคชั่น (Transaction) และมีลักษณะคล้ายการออราเคิล เพราะทีมออราเคิลเป็นคนพัฒนา
NDB มาจากคำว่า Network Database ซึ่งบ่อยครั้งนิยมเรียก NDBCLUSTER ย่อ ๆ ว่า NDB เป็นสตอเรจเอนจิ้นสำหรับ MySQL Cluster ซึ่งสตอเรจเอนจิ้นนี้จะมากับ MySQL รุ่นที่ที่เป็นคลัสเตอร์เท่านั้น
ที่ดาวน์โหลด MySQL Cluster
ณ ขณะที่เขียนหนังสือเล่มนี้ MySQL Cluster อยู่ในรุ่นที่ 7.1.15 ส่วน MySQL อยู่ในรุ่นที่ 5.5.14 จะสังเกตุเห็นว่าเลขรุ่นต่างกันมาก แต่จริง ๆ แล้วเลขรุ่นของ MySQL Cluster ที่เห็นเป็นเลขรุ่นของ NDB สตอเรจเอนจิ้น
http://www.mysql.com/downloads/cluster/
โครงสร้างของ MySQL Cluster
องค์ประกอบของ MySQL Cluster มีอยู่ 3 ส่วนได้แก่
ตามที่ได้กล่าวไปแล้วว่าข้อมูลที่ถูกจัดเก็บลงบนระบบ MySQL Cluster นั้นจะถูกแบ่งส่วนกันจัดเก็บตามกลุ่ม (Node Group) ดังภาพข้างต้น จะได้ว่าระบบแบ่งออกเป็น 2 กลุ่ม คือ Node Group 0 และ Node Group 1 ข้อมูลที่มีการจัดเก็บในฐานข้อมูลจะถูกแบ่งกระจายกันเก็บแยกกันอยู่ในแต่ละกลุ่ม ถ้าถามรูปมีสองกลุ่มก็กลุ่มละประมาณครึ่ง ๆ ซึ่งทุกโหนดในกลุ่มจะมีข้อมูลเหมือน จากนั้นในเวลาที่ระบบทำงาน แต่ละเครื่องจะนำข้อมูลมาให้บริการเพียงครึ่งนึงของที่ตนมีซึ่งก็คือ 25% ของทั้งและจะให้บริการแบบ Active / Active ทั้งหมด หากมีเครื่องกลุ่มเสียหายไม่สามารถให้บริการได้ ก็จะนำข้อมูลในส่วนที่เหลือขึ้นมาให้บริการแทน ดังที่จะเห็นในภาพแบ่งออกเป็นพาร์ทิชั่น 0 1 2 3 และมี primary และ Backup Replication
การแบ่งการบริการแบบนี้จะได้ประโยชน์เวลาที่มีเรียกใช้ข้อมูลจะช่วยในเรื่องความเร็ว เพราะปรกติควาเร็วของระบบทั่วไปติดอยู่การอ่านเขียนไฟล์จากฮาร์ดดิสก์ซึ่งมีความเร็วช้าที่สุด ที่นี้แทนที่จะอ่านจากเครื่องเดียว ก็แบ่งส่วนกันอ่านน้อย ๆ จากหลายเครื่อง ทำให้เวลาที่ต้องรอดิสก์น้อยลง เพราะอ่านน้อยและทำพร้อมกันหลายเครื่อง จึงได้ประโยชน์ด้านนี้ขึ้นมา
Enables clustering of both in-memory and on disk bases.
ระบบ MySQL Cluster นั้นเริ่มแรกรองรับการจัดเก็บข้อมูลเฉพาะบนหน่วยความจำ (In Memory) เท่านั้น ภายหลัง NDB รุ่นที่ 7.x จึงรองรับการจัดเก็บข้อมูลบนดิสก์ (Disk Bases)
การจัดเก็บข้อมูลในหน่วยความจำ (In-Memory) ตรงนี้ต้องใช้หน่วยความจำหรือแรม (RAM) มากตามปริมาณข้อมูล เพราะในขณะทำงานเครื่อง Data Node จะยกข้อมูลจากฮาร์ดดิสก์ขึ้นมาอยู่แรม ฉะนั้นถ้าคิดง่าย ๆ อย่างน้อยก็ต้องมีแรมที่มากกว่าส่วนของข้อมูลที่เครื่องดาต้าโหนดนั้นๆ ต้องดูแล เพราะต้องเผื่อสำหรับระบบปฏิบัติการและเผื่อสำหรับข้อมูลที่จะเพิ่มเข้ามาในอนาคตด้วย ระบบนี้จึงเหมาะสำหรับระบบที่ต้องการความเร็วในการโต้ตอบสูง เช่นงานพวก Real-Time Application เป็นต้น แต่ไม่เหมาะงานกับที่มีปริมาณข้อมูลมาก เพราะนั่นหมายถึงการที่จะต้องลงทุนซื้อแรมใส่เครื่องมากตามกัน
การจัดเก็บข้อมูลบนดิสก์ (Disk-Bases) เริ่มมีใช้งานเมื่อ NDB รุ่นที่ 7.0 ออกแบบมาเพื่อรองรับระบบที่มีปริมาณข้อมูลมาก ใช้เทคนิคในการสร้าง Table Space แบบระบบฐานข้อมูลขนาดใหญ่ทั่วไป ทำให้สามารถรองรับกับปริมาณข้อมูลได้เป็นอย่างดี และใช้งานหน่วยความจำน้อยทำให้ประหยัดงบประมาณ
Shared-nothing architecture.
คุณสมบัติที่สำคัญอีกประการหนึ่งของระบบ MySQL Cluster ที่เห็นได้ชัดเจนคือเป็นสถาปัตยกรรมแบบที่ไม่ต้องใช้ Share storage ใด ๆ เพราะใช้การ Mirror กันระหว่างเครื่องแทน ทำให้ได้เกิดข้อดีอีกข้อคือไม่ต้องกังวลว่าจุดใดจุดหนึ่งเสียแล้วระบบจะหยุดชะงัก (ยกเว้นระบบเครือข่าย)
No single point of failure
Storage engine called NDB or NDBCLUSTER
สำหรับสตอเรจเอนจิ้นแบบ NDB นี้ก็มีจุดเด่นจุดด้อยที่แตกต่างสตอเรจเอนจิ้นแบบ InnoDB หรือ MyISAM ที่เราเคยใช้งานกันอยู่เหมือนกัน ในจุดเด่นที่เห็นได้ชัดคือเรื่อง สภาพพร้อมใช้งานสูง (High Availability) ที่ไม่มีในสตอเรจเอนจิ้นอื่น และยังได้ประสิทธิภาพในแง่ความเร็วเมื่อมีปริมาณผู้ใช้จำนวนมาก ๆ ได้ ในข้อจำกัดที่ต่างจากตัวอื่นๆ เช่นการทำ transaction ให้ครบตามหลัก ACID การใช้งาน Foreign key ความในการ Join และอื่น ๆ ซึ่งยังมีข้อจำกัดที่เป็นรายละเอียดปลีกย่อยอยู่อีกพอสมควร
MySQL Cluster Components
Management node (MGM node) ให้บริการคอนฟิกกูเรชั่นของระบบจัดเก็บอยู่ในไฟล์ config.ini และทำหน้าที่ในการสั่งเริ่มและหยุดการทำงานของโหนดอื่นๆ การทำการสำรองข้อมูลของระบบ MySQL Cluster โหนดนี้เป็นโหนดที่ต้องเริ่มการทำงานก่อนโหนดอื่นๆ ในระบบ และมี ndb_mgmd เป็นคำสั่งในการเริ่มการทำงานของระบบ
Data nodes เป็นโหนดที่จัดเก็บข้อมูล สำหรับระบบที่ใช้งานจริงควรจะมีโหนดในส่วนนี้อย่างน้อย 2 เครื่องขึ้นไป เพื่อทำการสำรองข้อมูลระหว่างกัน ใช้คำสั่ง ndbd หรือ ndbmtd เป็นคำสั่งในการเริ่มการทำงาน สำหรับ ndbmtd เป็นรุ่นที่สนับการทำ Multi-Threading ซึ่งคำสั่งที่ใหม่กว่า ndbd ที่ไม่สนับสนุน ในปัจจุบันคิดว่าเครื่องส่วนใหญ่คงจะมีหลายแกนประมวลผลและน่าจะใช้คำสั่ง ndbmtd เป็นส่วนมาก
สำหรับเครื่อง Data Node นี้ปัจจุบันรองรับได้ไม่เกิน 48 เครื่อง 1 ระบบคลัสเตอร์ ซึ่งจำเป็นต้องกำหนดหมายเลข ID ให้ในช่วง 1 - 48
สำหรับความสามารถในการทำMulti-thread นี้เพิ่มมีเพิ่มเข้ามาเมื่อNDB รุ่นที่ 7.x ซึ่งรองรับสูงสุดที่ 8 เทรด (threads) ต่อเครื่อง ซึ่งแบ่งส่วนการทำงานกันดังต่อไปนี้
Access manager (ACC) ทำหน้าที่จัดการอินเด็กซ์ของไพรมารีคีย์ เพื่อความเร็วในการเข้าถึงข้อมูล
Tuple Manager (TUP) ทำหน้าที่จัดการกับส่วนที่จัดเก็บข้อมูลและทำหน้าที่กรองข้อมูลให้ได้ส่วนที่ต้องการ
ทั้ง Access manaer และ Tuple Manager ทำงานอยู่ภายใต้ LQH ทั้งคู่
การกำหนดจำนวนเทรดนี้ ให้กำหนดในไฟล์ config.ini ภายใต้ส่วน ndb_default ด้วยชื่อตัวแปรว่า MaxNoOfExecutionThreads
SQL nodes ทำหน้าที่เป็นผู้เรียกใช้งานข้อมูล เหมือน MySQL ปรกติที่เราใช้งาน แต่ต่างกันตรงที่ว่าตารางที่ใช้สตอเรจเอนจิ้นเป็น NDBCLUSTER นั้น ข้อมูลไม่ได้จัดเก็บอยู่ในเครื่องนั้นแต่ไปจัดเก็บอยู่ที่ Data Node แทน การทำงานก็ใช้คำสั่ง mysqld ตามปรกติ แต่จะมีการปรับแต่งค่าในไฟล์ my.cnf หรือ my.ini สำหรับรุ่นที่วินโดวส์
สำหรับระบบลีนุกซ์
ข้อดีของระบบ MySQL Cluster
ข้อด้อยของระบบ MySQL Cluster
ndbinfo read only database
mysql cluster replication ทำงานได้อย่างถูกต้องมีเทรดที่ได้รับมอบหมายสำหรับงาน replication โดยเฉพาะ 1 เทรดในทุก Data node ซึ่งจะคอยประสานงานและส่ง Bin Log มาจัดลำดับเหตุการณ์ให้ถูกต้องเพื่อให้การทำสำเนาข้ามระบบเป็นไปอย่างถูกต้องสอดคล้อง ดูเรื่องการจัดการ Bin Log เพิ่มให้ชัดเพราะระบบใหญ่จำเป็นมาก
การปฏิบัติในหนังสือเล่มนี้อิงกับระบบปฏิบัติการลีนุกซ์ CentOS 5 และใช้ซอฟต์แวร์ MySQL Cluster รุ่นที่เป็นไบนารีออกมาสำหรับ Redhat / CentOS