MySQL server hardware, OS and configuration tuning tips
MySQL server hardware, OS and configuration tuning tips
Hardware and OS
- ควรใช้ 64-bit OS เพราะรองรับการเพิ่ม memory ที่มากขึ้น
- ไม่ใช้ software raid
- เลี่ยงการใช้ RAID 5 และใช้ RAID 10 แทน
- ถ้าหากมี Battery-Backed Cache RAID controllers จะดีมาก
- ใช้ disk ไม่ต้องใหญ่มากจะทำให้มีประสิทธิภาพดีกว่า
- ใช้ disk ที่มีความเร็วในการอ่านและเขียน
- แยก data กับ OS ให้อยู่คนละ partition
- mount filesystem เป็นแบบ noatime และ nodirtime
- ใช้ DEADLINE IO scheduler แทนการใช้ CFQ หรือ ANTICIPATORY IO scheduler โดยให้เพิ่ม elevator=deadline เข้าไปที่ ไฟล์ grub.conf ตรงส่วนของ kernel ที่ต้องการโหลด
[shell]title CentOS (2.6.32-220.7.1.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-220.7.1.el6.x86_64 ro root=LABEL=/ quiet elevator=deadline
initrd /initramfs-2.6.32-220.7.1.el6.x86_64.img[[/shell] - Install package เท่าที่ใช้งานและลบ package ที่ไม่จำเป็นออก
- ตรวจสอบจำนวนไฟล์ที่ mysql user สามารถเปิดได้ ด้วยคำสั่ง ulimit ถ้าหาก database มีจำนวน table มากควรเพิ่มให้พอเหมาะ
- mysql temp space และ replication logs ไม่ควรอยู่ใน partition เดียวกับ data
- ป้องกันการใช้งาน swap โดยใส่ option “vm.swappiness=0” ใน /etc/sysctl.conf
- ใช้ XFS filesystem เพื่อเพิ่มประสิทธิภาพและป้องกัน double buffering (เกิดใน ext3) เมื่อใช้ร่วมกับ MySQL
- เพิ่มชื่อเครื่องและ IP ที่ใช้งานประจำในไฟล์ /etc/hosts จะได้ไม่ต้องไป lookup ที่ dns
- ไม่ควร force kill MySQL process เพราะจะทำให้ Database เกิด corrupt
Configuration
- ใช้ innodb_flush_method=O_DIRECT เพื่อป้องกันการเกิด double buffer เมื่อมีการเขียนข้อมูล
- หลีกเลี่ยงการใช้ O_DIRECT และ EXT3 filesystem เพราะจะทำให้เขียนเป็นแบบ serialize
- ใช้ skip-name-resolve
- innodb_buffer_pool_size ให้มีขนาดไม่เกิน 70-80% ของจำนวน memory กำหนดไว้เพื่อให้ระบบ load InnoDB file ไปยัง memory
- ไม่ควรให้ innodb_log_file_size มีขนาดใหญ่เกินไป ประมาณ 256MB กำลังดี ถ้าหากขนาดใหญ่มากจะเร็วกว่าแต่จะทำให้ช้าถ้าหาก recovery เมื่อระบบเกิด crash
- ไม่ควรให้ max_connections มีค่ามาก เพราะถ้ามากเกินและถ้าหากมี connection เข้ามามากจะทำให้ใช้งาน memory มากเกินกว่า memory ที่มีอยู่อาจจะทำให้ระบบล่มได้
- innodb_log_buffer_size ไม่ควรเกิน 2-8MB เว้นแต่จะใช้ BLOBs ขนาดใหญ่
- ต้องมี innodb_file_per_table เพื่อป้องกันไฟล์ main tablespace โตเกินไป และจะจัดเก็บแต่ละ table เป็นไฟล์ของตัวเอง
- ใช้ query cache เมื่อข้อมูลไม่มีการเปลี่ยนแปลงบ่อย
- เพิ่ม temp_table_size และ max_heap_table_size เพื่อป้องกันการเขียนบน disk
- ไม่ควรให้ sort_buffer_size มีค่ามาก เพราะ sort_buffer_size มีการใช้ memory ตามจำนวน connection ที่เข้ามา
Backup
- ควร backup จากเครื่อง slave
- ไม่ควรไว้ใจ LVM snapshot เพื่อ backup เนื่องจากอาจเกิด data inconsistencies ได้
- หากต้องการ online backup แนะนำให้ใช้ xtrabackup