Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách định cấu hình sao chép bản sao mã nguồn trong MySQL

MySQL là một hệ quản trị cơ sở dữ liệu quan hệ là một trong những dự án nguồn mở phổ biến nhất. Mặc dù được biết đến với sự ổn định của nó, MySQL thậm chí còn đáng tin cậy hơn nếu bản sao mã nguồn được định cấu hình. Trong bản sao, một máy chủ MySQL thường được chỉ định là nguồn . Nguồn gửi bất kỳ thay đổi cơ sở dữ liệu và cập nhật dữ liệu nào tới một hoặc nhiều bản sao máy chủ cơ sở dữ liệu. Quy trình sao chép dữ liệu của MySQL rất linh hoạt và các máy chủ sao chép không cần phải được kết nối vĩnh viễn với nguồn. Hướng dẫn này giải thích cách định cấu hình sao chép dữ liệu nguồn-bản sao trong MySQL.

Cách hoạt động của tính năng sao chép dữ liệu MySQL

Quá trình sao chép lưu trữ dữ liệu trong cơ sở dữ liệu nguồn trước tiên và sau đó sao chép nó sang bất kỳ bản sao nào. Sau khi nó xử lý lệnh, máy chủ cơ sở dữ liệu nguồn sẽ theo dõi sự thay đổi trong nhật ký nhị phân. Nhật ký đóng vai trò như một bản ghi tuần tự của tất cả các thay đổi đối với cấu trúc và nội dung cơ sở dữ liệu. SELECT các câu lệnh không được ghi lại vì chúng không thay đổi nội dung cơ sở dữ liệu.

Các bản cập nhật diễn ra không đồng bộ, vì vậy các bản sao không cần phải được kết nối liên tục. Điều này trái ngược với kiến ​​trúc đồng bộ của các hệ thống có độ tin cậy cao. Nếu yêu cầu đồng bộ hóa thời gian thực, MySQL khuyên bạn nên sử dụng NDB Cluster .

Mỗi bản sao lấy dữ liệu từ nguồn bằng cách yêu cầu nội dung của nhật ký nhị phân của nguồn. Sau đó, bản sao áp dụng các câu lệnh theo thứ tự, phát lại một cách hiệu quả các sự kiện đã xảy ra trên nguồn. Mỗi bản sao là độc lập và theo dõi vị trí hiện tại của nó bằng nhật ký nhị phân nguồn. Ngoài ra, mỗi bản sao có thể đồng bộ hóa với nguồn theo lịch trình riêng của nó. Dữ liệu có thể được đọc từ bất kỳ máy chủ nào, kể cả các bản sao.

MySQL cho phép mức độ chi tiết cao. Có thể sao chép qua các cơ sở dữ liệu nhất định hoặc thậm chí các bảng cụ thể trong cơ sở dữ liệu. Định dạng sao chép mặc định là Sao chép dựa trên báo cáo (SBR), trong đó toàn bộ câu lệnh SQL được sao chép. Tuy nhiên, Sao chép dựa trên hàng (RBR) cũng có sẵn. Định dạng này sao chép các hàng đã được thay đổi. Cũng có thể cấu hình nhiều cấu hình phức tạp hơn. Tham khảo Tài liệu MySQL để biết thêm thông tin về các tùy chọn sao chép khác nhau.

Lưu ý MySQL trước đây gọi Nhân bản Nguồn-Bản sao là “Bản sao Chủ-nô lệ”. Tổ chức MySQL gần đây đã thay đổi thuật ngữ, giải thích lý do của họ trong bản cập nhật aterminology. Thuật ngữ cũ hơn "chính" đã được thay đổi thành "nguồn", trong khi "nô lệ" bây giờ được gọi là "bản sao". Các thuật ngữ cũ có thể vẫn xuất hiện trong các lệnh nhất định và hiển thị đầu ra trong khi MySQL cập nhật cơ sở mã của nó. Hướng dẫn này sử dụng các điều khoản ưu tiên của MySQL trong suốt các hướng dẫn.

Ưu điểm của MySQL Data Replication

