Archive for the ‘Database’ Category

0014 | MySQL Replicate

Wednesday, May 14th, 2008 Posted in Database | 2 Comments »

* บทความนี้อ้างอิงและประยุกต์มาจากเว็บไซต์ต่อไปนี้
DNSThailand.com – เทคนิคการใช้ Replication ระดับสูงใน MySQL
CATTelecom.com – กิตติชน แม้นสมุทร [ejeepss] » Replicate MySQL 5.x

สืบเนื่องจาก entry ที่แล้ว
ก็เลยลองไปค้นๆ ข้อมูลเพิ่มเติมดูอีกหน่อยว่าเราลืมอะไรไปบ้าง
เพราะนึกได้ว่ายังไม่ได้ลองทำ MySQL Replicate เลย (ฮาๆ)
ประเด็นคือไม่รู้ว่ามันช้าที่ฐานข้อมูลรึเปล่า เพราะ debug ไม่เจอสาเหตุ
ก็เลยต้องลองทำเท่าที่ทำได้ไปก่อน

ขั้นต้นก็ต้องมี server 2 เครื่องขึ้นไปครับ
โดยสมมติเครื่องแรก ชื่อ web-slave
เครื่องที่สอง ชื่อ db-master

ก่อนอื่นมาที่เครื่อง web-slave สั่งติดตั้ง mysql server ตามนี้ครับ
* อ้างอิง Fedora 8 ครอบคลุม Fedora 4 – 9, CentOS 5.x รวมถึงสาย Redhat ทั้งหมดครับ

# yum install mysql-server

เสร็จแล้วเปิดแฟ้ม /etc/my.cnf เพิ่มเติมข้อมูลต่อไปนี้ครับ

server-id=2
master-host=0000ff;">10.0.0.2
master-port=3306
master-user=ff0000;">replicate
master-password=ff0000;">slavepassword
master-connect-retry=30
replicate-wild-do-table= %.%
report-host=008000;">10.0.0.1

(มันมาอีกละ สีฟ้าแดงเขียวนี่)
แก้ ip อะไรพวกนี้ให้ถูกนะครับ แล้วแก้ตัวแดงๆ ด้วย ตามที่ตั้งค่า

เครื่องนี้เสร็จและ กลับไปที่เครื่อง db-master ต่อ ก่อนอื่นต้องตั้งค่า username / password ก่อนครับ
โดยเข้าไปใน mysql query console (หรือที่ไหนก็ได้ที่สามารถตั้ง user ได้) แล้วรัน query ต่อไปนี้

mysql> GRANT REPLICATION SLAVE ON *.*
TO ‘ff0000;">replicate‘@’008000;">10.0.0.1‘ IDENTIFIED BY ‘ff0000;">slavepassword‘;

เสร็จแล้วออกมาสั่ง stop service mysql ได้เลยครับ แล้วก็แก้แฟ้ม /etc/my.cnf อีกนิดหน่อย ตามนี้ครับ

log-bin=ff00ff;">mysql-bin
server-id=1
innodb_flush_log_at_trx_commit=1
sync_binlog=1
expire_logs_days=ff00ff;">3
max_binlog_size=ff00ff;">50M

ตรงนี้ปรับค่าตามความเหมาะสมนะครับ แล้วแต่ว่าจะเก็บ log กี่วันยังไง
โดยบรรทัดแรกสุดจะเป็น path + ชื่อแฟ้มที่ใช้เก็บ log (สามารถใส่ full path ได้ครับ เช่น /var/log/mysqld/binlog)
แล้วก็ย้ำว่าควรจะใส่ option สองบรรทัดด้านล่าง เพื่อป้องกัน hdd เต็ม (ฮา)
เคยเจอมาแล้วครับ เก็บ log เพลินไปหน่อย เศร้าเลย

ต่อจากนี้ก็ copy ข้อมูลจาก db-master ไปยังเครื่อง web-slave ครับ
ถ้าใน fedora/centos default install ก็อยู่ใน /var/lib/mysql
สั่ง tar ไปทั้ง folder เลยก็ยังไหวครับ (แต่ข้อแม้คือต้องเป็น mysql version เดียวกันนะ)

จากนั้นก็สั่ง service mysqld start ทั้งสองเครื่อง
แล้ว connect เข้า mysql ของเครื่อง db-master สั่ง query ต่อไปนี้ครับ

mysql> FLUSH TABLES WITH READ LOCK;

แล้วก็ connect เข้า mysql ของเครื่อง web-slave สั่ง query ต่อไปนี้ครับ

mysql> START SLAVE;

เท่านี้ก็เรียบร้อย ทีนี้ก็รอดูผลงาน… ถ้าเวิร์กจะเอาไปใส่เว็บ bitthai ด้วย (ฮาๆ)

Tags: , , , ,

0010 | MySQL Memory Engine

Saturday, May 10th, 2008 Posted in Database | 2 Comments »

