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

Cách khôi phục MySQL Galera Cluster từ một Slave không đồng bộ

Giới thiệu

Khi chạy Galera Cluster, một thực tế phổ biến là thêm một hoặc nhiều nô lệ không đồng bộ trong cùng một trung tâm dữ liệu hoặc trong một trung tâm dữ liệu khác. Điều này cung cấp cho chúng tôi một kế hoạch dự phòng với RTO thấp và với chi phí vận hành thấp. Trong trường hợp xảy ra sự cố không thể khắc phục trong cụm của chúng tôi, chúng tôi có thể nhanh chóng chuyển đổi dự phòng để các ứng dụng có thể tiếp tục có quyền truy cập vào dữ liệu.

Khi sử dụng kiểu thiết lập này, chúng ta không thể xây dựng lại cụm của mình từ bản sao lưu trước đó. Vì nô lệ không đồng bộ hiện là nguồn chân lý mới, chúng tôi cần xây dựng lại cụm từ đó.

Điều này không có nghĩa là chúng ta chỉ có một cách để làm, thậm chí có thể có một cách tốt hơn! Vui lòng cho chúng tôi đề xuất của bạn trong phần nhận xét ở cuối bài đăng này.

Cấu trúc liên kết

ClusterControl Topology View Online

Ở trên, chúng ta có thể thấy một cấu trúc liên kết mẫu với Galera Cluster và một bản sao / nô lệ không đồng bộ.

Sơ đồ cơ sở dữ liệu 1

Tiếp theo, chúng ta sẽ xem cách chúng ta có thể tạo lại cụm của mình, bắt đầu từ nô lệ, trong trường hợp tìm thấy thứ gì đó như sau:

Sơ đồ cơ sở dữ liệu 2 ClusterControl Topology View Offline

Nếu chúng ta nhìn vào hình ảnh trước đó, chúng ta có thể thấy 3 nút Galera của chúng ta đang giảm. Nô lệ của chúng tôi không thể kết nối với Galera master nhưng nó đang ở trạng thái "Đang hoạt động".

Quảng bá Slave

Khi nô lệ của chúng tôi hoạt động bình thường, chúng tôi có thể quảng bá nó để làm chủ và chỉ các ứng dụng của chúng tôi vào nó. Đối với điều này, chúng tôi phải tắt tham số chỉ đọc trong máy chủ của mình và đặt lại cấu hình máy chủ.

Trong nô lệ của chúng tôi (mysql1):

mysql> SET GLOBAL read_only=0;
Query OK, 0 rows affected (0.00 sec)
mysql> STOP SLAVE;
Query OK, 0 rows affected (0.00 sec)
mysql> RESET SLAVE;
Query OK, 0 rows affected (0.18 sec)

Tạo cụm mới

Tiếp theo, để bắt đầu khôi phục cụm bị lỗi, chúng tôi sẽ tạo một Cụm Galera mới. Điều này có thể dễ dàng thực hiện thông qua ClusterControl ClusterControl, vui lòng cuộn xuống dưới blog này để xem cách thực hiện.

Khi chúng tôi đã triển khai cụm Galera mới của mình, chúng tôi sẽ có một cái gì đó giống như sau:

Sơ đồ cơ sở dữ liệu 3

Nhân rộng

Chúng tôi phải đảm bảo rằng chúng tôi đã định cấu hình các thông số sao chép.

Đối với các nút Galera (galera1, galera2, galera3):

server_id=<ID>         # Different value in each node
binlog_format=ROW
log_bin = /var/lib/mysql-binlog/binlog
log_slave_updates = ON
gtid_mode = ON
enforce_gtid_consistency = true
relay_log = relay-bin
expire_logs_days = 7

Đối với nút Chính (mysql1):

server_id=<ID>         # Different value in each node
binlog_format=ROW
log_bin=binlog
log_slave_updates=1
gtid_mode=ON
enforce_gtid_consistency=1
relay_log=relay-bin
expire_logs_days=7
read_only=ON
sync_binlog=1
report_host=<HOSTNAME or IP>    # Local server

Để nô lệ mới của chúng tôi (galera1) kết nối với chủ mới của chúng tôi (mysql1), chúng tôi phải tạo một người dùng có quyền sao chép trong chủ của chúng tôi.

Trong trang chủ mới của chúng tôi (mysql1):

mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'slave_password';

Lưu ý:Chúng tôi có thể thay thế "%" bằng IP của nút Galera Cluster sẽ là nô lệ của chúng tôi, trong ví dụ của chúng tôi là galera1.

Sao lưu