Việc kích hoạt sao chép mã nguồn cung cấp nhiều lợi thế đáng kể so với hệ thống không dự phòng. Danh sách dưới đây cung cấp tổng quan về một số lợi ích:

  • Có thể dễ dàng tạo một bản sao lưu trực tiếp bất cứ lúc nào. Bởi vì quá trình sao chép là không đồng bộ, quá trình sao chép có thể xảy ra theo bất kỳ lịch trình nào. Các bản sao không cần phải được giữ đồng bộ với nguồn để hoạt động đáng tin cậy.

  • Thêm một bản sao có thể tăng thời gian hoạt động và độ tin cậy cho toàn bộ hệ thống. Điều khiển chính có thể chuyển sang bản sao nếu cần bảo trì hoặc cơ sở dữ liệu nguồn không khả dụng.

  • Mỗi bản sao cung cấp một bản sao có thể đọc được của cơ sở dữ liệu. Điều này cho phép các chương trình khai thác hoặc phân tích dữ liệu truy vấn bản sao mà không cần đặt thêm tải lên cơ sở dữ liệu nguồn ban đầu.

  • Kiến trúc này làm tăng khả năng mở rộng và hiệu suất. Cơ sở dữ liệu đọc và SELECT các câu lệnh có thể được cân bằng giữa các máy chủ, giảm độ trễ.

  • Các bên thứ ba có thể có được quyền truy cập chỉ đọc vào cơ sở dữ liệu thông qua bản sao và không còn yêu cầu quyền truy cập vào nguồn. Cơ sở dữ liệu bản sao có thể được tạo theo yêu cầu khi nó được yêu cầu và phá hủy khi không còn cần thiết nữa. Kỹ thuật này tăng cường bảo mật và đảm bảo không thể giả mạo dữ liệu gốc.

Trước khi bạn bắt đầu

  1. Nếu bạn chưa làm như vậy, hãy tạo một tài khoản Linode và Compute Instance. Xem hướng dẫn Bắt đầu với Linode và Tạo phiên bản Máy tính của chúng tôi.

  2. Làm theo hướng dẫn Thiết lập và Bảo mật Phiên bản Máy tính của chúng tôi để cập nhật hệ thống của bạn. Bạn cũng có thể muốn đặt múi giờ, định cấu hình tên máy chủ của mình, tạo tài khoản người dùng hạn chế và tăng cường quyền truy cập SSH.

  3. Bạn phải có ít nhất hai Linodes riêng biệt để cấu hình sao chép mã nguồn MySQL. Một Linode lưu trữ cơ sở dữ liệu nguồn, trong khi một nút khác là cần thiết cho máy chủ bản sao.

Lưu ý Các bước trong hướng dẫn này được viết cho người dùng không phải root. Các lệnh yêu cầu đặc quyền nâng cao có tiền tố là sudo . Nếu bạn không quen với sudo , hãy xem hướng dẫn Người dùng và Nhóm củaLinux.

Định cấu hình Source-Replica Replication trong MySQL

Để cấu hình sao chép mã nguồn, MySQL phải được cài đặt trên hai máy chủ riêng biệt có thể giao tiếp với nhau. Các hướng dẫn này hướng tới bản phân phối Ubuntu nhưng có thể áp dụng chung cho tất cả các bản phân phối Linux. Quy trình bao gồm các bước sau:

  1. Cài đặt MySQL.
  2. Định cấu hình Cơ sở dữ liệu nguồn MySQL.
  3. Định cấu hình Người dùng MySQL Mới cho Bản sao.
  4. Chuẩn bị Dữ liệu MySQL để Nhân rộng.
  5. Định cấu hình Cơ sở dữ liệu bản sao MySQL.
  6. Nhập dữ liệu MySQL đã sao chép và kích hoạt sao chép.

Cài đặt MySQL

Nếu MySQL chưa có sẵn trên cả hai Linodes, hãy cài đặt nó theo các bước sau:

  1. Nâng cấp Linodes.

     sudo apt-get update && sudo apt-get upgrade
    
  2. Cài đặt máy chủ MySQL và các ứng dụng khách trên cả máy chủ nguồn và máy chủ bản sao.

     sudo apt-get install mysql-server mysql-client -y
    
  3. Định cấu hình các tùy chọn bảo mật, bao gồm cả mật khẩu gốc, sử dụng mysql_secure_installation lệnh.

     sudo mysql_secure_installation
    
  4. Nếu bạn đang sử dụng tường lửa như ufw , đảm bảo nó cho phép lưu lượng truy cập MySQL thông qua. Thêm quy tắc sau để mở cổng 3306 trên tường lửa.

     ufw allow mysql
    

Định cấu hình Cơ sở dữ liệu Nguồn MySQL

