ads

วันพุธที่ 31 กรกฎาคม พ.ศ. 2556

การทำ Replicate MySQL


ทำ Replicate MySQL ครับ

หลังจากลง MySQL เสร็จแล้ว ( ขอข้ามขั้นตอนนี้เพราะเคยเขียนไว้แล้วกระทู้ล่างๆ นี้ )
วันนี้มาทำ กับเครื่องดังนี้โดยสิ่งที่มีดังนี้

1.  Master ผมเป็น FreeBSD 6.2 
ลง MySQL แบบผ่าน ports เปลี่ยนพาร์ท  data แล้วไว้ที่  /home/mysqldata

2.  Slave เป็น Debian 4.0 
ลง MySQL แบบผ่าน apt-get เปลี่ยนพาร์ท data แล้วไว้ที่ /home/mysqldata 

เพื่อง่ายต่อการแบคอัพข้อมูลครับ   ลงแบบผ่านซอสคอมไพล์เองก็ได้  แบบกระทู้ก่อนที่เคยเขียนไว้  

1.ที่เครื่อง Master 
- เข้าใช้ MySQL

# mysql -u root -p   

ใส่พาสเวิร์สไป เข้าไปสู่พร้อมของ mysql
>

ทำการแกร้งสิทธิ์ให้เครื่องสลาฟ  ให้มีสิทธิ์ดึงข้อมูล  โดยคำสั่งนี้
GRANT REPLICATION SLAVE ON *.* TO root@"เครือง slave.ชื่อโดเมน" IDENTIFIED BY 'พาสเวิร์ส root ของ slave';

ทำการแก้ไขไฟล์ config   my.cnf  ( ที่ต้องก๊อปมาเองก่อนแล้ว )
# vi /etc/my.cnf    แล้วใส่ค่านี้เพิ่มเข้าไป

server-id       = 1
log-bin=mysql-bin
server-id               = 1
binlog-ignore-db        = mysql
replicate-ignore-db     = mysql

เสร็จแล้วเซฟออกมา
2. ที่เครื่อง Slave
ทำการแก้ไขไฟล์คอนฟิก  my.cnf  ( ที่ก๊อปมาเองแล้วก่อนหน้านี้เช่นกัน  ในเครืองนี้เก็บใน /etc/mysql/my.cnf )

# vi /etc/mysql/my.cnf    

แล้วใส่ค่าไปดังนี้

[mysqld]
master-host= ไอพีเครื่อง Master
master-user=root
master-password= พาสเวิร์ส root ของ slave
master-port=3306
server-id=2

เสร็จแล้ว เซฟออกมา
restart service ทั้ง 2 เครือ่งสักที
มาสเตอร์  freeBSD

- /usr/local/etc/rc.d/mysql-server stop
- /usr/local/etc/rc.d/mysql-server start

slave Debian4

- /etc/init.d/mysql stop
- /etc/init.d/mysql start


ตรวจสอบการทำงานของการ replicate
ที่เครื่อง slave เข้า MySQL
แล้วลองดูสเตตัส  การทำ slave  ดังนี้

> mysql> SHOW SLAVE STATUS\G

*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 10.0.0.217
                Master_User: root
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000003
        Read_Master_Log_Pos: 424
             Relay_Log_File: bebe-relay-bin.000005
              Relay_Log_Pos: 235
      Relay_Master_Log_File: mysql-bin.000003
           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: 424
            Relay_Log_Space: 235
            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: 0
1 row in set (0.00 sec)

จะโชว์สถานะของสลาฟทั้งหมด  ว่า running อยู่ ทั้ง IO และ slave SQL  มาสเตอร์เครือ่งไหน  แล้ว log บนมาสเตอร์เขียนที่ไฟล์ไหน

แล้วมาดูฝั่ง Master บ้าง
ลอกอิน MySQL

>   แล้วสั่ง
> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |      424 |              | mysql            | 
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

ดูที่ไฟล์เป็นตัวเดียวกัน  ok และระดับหนึ่ง

ทดสอบโดย ผ่านหน้า interface ของ phpmyadmin ก็ได้
โดยลองทดสอบสร้าง database มาสักตัวหนึ่ง  ตารางสักตาราง  จากฝั่ง Master  ( ที่นี้คือ 10.0.0.217)
ดังรูปผมสร้าง ดาต้าเบส ชื่อ REP1 ตารางชื่อ test  ใส่ฟิวไปฟิวหนึ่ง ชื่อ id  แล้วก็ลองใส่ค่า 55555

แล้วลองเปิดดูที่เครือง  Slave ( ที่นี้คือ 10.0.0.232 )

จะเห็นได้ว่ามีตารางโผล่มาอีกอันคือ REP1 และข้อมูลด้านในเหมือนกันกับ ตัว master เด๊ะ ๆ  
เป็นอันว่าสำมะเร็จครับ   การทำ Replicate MySQL


หากก๊อปมาแล้วบางที ฟังชั่นการ Replicate หลุด 
ฟ้องว่าไม่เจอ ตัวมาสเตอร์เราต้องทำการเชื่อมต่อใหม่ด้วยคำสั่ง 


CHANGE MASTER TO MASTER_HOST='ip ตัวมาสเตอร์', MASTER_USER='user ที่ระบุในคอนฟิกในการ rep', MASTER_PASSWORD='password ที่ระบุในการทำ rep';

พิ่มเติมในกรณีที่เกิดเหตุขัดข้องทำให้การ replicate ไม่ทำการ sync กันไม่ว่าจะเป็นไฟดับ  หรือ รีบูทเครืองแล้วเออเรอร์
สตาร์ทเซอร์วิสแล้วยังไส่ sync กัน    ให้ทำการ  stop service ทั้ง2 ฝั่ง
แล้ว  copy ข้อมูลของตัว master ทั้งหมด  ยกเว้น  ที่ขึ้นต้นว่า mysql ต่างๆ นั้นไม่ต้องเอามา
แล้วไปวางบนเครื่อง slave และลบ log ไฟล์เก่าบน slave ออกให้หมด
แล้วค่อยสตาร์ท service ทั้งสองเครืองขึ้นมาใหม่   แล้วลองเทสดู

ไม่มีความคิดเห็น:

แสดงความคิดเห็น