Nếu chúng ta không có nó, chúng ta phải tạo một bản sao lưu nhất quán cho master của chúng ta (mysql1) và tải nó vào Galera Cluster mới của chúng ta. Đối với điều này, chúng ta có thể sử dụng công cụ XtraBackup hoặc mysqldump. Hãy xem cả hai tùy chọn.

Trong ví dụ của chúng tôi, chúng tôi sử dụng cơ sở dữ liệu sakila có sẵn để thử nghiệm.

Công cụ XtraBackup

Chúng tôi tạo bản sao lưu trong bản chính mới (mysql1). Trong trường hợp của chúng tôi, chúng tôi gửi nó đến thư mục cục bộ / root / backup:

$ innobackupex /root/backup/

Chúng ta phải nhận được thông báo:

180705 22:08:14 completed OK!

Chúng tôi nén bản sao lưu và gửi nó đến nút sẽ là nô lệ của chúng tôi (galera1):

$ cd /root/backup
$ tar zcvf 2018-07-05_22-08-07.tar.gz 2018-07-05_22-08-07
$ scp /root/backup/2018-07-05_22-08-07.tar.gz galera1:/root/backup/

Trong galera1, giải nén bản sao lưu:

$ tar zxvf /root/backup/2018-07-05_22-08-07.tar.gz

Chúng tôi dừng cụm (nếu nó được bắt đầu). Đối với điều này, chúng tôi dừng các dịch vụ mysql của 3 nút:

$ service mysql stop

Trong galera1, chúng tôi đổi tên thư mục dữ liệu của mysql và tải bản sao lưu:

$ mv /var/lib/mysql /var/lib/mysql.bak
$ innobackupex --copy-back /root/backup/2018-07-05_22-08-07

Chúng ta phải nhận được thông báo:

180705 23:00:01 completed OK!

Chúng tôi chỉ định các quyền chính xác trên thư mục dữ liệu:

$ chown -R mysql.mysql /var/lib/mysql

Sau đó, chúng ta phải khởi tạo cụm.

Khi nút đầu tiên được khởi tạo, chúng tôi phải khởi động dịch vụ MySQL cho các nút còn lại, loại bỏ mọi bản sao trước đó của tệp grastate.dat, sau đó xác minh rằng dữ liệu của chúng tôi đã được cập nhật.

$ rm /var/lib/mysql/grastate.dat
$ service mysql start

Lưu ý:Xác minh rằng người dùng được sử dụng bởi XtraBackup được tạo trong nút khởi tạo của chúng tôi và giống nhau trong mỗi nút.

mysqldump

Nói chung, chúng tôi không khuyên bạn nên làm điều đó với mysqldump, vì nó có thể khá chậm với một khối lượng lớn dữ liệu. Nhưng nó là một giải pháp thay thế để thực hiện nhiệm vụ.

Chúng tôi tạo bản sao lưu trong bản chính mới (mysql1):

$ mysqldump -uroot -p --single-transaction --skip-add-locks --triggers --routines --events --databases sakila > /root/backup/sakila_dump.sql

Chúng tôi nén nó và gửi nó đến nút nô lệ của chúng tôi (galera1):

$ gzip /root/backup/sakila_dump.sql
$ scp /root/backup/sakila_dump.sql.gz galera1:/root/backup/

Chúng tôi tải kết xuất vào galera1.

$ gunzip /root/backup/sakila_dump.sql.gz
$ mysql -p < /root/backup/sakila_dump.sql

Khi kết xuất được tải trong galera1, chúng tôi phải khởi động lại dịch vụ MySQL trên các nút còn lại, xóa tệp grastate.dat và xác minh rằng chúng tôi đã cập nhật dữ liệu của mình.

$ rm /var/lib/mysql/grastate.dat
$ service mysql start

Bắt đầu Replication Slave

Bất kể tùy chọn nào chúng tôi chọn, XtraBackup hay mysqldump, nếu mọi thứ diễn ra tốt đẹp, trong bước này, chúng tôi đã có thể bật tính năng sao chép trong nút sẽ là nô lệ của chúng tôi (galera1).

$ mysql> CHANGE MASTER TO MASTER_HOST = 'mysql1', MASTER_PORT = 3306, MASTER_USER = 'slave_user', MASTER_PASSWORD = 'slave_password', MASTER_AUTO_POSITION = 1;
$ mysql> START SLAVE;

Chúng tôi xác minh rằng nô lệ đang hoạt động:

mysql> SHOW SLAVE STATUS\G
       Slave_IO_Running: Yes
       Slave_SQL_Running: Yes

Tại thời điểm này, chúng tôi có một cái gì đó như sau:

Sơ đồ cơ sở dữ liệu 4

