[MySQL Tip] การทำ Replication Master Slave แบบ real-time
มีคนถามมานานแล้ว การทำ Replication แบบ MySQL Real-time ทำยัง ?
ซึ่งจริงๆแล้ว มีคู่มือในเว็บ หรือ หาอ่านได้จากกลุ่ม HOSxP ก็มีนะครับ
วันนี้เลยมารวบรวม วิธีการทำแบบที่ผมทำละกัน (อาจจะไม่แตกต่างกัน จาก อ.ท่านอื่นๆนะครับ ผมก็ไปศึกษาจาก อ.หลายๆท่านเหมือนกัน)
มาเริ่มกันเลย
1. มาเตรียมความพร้อมกันก่อนนะ
เตรียม server ไว้ 2 เครื่องนะครับ เราจะทำการ Master Server และอีกเครื่องคือทำ Slave Server กัน
กำหนด ip ตามตัวอย่างนี้ละกัน
Master Server
———————————–
Hostname : master-1
IP : 192.168.1.127
ID : 127
———————————–
Slave Server
———————————–
Hostname : slave-1
IP : 192.168.1.128
ID : 128
โดยทั้ง 2 เครื่อง ติดตั้ง MySQL หรือ Mariadb ไว้เรียบร้อยแล้ว และ ping หากันเจอแล้ว
และเปิด port 3306 ทั้ง 2 เครื่องด้วยนะครับ
–
2. อย่างแรกกำหนดคุณสมบัติที่ Master Server ก่อน
กำหนดค่าใน my.cnf (ถ้าแก้ไขเสร็จ ต้อง restart mysql ด้วย)
#ID Master server
server-id = 127
bind-address = 192.168.1.127
log_bin = mysql-bin
log-bin-index=bin-log.index
max_binlog_size=100M
binlog_format=row
expire_logs_days=3
log_bin_trust_function_creators = 1
เสร็จแล้ว restart mariadb แล้วตรวจสอบ สถานะ master ด้วยคำสั่ง
show master status\G
หรือถ้าหากเครื่องนี้เคยเป็น slave มาก่อน ต้องสั่ง stop slave; ก่อนด้วยนะครับ ถ้าค่อยมากำหนดมา master server ใหม่
ให้จำค่าของ File: mysql-bin.00003 และ Position: 342 ไว้ด้วยนะครับ เพราะต้องเอาเลขนี้ไปใช้งาน
สร้าง user สำหรับให้เครื่อง Slave server เข้ามาเชื่อม
stop slave; (กรณี ถ้าเคยทำเครื่องนี้เป็น slave มาก่อน)
grant replication slave on *.* to ‘replicate_user’@’%.192.168.1.128’ identified by ‘replicate_password’;
flush privileges;
3. ต่อไปกลับไปที่ฐาน Slave Server
กำหนดค่าใน my.cnf (ถ้าแก้ไขเสร็จ ต้อง restart mysql ด้วย)
#ID Slave server
server-id = 128
bind-address = 192.168.1.128
log_bin = mysql-bin
log-bin-index=bin-log.index
max_binlog_size=100M
binlog_format=row
expire_logs_days=3
log_bin_trust_function_creators = 1
แก้ไขแล้วสั่ง restart mariadb
แล้วเข้าไป mysql สั่งคำสั่ง ต่อไปนี้
สั่งคำสั่ง stop slave; (หากเคยทำมาก่อนหน้านี้แล้ว)
สั่งคำสั่งเพื่อสร้าง Master_Host
CHANGE MASTER TO
MASTER_HOST=’192.168.1.127′,
MASTER_USER=’replicate_user’,
MASTER_PASSWORD=’replicate_password’,
MASTER_LOG_FILE=’mysql-bin.000003′,
MASTER_LOG_POS=342;
เสร็จแล้ว สั่ง start slave; เพื่อเริ่มเชื่อมต่อฐาน Master Server
และรันคำสั่ง
show slave status\G
เพื่อดูว่า Slave_IO_Running: Yes อยู่ไหม
และดูว่า Slave_SQL_Running: Yes อยู่ไหม
ถ้าขึ้นแบบนี้แสดงว่า Slave Node ทำงานปกติ
เป็นอันเสร็จทางฝั่ง Slave Server นะครับ
4. กลับไป Master Server แล้วลองสร้างฐานข้อมูลมา 1 ฐาน แล้วกลับไปดูที่ Slave Server ว่ามีฐานที่สร้างขึ้นเมื่อกี่ด้วยหรือไม่ ถ้าขึ้นทั้ง Slave และ Master ก็แสดงว่าการทำงาน Replicate ถูกต้องแล้ว
ปล. ถ้าจะหยุดการเชื่อม Master ก็เพียงสั่งคำสัง stop slave;
เสร็จแล้ว ถ้าไม่มีอะไร error นะครับ ถ้ามี error ให้กลับไปเริ่มต้นใหม่นะครับ
– ขอบคุณที่ติดตาม แล้วพบกันใหม่ครับ
ถ้าจะให้ ข้อมูลเท่ากัน จะต้อง dump data ใน master ใส่ slave ก่อนใช่ไหมครับ แล้วค่อย ทำ replication
ขอบคุณอาจารย์ที่เสียสละ แบ่งบันความรู้ มากเลยครับ
ใช่แล้วครับ ข้อมูลจะเท่ากันครับ
ถ้า MASTER มี Database หลายตัว Slave มีหลาย Server แล้วต้องการให้ Slave แต่ละตัว Replicate เฉพาะ Database ที่เราต้องการสามารถทำได้หรือเปล่าคับ ถ้าทำได้มีวิธีการแนะนำมั๊ยครับ
ทำได้ครับ ไว้ว่างๆ จะริวิว วิธีให้นะครับ
อืม แบบนี้ก็น่าสนใจนะครับ
แบบนี้คือ replication จาก master ทุกฐานเลยป่าวครับ หรือว่าเฉพาะฐาน hos
Slave_IO_Running: No เกิดจากอะไรบ้างคะอาจารย์
Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the –replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).
อยากสอบถาม Error นี้หน่อยค่ะ เกิดจากสาเหตุใดได้บ้าง แล้วแก้ไขอย่างไรได้บ้างค่ะ เช็ค servier id แล้วก็ไม่ซ้ำค่ะ
สวัสดี ครับ ผมลองทำตามแล้ว ตอนนี้ฐานมันเกาะกันแล้ว (MariaDB คนละเวอร์ชัjน Master 10.10 ,Slave 10.5
ปรากฎว่าข้อมูล Slave ไม่เท่ากับ Master คือ ฐาน Master ที่สร้างก่อนและใช้งานมาสักพักแล้วจะไม่ไปที่ slave แต่ถ้าเป็นฐานใหม่ที่ Master สร้างขึ้นใหม่ จะเห็นที่ Slave ครับ แบบนี้ควรแก้อย่างไรครับ
แบบนี้ต้องทำการโอนข้อมูลของฐาน Master ให้เท่ากับ Slave ก่อนเปิดระบบ Replicate mysql นะครับ
ครับผม
ดีมาเลยครับ