MariaDB 10.1 on CentOS 7 Replication Master to Master
ลง db ที่นี้ http://kmzohan.com/2020/10/26/install-mariadb-10-1-centos-7/
โดย server มี ip
server 1 (192.168.213.157)
server 2 (192.168.213.158)
จากนั้น สร้าง db ไว้ก่อน ในที่นี้ db ผมชื่อ radius
อย่าลืม test connection 2 ฝั่ง ping และ เช็ค post และ ลอง login ข้ามเครื่อง
set hostname 2 เครื่องให้ชัดเจน ไม่แน่ใจว่าจะมีผลกับ MariaDB ไหม แต่เพื่อไม่งง
โดยทำตามลำดับดังนี้
server 1
แก้ไข vi /etc/my.cnf
[mysqld]
log-bin
server_id=1
replicate-do-db=radius
ต่อมา
systemctl restart mariadb
จากนั้น mysql -u root -p เพื่อเข้าไปสั่งงาน CREATE USER 'master_username'@'%' IDENTIFIED BY 'master_password'; GRANT REPLICATION SLAVE ON *.* TO 'master_username'@'%';
FLUSH PRIVILEGES;
SHOW MASTER STATUS; จากนั้นจะแสดงดังนี้
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB|
+------------------+----------+--------------+------------------+
| test_db1.000001 | 626 | | |
+------------------+----------+--------------+------------------+
จากตาราง ให้ดู ค่า
test_db1.000001 และ
626 ไว้ ต้องไปใช้อีก server
server 2
แก้ไข vi /etc/my.cnf
[mysqld]
log-bin
server_id=2
replicate-do-db=radius
ต่อมา
systemctl restart mariadb
จากนั้น mysql -u root -p เพื่อเข้าไปสั่งงาน CREATE USER 'master_username'@'%' IDENTIFIED BY 'master_password'; GRANT REPLICATION SLAVE ON *.* TO 'master_username'@'%';
FLUSH PRIVILEGES;
จากนี้จะเริ่ม Replication จาก เครื่อง 2 ไป เครื่อง 1 stop slave;
CHANGE MASTER TO MASTER_HOST = '
192.168.213.157
', MASTER_USER = 'master_username', MASTER_PASSWORD = 'master_password', MASTER_LOG_FILE = 'test_db1-bin.000001', MASTER_LOG_POS = 626; จาก command
192.168.213.157 คือ ip เครื่อง 1
test_db1-bin.000001 ,
626 คือที่ใช้จดไว้ อาจจะต้องลองเช็คก่อนที่ คำสั่ง
SHOW MASTER STATUS; ว่าตรงไหมที่ server 1
จากนั้น start slave; ต่อมา ตั้งทำการเชื่อมจาก เครื่อง 1 ไป เครื่อง 2 โดยต้อง
SHOW MASTER STATUS; เพื่อดูข้อมูลที่ server 2 ก่อน
SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB|
+------------------+----------+--------------+------------------+
| test_db2.000002 | 635 | | |
+------------------+----------+--------------+------------------+
server 1
กลับมาที่ server 1 จากนั้น mysql -u root -p เพื่อเข้าไปสั่งงาน
stop slave;
CHANGE MASTER TO MASTER_HOST = '
192.168.213.158
', MASTER_USER = 'master_username', MASTER_PASSWORD = 'master_password', MASTER_LOG_FILE = 'test_db2-bin.000002', MASTER_LOG_POS = 635; จาก command
192.168.213.158 คือ ip เครื่อง 2
test_db2-bin.000002 , 635
คือที่ใช้จดไว้ อาจจะต้องลองเช็คก่อนที่ คำสั่ง
SHOW MASTER STATUS; ว่าตรงไหมที่ server 2
จากนั้น
start slave;
ทดสอบ
เบื้องต้องทดสอบตามนี้
-down server 1 หรือ server 2 แล้วเพิ่มข้อมูล จากนั้น up server 1 หรือ server 2 ข้อมูลเพิ่มลบแก้ไข ปกติ
-network down server 1 หรือ server 2 แล้วเพิ่มข้อมูล จากนั้น up server 1 หรือ server 2 ข้อมูลเพิ่มลบแก้ไข ปกติ
-แต่ยังไม่ได้ ทดสอบ ข้อมูลเยอะๆ หรือ down นานๆ
วิธีตรวจสอบ rep โดยเข้าไปที่ mysql -u -p
จากนั้น run SHOW SLAVE STATUS \G ควรจะขึ้นแบบนี้
Slave_IO_Running: Yes Slave_SQL_Running: Yes ------------------------------------------------------------------
หากพบว่า Slave_SQL_Running: NO ให้สั่ง ตามนี้
STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; START SLAVE; ทีแรกอาจไม่ได้ลอง สัก 2-3 ที
—————————————————————————————————
หากพบว่า Error ‘Duplicate entry ‘3054567’ for key ‘PRIMARY” on query. Default database: ‘radius’. ที่ SHOW SLAVE STATUS \G
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.254.30.104
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysqld-bin.000004
Read_Master_Log_Pos: 120
Relay_Log_File: mysqld-relay-bin.000003
Relay_Log_Pos: 64342
Relay_Master_Log_File: mysqld-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1062
Last_Error: Error 'Duplicate entry '%-test-' for key 'PRIMARY'' on query. Default database: 'mysql'. Query: 'INSERT INTO db SELECT * FROM tmp_db WHERE @had_db_table=0;'
จากข้อความด้านบนจะเห็นได้ว่า Last_Errno: 1062 จะเลขตามนี้
ปัญหาเกิดจากคำสั่ง sql ที่ลง ไม่ควร ใส่ id ไปด้วย เพื่อจาก เป็น PRIMARY แต่เนื่องจากแกี่ sql ไม่ได้ เลยต้อง skip error
1062 ทิ้งไปโดย
Add the parameter to my.cnf
slave-skip-errors = 1062
จากนั้นเข้า mysql แล้ว
STOP SLAVE;
SET GLOBAL sql_slave_skip_counter=1;
START SLAVE;
แล้ว restart service mysql ทำทั้ง 2 เครื่อง จากนั้น เช็ค SHOW SLAVE STATUS \G ดูว่า
Slave_IO_Running: Yes Slave_SQL_Running: Yes ไหมและ error หายไปไหม