Sau khi NewGalera1 được cập nhật, chúng tôi có thể trỏ lại ứng dụng đến cụm galera mới của mình và định cấu hình lại bản sao không đồng bộ.

ClusterControl

Như chúng tôi đã đề cập trước đó, với ClusterControl, chúng tôi có thể thực hiện một số tác vụ được đề cập ở trên bằng một vài cú nhấp chuột đơn giản. Nó cũng có các tùy chọn khôi phục tự động, cho cả các nút và cụm. Hãy xem một số tác vụ mà nó có thể hỗ trợ.

Triển khai ClusterControl 1

Để thực hiện triển khai, chỉ cần chọn tùy chọn “Triển khai cụm cơ sở dữ liệu” và làm theo hướng dẫn xuất hiện.

Triển khai ClusterControl 2

Chúng ta có thể lựa chọn giữa các loại công nghệ và nhà cung cấp khác nhau. Chúng tôi phải chỉ định Người dùng, Khóa hoặc Mật khẩu và cổng để kết nối bằng SSH với máy chủ của chúng tôi. Chúng tôi cũng cần tên cho cụm mới của mình và nếu chúng tôi muốn ClusterControl cài đặt phần mềm và cấu hình tương ứng cho chúng tôi.

Triển khai ClusterControl 3

Sau khi thiết lập thông tin truy cập SSH, chúng ta phải xác định các nút trong cụm của chúng ta. Chúng tôi cũng có thể chỉ định kho lưu trữ nào sẽ sử dụng. Chúng tôi cần thêm máy chủ của mình vào cụm mà chúng tôi sẽ tạo.

Chúng tôi có thể theo dõi trạng thái tạo cụm mới của mình từ trình theo dõi hoạt động ClusterControl.

Ngoài ra, chúng ta có thể nhập cụm hoặc cơ sở dữ liệu hiện tại của mình theo các bước tương tự. Trong trường hợp này, ClusterControl sẽ không cài đặt phần mềm cơ sở dữ liệu vì đã có một cơ sở dữ liệu đang chạy.

ClusterControl Thêm Replication Salve

Để thêm nô lệ nhân bản, bạn cần nhấp vào Hành động cụm, chọn Thêm nô lệ nhân bản và thêm thông tin truy cập SSH của máy chủ mới. ClusterControl sẽ kết nối với máy chủ để tạo các cấu hình cần thiết cho hành động này.

ClusterControl Bật tính năng ghi nhật ký nhị phân

Để biến một hoặc nhiều nút Galera thành máy chủ chính (theo nghĩa là tạo các binlog), bạn có thể chuyển đến Tác vụ nút và chọn Bật ghi nhật ký nhị phân.

Sao lưu ClusterControl

Các bản sao lưu có thể được định cấu hình bằng XtraBackup (đầy đủ hoặc tăng dần) và mysqldump, đồng thời bạn có các tùy chọn khác như tải bản sao lưu lên đám mây, mã hóa, nén, lên lịch và hơn thế nữa.

Khôi phục ClusterControl

Để khôi phục bản sao lưu, hãy chuyển đến tab Sao lưu và chọn tùy chọn Khôi phục, sau đó bạn chọn máy chủ bạn muốn khôi phục.

ClusterControl Change Replication Master

Nếu bạn có một nô lệ và bạn muốn thay đổi cái chính hoặc xây dựng lại bản sao, bạn có thể đi tới Node Actions và chọn tùy chọn.

Kết luận

Như chúng ta có thể thấy, chúng ta có một số cách để đạt được mục tiêu của mình, một số cách phức tạp hơn, một số cách khác thân thiện với người dùng hơn, nhưng với bất kỳ cách nào trong số chúng, bạn có thể tạo lại một cụm từ một nô lệ không đồng bộ. Xtrabackup sẽ khôi phục nhanh hơn đối với khối lượng dữ liệu lớn hơn. Để đề phòng lỗi của toán tử (ví dụ:BẢNG DROP bị lỗi), bạn cũng có thể sử dụng trình phụ bị trễ để bạn hy vọng có thời gian để ngăn tuyên bố lan truyền.

Chúng tôi hy vọng rằng thông tin này hữu ích và bạn không bao giờ phải sử dụng nó trong sản xuất;)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để điền vào các lỗ hổng trong các trường tự động tăng dần?

  2. Làm cách nào để tìm dữ liệu không tồn tại từ một Bảng khác bằng cách tham gia?

  3. Cách tìm các giá trị không phải dạng số trong một cột trong MySQL

  4. Hàm MySQL COS () - Trả về Cosine của một số trong MySQL

  5. Tự động tăng sau khi xóa trong MySQL