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 ที

ที่มา: https://www.vpsserver.com/community/tutorials/9/setup-a-master-to-master-replication-between-two-mariadb-servers/

—————————————————————————————————

หากพบว่า 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 หายไปไหม
 

 

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องที่ต้องการถูกทำเครื่องหมาย *