การทำ MySQL Master-Slave Replication เขียนเมื่อ 2012.06.28 โดย

เราสามารถกระจายภาระการทำงานของ MySQL ออกไปโดยการเพิ่ม node ในการประมวลผลโดยที่ยังคงความถูกต้องของข้อมูล โดยในที่นี้จะทำโดยการ Replication ข้อมูลในรูปแบบ Master-Slave ซึ่งเป็น One-way replication ซึงมีจะต้องมีการเปลี่ยนโครงสร้างของ application ให้ทำการอ่าน และเขียนข้อมูลไปยัง server ที่กำหนดด้วย

โดยเครื่อง Master จะรับหน้าที่เขียนข้อมูล (writer) และ Slave จะรับหน้าที่อ่านข้อมูล (reader)

ในที่นี้เครื่อง Master จะทำงานอยู่ที่ 192.168.1.10 และ Slave ทำงานอยู่ที่ 192.168.1.11

ในเครื่อง Master

ทำการ dump ฐานข้อมูลที่ต้องการ

mysqldump -r root -p database_name > dump.sql


แก้ไขไฟล์ my.cnf บน Unix/Linux จะอยู่ที่ /etc/my.cnf เพิ่ม parameters ข้างล่างลงในส่วนของ [mysqld]

server-id = 1
log-bin
binlog-do-db=database_name
binlog-ignore-db=mysql


โดยแก้ไข
database_name เป็นชื่อฐานข้อมูลที่ต้องการทำ replicate เราสามารถเพิ่มฐานข้อมูลที่ต้องการทำ replicate โดยการเพิ่ม parameter binlog-do-db ตามจำนวนฐานข้อมูล
ส่วน binlog-ignore-db เป็น parameter เพื่อระบุว่าไม่ต้องทำ replication ในฐานข้อมูลที่ระบุ

เข้าสู่ mysql shell
mysql -u root -p

จากนั้นทำการสร้าง user สำหรับ replicate
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@192.168.1.11 IDENTIFIED BY 'slave';


โดยคำสั่งดังกล่าวจะสร้าง user ที่มีสิทธิในการทำ slave replicate จากเครื่อง 192.168.1.11 โดยมี
username เป็น replication
password เป็น slave

ทำการ restart mysql
service mysqld restart


ที่เครื่อง Slave แก้ไข my.cnf โดยเพิ่มในส่วน mysqld
server-id=2
master-host = 192.168.1.10
master-user = replication
master-password = slave
master-port = 3306

ทำการ copy ฐานข้อมูลที่ dump เอาไว้
scp root@192.168.1.10:/path/to/dump.sql ./

จากนั้นทำการ import ข้อมูลเข้าสู่ฐานข้อมูล
mysql -u root -p -D database_name < dump.sql

จากนั้น restart แล้วเข้าสู่ mysql shell
mysql -u root -p

สั่งให้ replcation ทำงานด้วย
mysql> start slave;

ตรวจสอบการทำงานของ replication โดย
mysql> show slave statusG;

โดยจะแสดงผลเป็น
*************************** 1. row ***************************
               Slave_IO_State:
                  Master_Host: 192.168.1.10
                  Master_User: replication
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysqld-bin.000002
          Read_Master_Log_Pos: 181740123
               Relay_Log_File: mysqld-relay-bin.000018
                Relay_Log_Pos: 5488
        Relay_Master_Log_File: mysqld-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 181740123
              Relay_Log_Space: 5644
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
1 row in set (0.00 sec)

โดยให้ตรวจสอบโดยค่า SLAVE_IO_RUNNING และ SLAVE_SQL_RUNNING จะต้องเป็น Yes ถ้าเป็น No ให้ดู error ที่เกิดขึ้นในส่วนของ Last_Error, Last_IO_Error และ Last_SQL_Error แล้วแก้ไขให้ถูกต้อง



คำเตือนคำเตือน เนื้อหาต่างๆ ในบทความ รวมถึงรูปภาพทั้งหมดในบทความนี้ เป็นความเห็นส่วนตัวของผู้เขียนแต่ละคน ซึ่งแต่ละคนได้ทำการลงทะเบียน และเขียนบทความลงใน Modoeye Articles นี้โดยไม่มีค่าธรรมเนียมใดๆ บทความเหล่านี้เป้าหมายเพื่อการศึกษา และความบันเทิงเท่านั้น การนำส่วนหนึ่งส่วนใดของบทความไปใช้งาน ควรทำการอ้างอิงถึงผู้เขียนและแหล่งที่มาด้วย