Để kích hoạt sao chép MySQL, hãy chỉnh sửa một số biến trong tệp cấu hình MySQL chính. Thực hiện các thay đổi sau đối với cấu hình cơ sở dữ liệu nguồn.

  1. Định vị tệp cấu hình MySQL chính trên máy chủ cơ sở dữ liệu nguồn. Tệp này thường được tìm thấy tại /etc/mysql/mysql.conf.d/mysqld.cnf . Tuy nhiên, trong các bản cài đặt trước đó, nó có thể được đặt tại /etc/my.cnf hoặc /etc/mysql/my.cnf . Nó cũng có thể được tham chiếu từ một trong các tệp thông qua includedir chỉ thị.

  2. Mở tệp cấu hình MySQL và thay đổi bind-address tới địa chỉ IP của máy chủ nguồn.

    Tệp:/ etc / mysql / mysql.conf.d / mysqld.cnf
    1
    2
    
    bind-address  = <source_ip_address>
        
  3. Bỏ ghi chú hoặc thêm các dòng cho server-idlog-bin . Đặt server-id thành 1log-bin tới /var/log/mysql/mysql-bin.log .

    Lưu ý Đảm bảo skip_networking biến không được khai báo ở bất kỳ đâu. Bình luận nó ra nếu nó xuất hiện bên trong tệp này. Để sao chép một cơ sở dữ liệu, hãy thêm dòng binlog_do_db = <database_name> vào tệp.
    Tệp:/ etc / mysql / mysql.conf.d / mysqld.cnf
    1
    2
    3
    
    server-id  = 1
    log_bin  = /var/log/mysql/mysql-bin.log
        
  4. Khởi động lại dịch vụ MySQL.

     sudo systemctl restart mysql
    
  5. Xác minh trạng thái của MySQL và đảm bảo nó đang active .

     sudo systemctl status mysql
    
    mysql.service - MySQL Community Server
    Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
    Active: active (running) since Sun 2021-05-30 13:06:47 UTC; 1 day 1h ago

Định cấu hình Người dùng MySQL Mới cho Bản sao

Bạn phải tạo một người dùng mới trên máy chủ nguồn để đại diện cho bản sao. Người dùng mới được tạo bên trong MySQL shell.

  1. Nhập MySQL shell.

     sudo mysql -u root -p
    
  2. Thêm người dùng cho tài khoản bản sao bằng cách sử dụng MySQL CREATE USER cú pháp. Tên người dùng phải bao gồm tên của tài khoản bản sao, @ và địa chỉ IP của máy chủ bản sao. Chọn một mật khẩu an toàn hơn cho tài khoản thay cho REPLICA_PASSWORD .

     CREATE USER 'replica_account_name'@'replica_ip_address‘ IDENTIFIED WITH sha256_password BY 'REPLICA_PASSWORD';
    
    Lưu ý Để cho phép bản sao có thể kết nối từ bất kỳ địa chỉ nào, hãy chỉ định người dùng là 'replica_account_name'@'%' . % biểu tượng đại diện cho bất kỳ địa chỉ hoặc miền nào. Điều này cung cấp thêm tính linh hoạt với chi phí bảo mật.
  3. Cấp quyền sao chép cho người dùng sao chép từ xa.

     GRANT REPLICATION SLAVE ON *.* TO 'replica_account_name'@'replica_ip_address';
    

Chuẩn bị Dữ liệu MySQL để Nhân rộng

Tại thời điểm này, cần phải xóa và khóa cơ sở dữ liệu nguồn để phân đoạn dữ liệu để nhân rộng.

  1. Giữ nguyên bên trong MySQL shell và xóa các đặc quyền để tải lại các bảng cấp mà không cần khởi động lại cơ sở dữ liệu.

     FLUSH PRIVILEGES;
    
  2. Khóa cơ sở dữ liệu để đóng băng cơ sở dữ liệu tại một điểm ổn định từ đó xuất dữ liệu. Giữ máy khách MySQL chạy cho đến khi bạn xuất cơ sở dữ liệu. Nhập bất kỳ lệnh ghi nào hoặc thoát khỏi MySQL shell sẽ giải phóng khóa.

     FLUSH TABLES WITH READ LOCK;
    
    Thận trọng Lệnh này chặn tất cả các cam kết đối với cơ sở dữ liệu nguồn. Xuất dữ liệu trước khi cho phép nguồn xử lý thêm bất kỳ cam kết nào. Nếu không, cơ sở dữ liệu bản sao có thể bị hỏng hoặc không phù hợp với cơ sở dữ liệu nguồn. Hoàn thành hai bước còn lại trong phần này càng sớm càng tốt.
  3. Xác minh trạng thái của cơ sở dữ liệu bằng lệnh sau. Lệnh này hiển thị tệp nhật ký hiện tại cùng với vị trí của bản ghi cuối cùng trong tệp này. Ghi lại thông tin này vì nó được yêu cầu để bắt đầu sao chép trên bản sao sau này.

     SHOW MASTER STATUS;
    
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000002 |     1301 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
  4. Sử dụng Linux shell từ một bảng điều khiển khác, xuất cơ sở dữ liệu bằng mysqldump dụng cụ. Chọn một tên dễ nhớ cho tệp đích. Bao gồm –master-data tùy chọn để thêm thông tin về tệp nhật ký và vị trí của bản ghi hiện tại vào nhật ký.

     sudo mysqldump -u root -p -–all-databases -–master-data > databasecopy.sql
    
    Lưu ý Để xuất một cơ sở dữ liệu, hãy bao gồm --opt <database_name> thay vì -–all-databases .
  5. Quay lại trình bao MySQL ban đầu, mở khóa cơ sở dữ liệu nguồn.

     UNLOCK TABLES;
    
  6. Thoát khỏi trình bao MySQL.

     QUIT;
    
  7. Sao chép tệp cơ sở dữ liệu đã xuất sang máy chủ cơ sở dữ liệu bản sao, sử dụng ftp , scp hoặc một phương pháp truyền tệp khác.

     scp databasecopy.sql [email protected]<replica_ip_address>
    

