Sao chép hỗn hợp, tức là kết hợp Galera và sao chép MySQL không đồng bộ trong cùng một thiết lập, trở nên dễ dàng hơn nhiều kể từ khi GTID được giới thiệu trong MySQL 5.6. Mặc dù việc sao chép từ một máy chủ MySQL độc lập sang một Cụm Galera khá đơn giản, nhưng thực hiện theo cách khác (Galera → MySQL độc lập) thì khó hơn một chút. Ít nhất là cho đến khi có GTID.
Có một vài lý do chính đáng để đính kèm một nô lệ không đồng bộ vào một Cụm Galera. Đối với một, các truy vấn loại báo cáo / OLAP chạy dài trên một nút Galera có thể làm chậm toàn bộ một cụm, nếu tải báo cáo quá lớn đến mức nút đó phải dành nhiều nỗ lực để đối phó với nó. Vì vậy, các truy vấn báo cáo có thể được gửi đến một máy chủ độc lập, giúp cách ly Galera khỏi tải báo cáo một cách hiệu quả. Trong phương pháp tiếp cận dây đai và dây treo, thiết bị phụ không đồng bộ cũng có thể đóng vai trò như một bản sao lưu trực tiếp từ xa.
Trong bài đăng trên blog này, chúng tôi sẽ chỉ cho bạn cách sao chép Cụm Galera sang máy chủ MySQL với GTID và cách chuyển đổi dự phòng sao chép trong trường hợp nút chính bị lỗi.
Sao chép kết hợp trong MySQL 5.5
Trong MySQL 5.5, việc tiếp tục sao chép bị hỏng yêu cầu bạn xác định vị trí và tệp nhật ký nhị phân cuối cùng, chúng khác biệt trên tất cả các nút Galera nếu tính năng ghi nhật ký nhị phân được bật. Chúng ta có thể minh họa tình huống này bằng hình sau:
Cấu trúc liên kết nô lệ không đồng bộ của cụm Galera không có GTIDNếu MySQL master không thành công, quá trình sao chép sẽ bị phá vỡ và nô lệ sẽ cần chuyển sang một master khác. Bạn sẽ cần chọn một nút Galera mới và xác định thủ công tệp nhật ký nhị phân mới và vị trí của giao dịch cuối cùng được thực hiện bởi nô lệ. Một tùy chọn khác là kết xuất dữ liệu từ nút chính mới, khôi phục nó trên nô lệ và bắt đầu sao chép với nút chính mới. Tất nhiên, những tùy chọn này có thể thực hiện được, nhưng không thực tế lắm trong sản xuất.
Cách GTID giải quyết vấn đề
GTID (Mã định danh giao dịch toàn cầu) cung cấp ánh xạ giao dịch tốt hơn giữa các nút và được hỗ trợ trong MySQL 5.6. Trong Galera Cluster, tất cả các nút sẽ tạo ra các tệp binlog khác nhau. Các sự kiện binlog giống nhau và theo cùng một thứ tự, nhưng tên tệp binlog và hiệu số có thể khác nhau. Với GTID, nô lệ có thể thấy một giao dịch duy nhất đến từ một số bản chính và điều này có thể dễ dàng được ánh xạ vào danh sách thực thi nô lệ nếu nó cần khởi động lại hoặc tiếp tục sao chép.
Cấu trúc liên kết nô lệ không đồng bộ của cụm Galera với chuyển đổi dự phòng GTIDTất cả các thông tin cần thiết để đồng bộ hóa với bản chính được lấy trực tiếp từ luồng nhân bản. Điều này có nghĩa là khi bạn đang sử dụng GTID để sao chép, bạn không cần phải bao gồm các tùy chọn MASTER_LOG_FILE hoặc MASTER_LOG_POS trong câu lệnh CHANGE MASTER TO. Thay vào đó, chỉ cần bật tùy chọn MASTER_AUTO_POSITION. Bạn có thể tìm thêm chi tiết về GTID trong trang Tài liệu MySQL.
Thiết lập tính năng sao chép kết hợp bằng tay
Đảm bảo rằng các nút Galera (chính) và (các) nô lệ đang chạy trên MySQL 5.6 trước khi tiếp tục thiết lập này. Chúng tôi có một cơ sở dữ liệu được gọi là sbtest trong Galera, cơ sở dữ liệu này chúng tôi sẽ sao chép sang nút phụ.
1. Bật các tùy chọn sao chép bắt buộc bằng cách chỉ định các dòng sau bên trong my.cnf của mỗi nút DB (bao gồm cả nút phụ):
Đối với các nút chính (Galera):
gtid_mode=ON
log_bin=binlog
log_slave_updates=1
enforce_gtid_consistency
expire_logs_days=7
server_id=1 # 1 for master1, 2 for master2, 3 for master3
binlog_format=ROW
Đối với nút phụ:
gtid_mode=ON
log_bin=binlog
log_slave_updates=1
enforce_gtid_consistency
expire_logs_days=7
server_id=101 # 101 for slave
binlog_format=ROW
replicate_do_db=sbtest
slave_net_timeout=60
2. Thực hiện khởi động lại theo cụm của Galera Cluster (từ ClusterControl UI> Manage> Upgrade> Rolling Restart). Thao tác này sẽ tải lại từng nút với các cấu hình mới và kích hoạt GTID. Khởi động lại nô lệ.
3. Tạo một người dùng sao chép nô lệ và chạy câu lệnh sau trên một trong các nút Galera:
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY 'slavepassword';
4. Đăng nhập vào nô lệ và kết xuất cơ sở dữ liệu sbtest từ một trong các nút Galera:
$ mysqldump -uroot -p -h192.168.0.201 --single-transaction --skip-add-locks --triggers --routines --events sbtest > sbtest.sql
5. Khôi phục tệp kết xuất vào máy chủ phụ:
$ mysql -uroot -p < sbtest.sql
6. Bắt đầu sao chép trên nút phụ:
mysql> STOP SLAVE;
mysql> CHANGE MASTER TO MASTER_HOST = '192.168.0.201', MASTER_PORT = 3306, MASTER_USER = 'slave', MASTER_PASSWORD = 'slavepassword', MASTER_AUTO_POSITION = 1;
mysql> START SLAVE;
Để xác minh rằng bản sao đang chạy chính xác, hãy kiểm tra đầu ra của trạng thái nô lệ:
mysql> SHOW SLAVE STATUS\G
...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
Thiết lập tính năng sao chép kết hợp bằng ClusterControl
Trong đoạn trước, chúng tôi đã mô tả tất cả các bước cần thiết để kích hoạt nhật ký nhị phân, khởi động lại từng nút cụm, sao chép dữ liệu và sau đó thiết lập sao chép. Quy trình này là một công việc tẻ nhạt và bạn có thể dễ dàng mắc lỗi ở một trong các bước này. Trong ClusterControl, chúng tôi đã tự động hóa tất cả các bước cần thiết.
1. Đối với người dùng ClusterControl, bạn có thể đi đến các nút trong trang Nút và bật ghi nhật ký nhị phân.
Bật ghi nhật ký nhị phân trên cụm Galera bằng ClusterControlThao tác này sẽ mở ra một hộp thoại cho phép bạn đặt thời hạn nhật ký nhị phân, bật GTID và tự động khởi động lại.
Bật ghi nhật ký nhị phân khi bật GTIDThao tác này bắt đầu một công việc, sẽ ghi những thay đổi này vào cấu hình một cách an toàn, tạo người dùng sao chép với các khoản trợ cấp thích hợp và khởi động lại nút một cách an toàn.
Mô tả ảnhLặp lại quy trình này cho từng nút Galera trong cụm, cho đến khi tất cả các nút cho biết chúng là nút chính.
Tất cả các nút của Cụm Galera hiện là chính2. Thêm nô lệ sao chép không đồng bộ vào cụm
Thêm nô lệ sao chép không đồng bộ vào Cụm Galera bằng ClusterControlVà đây là tất cả những gì bạn phải làm. Toàn bộ quy trình được mô tả trong đoạn trước đã được tự động hóa bởi ClusterControl.
Thay đổi Master
Nếu master được chỉ định gặp sự cố, slave sẽ thử kết nối lại một lần nữa ở giá trị slave_net_timeout (thiết lập của chúng tôi là 60 giây - mặc định là 1 giờ). Bạn sẽ thấy lỗi sau về trạng thái nô lệ:
Last_IO_Errno: 2003
Last_IO_Error: error reconnecting to master '[email protected]:3306' - retry-time: 60 retries: 1
Vì chúng tôi đang sử dụng Galera với GTID được bật nên chuyển đổi dự phòng chính được hỗ trợ qua ClusterControl khi Cluster và Node Auto Recovery đã được bật. Cho dù nút chính bị lỗi do kết nối mạng hay bất kỳ lý do nào khác, ClusterControl sẽ tự động không thành công với nút chính khác phù hợp nhất trong cụm.
Nếu bạn muốn thực hiện chuyển đổi dự phòng theo cách thủ công, chỉ cần thay đổi nút chính như sau:
mysql> STOP SLAVE;
mysql> CHANGE MASTER TO MASTER_HOST = '192.168.0.202', MASTER_PORT = 3306, MASTER_USER = 'slave', MASTER_PASSWORD = 'slavepassword', MASTER_AUTO_POSITION = 1;
mysql> START SLAVE;
Trong một số trường hợp, bạn có thể gặp phải lỗi "Mục nhập trùng lặp .. cho khóa" sau khi nút chính thay đổi:
Last_Errno: 1062
Last_Error: Could not execute Write_rows event on table sbtest.sbtest; Duplicate entry '1089775' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysqld-bin.000009, end_log_pos 85789000
Trong các phiên bản MySQL cũ hơn, bạn chỉ có thể sử dụng SET GLOBAL SQL_SLAVE_SKIP_COUNTER =n để bỏ qua các câu lệnh, nhưng nó không hoạt động với GTID. Miguel từ Percona đã viết một bài đăng trên blog tuyệt vời về cách sửa lỗi này bằng cách chèn các giao dịch trống.
Một cách tiếp cận khác, đối với cơ sở dữ liệu nhỏ hơn, cũng có thể là chỉ lấy một kết xuất mới từ bất kỳ nút Galera nào có sẵn, khôi phục nó và sử dụng câu lệnh RESET MASTER:
mysql> STOP SLAVE;
mysql> RESET MASTER;
mysql> DROP SCHEMA sbtest; CREATE SCHEMA sbtest; USE sbtest;
mysql> SOURCE /root/sbtest_from_galera2.sql; -- repeat step #4 above to get this dump
mysql> CHANGE MASTER TO MASTER_HOST = '192.168.0.202', MASTER_PORT = 3306, MASTER_USER = 'slave', MASTER_PASSWORD = 'slavepassword', MASTER_AUTO_POSITION = 1;
mysql> START SLAVE;
Các tài nguyên liên quan Galera Cluster cho MySQL - Hướng dẫn 9 DevOps để bắt đầu sản xuất với Galera Cluster cho MySQL Bạn cũng có thể sử dụng pt-table-checksum để xác minh tính toàn vẹn của bản sao, thêm thông tin trong bài đăng blog này.
Lưu ý:Vì trong sao chép MySQL, trình ứng dụng nô lệ theo mặc định vẫn là một luồng, nên không mong đợi hiệu suất sao chép không đồng bộ giống như sao chép song song của Galera. Đối với MySQL 5.6 và 5.7, có các tùy chọn để thực hiện sao chép không đồng bộ song song trên các nút phụ, nhưng về nguyên tắc, việc sao chép này vẫn phụ thuộc vào thứ tự chính xác của các giao dịch bên trong cùng một lược đồ. Nếu tải sao chép lớn và liên tục, độ trễ nô lệ sẽ tiếp tục tăng lên. Chúng tôi đã gặp những trường hợp nô lệ không bao giờ có thể bắt kịp chủ nhân.