Làm thế nào để cấu hình MySQL Replication (Master - Slave) trên máy chủ CentOS

Trong bài viết này, tôi hướng dẫn bạn cách cấu hình MySQL Replication (Master - Slave) trên máy chủ CentOS. Chúng ta sẽ cùng tìm hiểu thế nào là MySQL Replication? làm thế nào để cấu hình? và những chú ý.

Thế nào là MySQL Replication?

Là quá trình cho bạn dễ dàng tạo ra nhiều bản sao lưu của MySQL Database bằng cách sao chép chúng một cách từ động từ Master đến Slave. Điều này là rất hữu ích vì nhiều lý do, bao gồm cả việc tạo cho bạn một bản sao lưu dữ liệu dự phọng cho trường hợp rủi ro xảy ra; cũng là một cách để bạn có thể phân tích dữ liệu mà không sử dụng cơ sở dữ liệu chính (Master) làm ảnh hưởng đến system performance hoặc đơn giản như một phượng tiện để mở rộng quy mô.

Hướng dẫn này giới thiệu tới bạn cấu hình MySQL Replication với 01 Master và 01 Slave.

Làm thế nào để cấu hình MySQL Replication?

Bài viết sử dụng 02 máy chủ có địa chỉ IP:

  • 10.10.10.1 - Master Database
  • 10.10.10.2 - Slave Database
  • CentOS 6.6

Cấu hình MySQL Master

Bước 1: cài đặt MySQL

sudo yum install mysql-server mysql-client  

Bước 2: tạo bản sao lưu dự phòng cho file cấu hình gốc MySQL /etc/my.conf

cp /etc/my.conf /etc/my.conf.orig  

Bước 3: bắt đầu cấu hình MySQL Master, thay đổi cấu hình này nằm ở phần [mysqld]. Bạn có thể chọn bất kỳ một con số tự nhiên nào cho server-id và đây là con số duy nhất, không trùng với server-id trong MySQL Replication của bạn. Tôi khuyến nghị bạn chọn 1

  • Đây là số tự nhiên đầu tiên, nó thích hợp một cách tự nhiên và dễ nhớ để bắt đầu.
  • Sẽ khó bị quên hơn với 1 là server-id của MySQL Master. Từ sau đó là server-id của Slave
  • Bạn là người đầu tiên lolz

Thêm đoạn sau vào phần [mysqld]

# Enable binary logging & Replication
server_id           = 1  
log_bin             = /home/mysql/data/mysql-bin.log  


Đây là phần gốc rễ để sao lưu Database từ MySQL Master tới MySQL Slave. MySQL Slave sẽ sao chép tất cả những thay đổi có trong log_bin.

Nếu muốn lựa chọn Database sẽ sao chép sang MySQL Slave. Bạn cần thêm dòng sau
binlog_do_db = newdatabase
Bạn có thể thêm nhiều hơn một database bằng cách lặp lại dòng này cho tất cả Database bạn cần sao lưu.

Bước 4: Để áp dụng thay đổi, bạn cần restart MySQL Service
$sudo service mysqld restart

Bước 5: Giờ là lúc mở MySQL shell để làm tiếp
mysql -uroot -p

Bước 6: Bạn cần phân quyền cho MySQL Slave bằng cách tạo một slave_user và phân quyền cho slave_user này.

GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'10.10.10.2' IDENTIFIED BY 'password';  
FLUSH PRIVILEGES;  

Bước 7: Cần một chút tinh xảo từ bạn, và cẩn thận. Bạn mở một cửa sổ terminal mới, đăng nhập vào MySQL Master, đăng nhập vào MySQL shell.

Tại đây, do Database được chọn là newdatabase nên bạn cần chuyển tới newdatabase

USE newdatabase;  

Tiếp theo, bạn lock database để ngăn chặn bất kỳ thay đổi có thể xảy ra với newdatabase

FLUSH TABLES WITH READ LOCK;  

Tiếp theo, bạn gõ:

SHOW MASTER STATUS;  

Bạn sẽ nhìn thấy một bảng thông tin tương tự như dưới

mysql> SHOW MASTER STATUS;  
+------------------+----------+--------------+------------------+----------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set
+------------------+----------+--------------+------------------+----------------+
| mysql-bin.003894 | 44121282 |              |                  |      
+------------------+----------+--------------+------------------+----------------+
1 row in set (0.00 sec)

mysql>  

Đây là log_bin và vị trí mà MySQL Slave sẽ bắt đầu sao lưu. Bạn cần ghi lại hai thông số FilePosition. Lát nữa bạn sẽ dùng chúng.

Nếu bạn có bất kỳ thay đổi, gõ lệnh nào ở cửa sổ MySQL shell này, Database sẽ tự động unlock. Do đó, bạn cần mở tiếp một cửa sổ mới cho bước tiếp theo.

Bước 8: Bạn sẽ export database sử dụng mysqldump ở cửa sổ terminal mới. Hãy đảm bảo bạn đang ở bash shell terminal, không phải MySQL shell.

mysqldump -uroot -p --default-character-set=utf8 --opt newdatabase > newdatabase.sql  

Bước 9: Giờ là lúc bạn quay lại cửa sổ MySQL shell mà bạn FLUSH TABLES WITH READ LOCK;, gõ vào lệnh sau để unlock

UNLOCK TABLES;  

QUIT;  

Tới đây bạn đã hoàn thành cấu hình MySQL Master Database.

Cấu hình MySQL Slave

Bước 1: Bạn login vào máy chủ MySQL Slave, và mở cửa sổ MySQL shell. Bạn tạo mới newdatabase. Đây là Database bạn sẽ sao chép từ MySQL Master