Định cấu hình Cơ sở dữ liệu MySQL Replica

Cấu hình sau đây sẽ được áp dụng cho cấu hình cơ sở dữ liệu bản sao. Để cài đặt MySQL trên máy chủ bản sao, hãy xem phần Cài đặt MySQL.

  1. Mở tệp MySQL chính, thường nằm tại /etc/mysql/mysql.conf.d/mysqld.cnf và thay đổi bind-address để khớp với địa chỉ IP của máy chủ bản sao.

    Tệp:/ etc / mysql / mysql.conf.d / mysqld.cnf
    1
    2
    
    bind-address  = xx.xx.xx.xx
        
  2. Bỏ ghi chú hoặc thêm các dòng cho server-idlog-bin . server-id phải được đặt thành 2 trên bản sao, trong khi log-bin biến phải được đặt thành /var/log/mysql/mysql-bin.log . Thêm một biến cho relay-log và đặt nó thành /var/log/mysql/mysql-relay-bin.log .

    Lưu ý Đảm bảo skip_networking biến không được đặt ở bất kỳ đâu bên trong tệp này. Để sao chép một cơ sở dữ liệu, hãy thêm lệnh sau vào tệp binlog_do_db = database_name . Để định cấu hình nhiều bản sao, hãy đánh số server-id các giá trị theo cách tăng dần. Ví dụ:bản sao thứ hai sẽ có server-id trong tổng số 3 .
    Tệp:/ etc / mysql / mysql.conf.d / mysqld.cnf
    1
    2
    3
    4
    
    server-id        = 2
    log_bin    = /var/log/mysql/mysql-bin.log
    relay-log        = /var/log/mysql/mysql-relay-bin.log
        
  3. Khởi động lại dịch vụ MySQL để kết hợp các thay đổi.

     sudo systemctl restart mysql
    
  4. Xác minh trạng thái của MySQL và đảm bảo nó đang active .

     sudo systemctl status mysql
    
    mysql.service - MySQL Community Server
         Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset:>
         Active: active (running) since Mon 2021-05-31 16:29:48 UTC; 6s ago
  5. ( Tùy chọn ) MySQL khuyến nghị sử dụng SSL để kết nối với nguồn để bảo mật cao hơn. Có thể tìm thấy thêm thông tin về cách định cấu hình SSL trong Tài liệu SSL của MySQL. Công cụ thiết lập RSA có thể được sử dụng để đẩy nhanh quá trình này.

Nhập dữ liệu MySQL được sao chép và kích hoạt bản sao

