Cấu hình MySQL Replication (Master - Slave)




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.


Tài liệu tham khảo

https://manhtuong.net/can-bang-tai-cho-mysql/

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. MySQLSlave 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ố File và Position. 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 đã Export ở Bướ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-id ở Bướ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

No comments:

Post a Comment

The Ultimate XP Project

  (Bài chia sẻ của tác giả  Ryo Amano ) Trong  bài viết  số này, tôi muốn viết về dự án phát triển phần mềm có áp dụng nguyên tắc phát triển...