ก่อนอื่นขอรายงานสถานการณ์+บ่นซะก่อน แง่มๆ
วันที่ 7 ตอน 22.00 น. ไฟฟ้าใช้ได้ตามปกติแล้วครับ
แล้วก็… aircard กลับมาใช้ได้ตามปกติแล้ว เย้ๆๆ
เซ็งแทบตาย ต้องไปจิ้มสายเน็ตเพื่อนใช้อยู่ แล้วมันเร็ว
เอ้ย แล้วมันต้องเกรงใจอะ น่าเบื่อที่สุด ทำอะไรไม่สะใจเลย

กลับเข้าเรื่องกันดีกว่า
วันนี้จะมาว่าด้วย MySQL Memory Engine ครับ

Memory Engine เป็นรูปแบบตารางของ MySQL แบบหนึ่ง
ซึ่งมีโครงสร้างคล้ายๆ กับ MyISAM บ้าง นิดๆ หน่อยๆ
เพียงแต่แทนที่จะเก็บไว้เป็นไฟล์ .MYD ไว้บนเครื่อง ก็เปลี่ยนมาเป็น
เก็บลง shared memory ของ master process แทน
แน่นอนครับ ผลลัพท์ที่ได้มันก็มาจากความเร็วของ RAM ที่ท่านใช้
ว่ามันจะเร็วได้แค่ไหน ซึ่งปกติ ประสิทธิภาพความเร็วที่ทำได้จะอยู่ราวๆ 0000ff;">50-150 เท่าของ MyISAM ครับ

อ๊ะๆ เห็นมันเร็วกันบ้าพลังขนาดนี้นี่ อย่ามาคิดเชียวว่าทำไมไม่เก็บไว้ใน Memory ให้หมด
สาเหตุมันก็เพราะปัจจัยตามนี้ครับ

  1. เครื่องมีแรมเท่าไหร่ มันก็เก็บได้ไม่เกิน 1/2 ของแรมนั่นแหละครับ
  2. ใช้ field ประเภท text/blob ทุกชนิดไม่ได้ (ใช้ varchar ได้อยู่นะครับ)
  3. restart mysql ปุ๊ป ข้อมูลหายเรียบ (ก็มันเก็บในแรมนี่)
  4. เปลืองพื้นที่มากกว่า MyISAM เยอะ (ตาราง MyISAM ขนาด 10 MB เวลาแปลงเป็น Memory จะใช้แรมประมาณ 40 MB)
  5. ต้อง allocate memory เป็น block แต่ละ block ขนาดประมาณ 4-8 MB (เอาเป็นว่าหารเลขฐานสองลงตัวอะ)

ว่าแต่ร่ายซะเสียเลยแฮะเรา (ฮาๆ)
เอาเป็นว่า เนื่องด้วยเหตุผลข้อ 3 ทำให้เราไม่สามารถเก็บข้อมูลลงใน Memory Engine ได้ถาวรแน่นอนครับ
ดังนั้น ตารางแบบนี้เหมาะสำหรับเก็บค่า “ชั่วคราว” มากกว่า
เช่นพวกสถิติ user online, session ของเว็บไซต์ อะไรพวกนี้
ซึ่งวิธีแปลงก็ง่ายๆ ครับ

ALTER TABLE 0000ff;">table ENGINE=Memory;

แค่นี้เอง สั้นๆ ง่ายๆ ได้ใจความ
รูปแบบการใช้งานที่เหมาะสม (และผมใช้อยู่ปัจจุบัน)คือ ตาราง peers ของเว็บ bittorrent ครับ
reset ไปมันก็เข้าใหม่ได้ ไม่มีปัญหาอะไรมาก แถมตารางนี้ access หนักมาก ถี่ยิบๆ
ก็เลยเหมาะต่อการใช้ Memory Engine ที่สุดเลย

รองลงมาก็คือ download session ของเว็บฝากไฟล์
พวกนี้ปล่อยๆ มันได้ครับ ใช้ไม่่ค่อยเยอะหรอก

ทีนี้ ปัญหาที่จะเจอคือ Error ต่อไปนี้

The table ‘ff0000;">table‘ is full

ทั้งนี้เนื่องมาจาก MySQL มีการกำหนดขนาดสูงสุดของตารางประเภท Memory ไว้ครับ
ว่า 1 ตารางสามารถจุข้อมูลได้ทั้งหมดกี่ MB ใน variable ที่ชื่อ 0000ff;">max_heap_table_size ครับ
โดยค่าปกติของ MySQL 5.0 คือ 16 MB
อยากให้มันใหญ่ได้เท่าไหร่ก็ใส่ไปโลด /etc/my.cnf ในส่วนของ mysqld สั้นๆ ง่ายๆ ครับ

จบและ คราวหน้าถ้าไม่ลืมจะมาพูดถึง MySQL Indexes ครับ

Tags: , ,