CREATE DATABASE newdatabase CHARACTER SET utf8;  
EXIT;  

Bước 2: Import database mà bạn đã ExportBước 8: của Cấu hình MySQL Master

mysql -uroot -p --default-character-set=utf8 newdatabase  

Bước 3: bây giờ bạn cấu hình MySQL Slave. Trước khi bắt đầu, hãy backup cấu hình MySQL nguyên bản.

$sudo cp /etc/my.conf /etc/my.conf.orig

Bước 4: cấu hình MySQL Slave. Tôi đã nói với bạn về server-idBước 3: của Cấu hình MySQL Master. Và gán server-id của MySQL Master là 1, giờ bạn gán 2 cho MySQL Slave vào phần [mysqld]

server-id = 2  

Bước 5: thêm những dòng sau vào sau server-id = 2

relay-log               = /var/log/mysql/mysql-relay-bin.log  
log_bin                 = /var/log/mysql/mysql-bin.log  
binlog_do_db            = newdatabase  

Bước 6: restart MySQL Service để áp dụng thay đổi.

$sudo service mysqld restart

Bước 7: tiếp theo, bạn mở cửa sổ MySQL shell. Và gõ vào đó dòng sau đây

CHANGE MASTER TO MASTER_HOST='10.10.10.1',MASTER_PORT=3307,MASTER_USER='slave_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.003894', MASTER_LOG_POS=  44121282;  

Dòng trên làm những việc sau:

  • Nó chỉ định máy chủ hiện tại là MySQL Slave của MySQL Master (IP 10.10.10.1)
  • Nó cung cấp thông tin đăng nhập vào MySQL Master
  • Cuối cùng, nó cho MySQL Slave biết vị trí để bắt đầu sao chép

Bước 8: activate MySQL Slave.

START SLAVE;  

Bước 9: giờ là lúc bạn xem MySQL Slave vừa cấu hình đã hoạt động chưa? hoạt động thế nào? Bạn mở cửa sổ MySQL shell và gõ lệnh

mysql> show slave status\G;  
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.10.10.1
                  Master_User: slave_user
                  Master_Port: 3307
                Connect_Retry: 60
              Master_Log_File: mysql-bin.003908
          Read_Master_Log_Pos: 70419921
               Relay_Log_File: mysqld-relay-bin.000028
                Relay_Log_Pos: 70420084
        Relay_Master_Log_File: mysql-bin.003908
             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: 70419921
              Relay_Log_Space: 70420305
              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
Master_SSL_Verify_Server_Cert: No  
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: 97fcc20f-9ed8-11e6-9eaa-0025903d1878
             Master_Info_File: /home/mysql/data/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
1 row in set (0.00 sec)

ERROR:  
No query specified

mysql>  

Những lỗi có thể xảy ra

Trong quá trình replication giữa MySQL Master và MySQL Slave có thể bị gián đoạn vì lỗi sao lưu dữ liệu. Một số lỗi xảy ra như 1062, 1452, 1050, 1146, 1356, 1054, 1060, 1406

mysql> show slave status\G;  
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.10.10.1
                  Master_User: slave_user
                  Master_Port: 3307
                Connect_Retry: 60
              Master_Log_File: mysql-bin.003895
          Read_Master_Log_Pos: 1965103
               Relay_Log_File: mysqld-relay-bin.000394
                Relay_Log_Pos: 83593238
        Relay_Master_Log_File: mysql-bin.003892
             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: 1406
                   Last_Error: Error 'Data too long for column 'id1' at row 1' on query. Default database: 'newdatabase'
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 83593075
              Relay_Log_Space: 316678540
              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

Để sửa lỗi này, với kiến thức hiện giờ, Tiến đưa ra các phương án sau:

  • Stop SLave. Export Database ở MySQL Master bị lỗi, và Import lại vào MySQL Slave. Sau đó Start Slave.
  • Check log để tìm nguyên nhân tại sao xảy ra sự mất đồng bộ này và xử lý nó trước khi Restart MySQL Slave.
  • Cấu hình MySQL Slave bỏ qua những lỗi này bằng cách thêm dòng sau vào file cấu hình /etc/my.conf như sau slave-skip-error=1062,1452,1050,1146,1356,1054,1060,1406

Kết luận

Trong bài viết này, tôi đã hướng dẫn bạn cấu hình MySQL Replication (Master - Slave) trên máy chủ CentOS. Nếu bạn là người mới bắt đầu với MySQL Replication, tôi có niềm tin bài viết giúp ích cho bạn. Tôi rất vui khi bạn đọc tới đây.

Lời cám ơn

Tôi cám ơn bạn đã dành thời gian để đọc bài viết này. Tất nhiên, tôi luôn quan tâm đến hoàn thiện chất lượng bài viết, vì vậy mọi sự đóng góp của bạn là sự khích lệ đối với tôi.

Bài viết thể hiện quan điểm, văn phong của tác giả. Mọi sự tranh luận, phản biện được khuyến khích. Và tôi bảo lưu mọi quan điểm cho đến khi mọi thứ được sáng tỏ trên cơ sở sự chính xác của thông tin.

Tài liệu tham khảo

Để viết bài này, tôi đã sử dụng các tài liệu tham khảo
https://dev.mysql.com/doc/refman/5.7/en/replication-problems.html
https://dev.mysql.com/doc/refman/5.7/en/replication-administration-status.html
https://www.digitalocean.com/community/tutorials/how-to-set-up-master-slave-replication-in-mysql

Tien Phan

Read more posts by this author.

Subscribe to

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!