Bước tiếp theo là nhập bản sao của dữ liệu cơ sở dữ liệu, đặt nguồn sao chép và khởi động lại máy chủ cơ sở dữ liệu bản sao. Sau đó, bản sao phải được đồng bộ hóa và sẵn sàng sử dụng.

  1. Nhập lệnh sau từ trình bao Linux để nhập cơ sở dữ liệu nguồn. Chỉ định tên cơ sở dữ liệu được sử dụng để xuất dữ liệu trước đó.

     sudo mysql -u root -p < databasecopy.sql
    
  2. Đăng nhập vào MySQL shell.

     sudo mysql -u root -p
    
  3. Dừng bản sao.

     STOP REPLICA;
    
  4. Nhập CHANGE REPLICATION SOURCE lệnh, cùng với các chi tiết sau. Thay thế địa chỉ IP của máy chủ cơ sở dữ liệu nguồn thay cho source_ip_address . Đối với SOURCE_USERSOURCE_PASSWORD , nhập chi tiết tên người dùng và mật khẩu của bản sao từ Định cấu hình Người dùng MySQL mới cho phần Bản sao. Đối với SOURCE_LOG_FILESOURCE_LOG_POS giá trị, nhập thông tin bạn đã ghi lại từ SHOW MASTER STATUS; lệnh.

     CHANGE REPLICATION SOURCE TO SOURCE_HOST='source_ip_address',SOURCE_USER='replica_account_name', SOURCE_PASSWORD='REPLICA_PASSWORD', SOURCE_LOG_FILE='log_file_name', SOURCE_LOG_POS=log_position;
    
    Lưu ý Để sử dụng SSL cho kết nối mà MySQL khuyến nghị, hãy thêm thuộc tính SOURCE_SSL=1 vào lệnh. Bạn có thể tìm thấy thêm thông tin về cách sử dụng SSL trong ngữ cảnh sao chép mã nguồn trong tài liệu MySQL.
  5. Khởi động lại bản sao.

     START REPLICA;
    
  6. Xác minh tình trạng của bản sao. Bản sao phải chờ các sự kiện và không được có bất kỳ Last_IO_Error nào hoặc Last_Error sự kiện. Slave_SQL_Running_State mục nhập phải cho biết bản sao đã đọc nhật ký chuyển tiếp.

     SHOW REPLICA STATUS\G
    
    Slave_IO_State: Waiting for master to send event
                      Master_Host: 178.79.153.39
                      Master_User: replica
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000006
              Read_Master_Log_Pos: 156
                   Relay_Log_File: mysql-relay-bin.000006
                    Relay_Log_Pos: 371
            Relay_Master_Log_File: mysql-bin.000006
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
    ..
                       Last_Errno: 0
                       Last_Error:
    ..
            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: 5bed9d10-c140-11eb-bc63-f23c92a2a6ac
                 Master_Info_File: mysql.slave_master_info
                        SQL_Delay: 0
              SQL_Remaining_Delay: NULL
          Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates

Kiểm tra MySQL Source-Replica Replication

Nếu cơ sở dữ liệu nguồn đã được điền trước khi bản sao được khởi tạo, thì cần phải kiểm tra thêm. Trong trường hợp này, hãy xác minh cơ sở dữ liệu và bảng tồn tại trên nguồn có trên bản sao sau khi dữ liệu được nhập. Trong SHOW REPLICA STATUS hiển thị, Slave_SQL_Running_State mục nhập phải đọc Slave has read all relay log .

Để xác minh sao chép đang diễn ra đúng cách, hãy tạo một cơ sở dữ liệu hoặc bảng mới trên nguồn. Sau một vài giây, mục nhập mới sẽ xuất hiện trên bản sao. Xác thực sự hiện diện của cơ sở dữ liệu bằng cách sử dụng SHOW DATABASES; yêu cầu. Để xác nhận sự hiện diện của một bảng, hãy chuyển sang cơ sở dữ liệu bằng cách sử dụng USE databasename; và nhập SHOW TABLES; . Bạn cũng nên chạy SHOW REPLICA STATUS ra lệnh và xem xét kỹ lưỡng kết quả đầu ra xem có bất kỳ lỗi nào không. Last_ErrorLast_IO_Error các trường phải trống và bản sao vẫn được kết nối.

Tìm hiểu thêm về MySQL Source-Replica Replication

Nguồn tốt nhất cho thông tin về sao chép mã nguồn là tài liệu MySQL chính thức. Phần nhân rộng chứa nhiều thông tin mở rộng hơn về kiến ​​trúc và quá trình cài đặt. Diễn đàn TheMySQL cũng có thể hữu ích.

Thông tin khác

Bạn có thể muốn tham khảo các nguồn sau đây để biết thêm thông tin về chủ đề này. Mặc dù những điều này được cung cấp với hy vọng rằng chúng sẽ hữu ích, xin lưu ý rằng chúng tôi không thể đảm bảo tính chính xác hoặc kịp thời của các tài liệu được lưu trữ bên ngoài.

  • Tài liệu MySQL

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách kiểm tra trạng thái máy chủ trong MySQL Workbench bằng GUI

  2. Cách tạo bảng tổng hợp động trong MySQL

  3. Hướng dẫn SQL về khóa chính - Cách xác định khóa chính trong cơ sở dữ liệu

  4. Trả về kết quả mặc định cho giá trị IN bất kể

  5. MySQL - đếm tổng số hàng trong php