Việc gián đoạn sản xuất gần như được đảm bảo sẽ xảy ra vào một thời điểm nào đó. Chúng tôi biết điều đó nên chúng tôi lập kế hoạch sao lưu, tạo cơ sở dữ liệu dự phòng khôi phục, chuyển đổi các phiên bản đơn lẻ thành các cụm.
Thừa nhận sự cần thiết của một kịch bản khôi phục thích hợp, chúng tôi phải phân tích tiến trình thảm họa có thể xảy ra và các kịch bản lỗi và thực hiện các bước để đưa cơ sở dữ liệu của bạn lên. Việc thực hiện cúp điện theo kế hoạch có thể giúp chuẩn bị, chẩn đoán và phục hồi từ sự cố tiếp theo. Để giảm thiểu tác động của thời gian ngừng hoạt động, các tổ chức cần có một kế hoạch phục hồi thích hợp, bao gồm tất cả các yếu tố cần thiết để đưa dịch vụ vào cuộc sống.
Quản lý sao lưu không nhẹ nhàng như chỉ lên lịch công việc sao lưu. Có nhiều yếu tố cần xem xét, chẳng hạn như lưu giữ, lưu trữ, xác minh và liệu các bản sao lưu bạn đang thực hiện là vật lý hay logic và điều gì dễ bỏ qua bảo mật.
Nhiều tổ chức thay đổi cách tiếp cận sao lưu, cố gắng có sự kết hợp giữa các bản sao lưu hình ảnh máy chủ (ảnh chụp nhanh), các bản sao lưu logic và vật lý được lưu trữ ở nhiều vị trí. Đó là để tránh mọi thảm họa cục bộ hoặc khu vực có thể xóa sạch cơ sở dữ liệu và bản sao lưu của chúng tôi được lưu trữ trong cùng một trung tâm dữ liệu.
Chúng tôi muốn bảo mật nó. Dữ liệu và các bản sao lưu phải được mã hóa. Nhưng có rất nhiều tác động khi cả hai lựa chọn được đưa ra. Trong bài viết này, chúng ta sẽ xem xét các quy trình sao lưu khi chúng ta xử lý cơ sở dữ liệu được mã hóa.
Encryption-at-Rest for Percona Server cho MySQL 8.0
Bắt đầu từ MySQL 5.7.11, phiên bản cộng đồng của MySQL bắt đầu hỗ trợ mã hóa vùng bảng InnoDB. Nó được gọi là Mã hóa không gian bảng trong suốt hoặc được gọi là Mã hóa lúc còn lại.
Sự khác biệt chính so với phiên bản doanh nghiệp là cách lưu trữ các khóa - các khóa không được đặt trong một kho bảo mật, điều này cần thiết để tuân thủ quy định. Điều tương tự cũng áp dụng cho Máy chủ Percona, bắt đầu từ phiên bản 5.7.11, có thể mã hóa không gian bảng InnoDB. Trong Percona Server 8.0, hỗ trợ mã hóa nhật ký nhị phân đã được mở rộng rất nhiều. Đã thêm phiên bản 8.0
(Theo tài liệu phát hành Percona 8.0):
- Mã hóa tệp tạm thời
- Mã hóa vùng bảng hoàn tác InnoDB
- Mã hóa vùng bảng hệ thống InnoDB (Mã hóa vùng bảng hệ thống InnoDB)
- default_table_encryption =TẮT / BẬT (Mã hóa vùng bảng chung)
- table_encryption_privilege_check =TẮT / BẬT (Xác minh Cài đặt Mã hóa)
- InnoDB làm lại mã hóa nhật ký (chỉ dành cho mã hóa khóa chính) (Mã hóa nhật ký làm lại)
- Mã hóa tệp hợp nhất InnoDB (Xác minh cài đặt mã hóa)
- Mã hóa bộ đệm ghi kép song song Percona (Mã hóa không gian bảng InnoDB)
Đối với những người quan tâm đến việc di chuyển từ phiên bản MySQL Enterprise sang Percona - Cũng có thể tích hợp với máy chủ Hashicorp Vault thông qua plugin keyring_vault, phù hợp với các tính năng có sẵn trong phiên bản Oracle’s MySQL Enterprise.
Mã hóa dữ liệu ở trạng thái nghỉ yêu cầu phải có plugin khóa. Có hai tùy chọn ở đây:
- keyring_file - một tệp phẳng có khóa mã hóa
- Plugin Keyring Vault - một dịch vụ
Cách bật mã hóa vùng bảng
Để bật mã hóa, hãy khởi động cơ sở dữ liệu của bạn với tùy chọn --early-plugin-load:
bằng tay:
$ mysqld --early-plugin-load="keyring_file=keyring_file.so"
hoặc bằng cách sửa đổi tệp cấu hình:
[mysqld]
early-plugin-load=keyring_file.so
Khởi động Percona Server 8.0, hai loại không gian bảng có thể được mã hóa. Không gian bảng chung và không gian bảng hệ thống. Không gian bảng Sys được kiểm soát thông qua tham số innodb_sys_tablespace_encrypt. Theo mặc định, không gian bảng sys không được mã hóa và nếu bạn đã có thì không thể chuyển nó sang trạng thái mã hóa, một phiên bản mới phải được tạo (bắt đầu một phiên bản với tùy chọn --bootstrap).
Không gian bảng chung hỗ trợ mã hóa tất cả các bảng trong không gian bảng hoặc không có bảng nào. Không thể chạy mã hóa ở chế độ hỗn hợp. Để tạo không gian bảng ate bằng mã hóa, hãy sử dụng cờ ENCRYPTION ='Y / N'.
Ví dụ:
mysql> CREATE TABLESPACE severalnines ADD DATAFILE 'severalnines.ibd' ENCRYPTION='Y';
Sao lưu Cơ sở dữ liệu được Mã hóa
Khi bạn thêm không gian bảng được mã hóa, bạn cần đưa tệp khóa vào lệnh xtrabackup. Để làm điều đó, bạn phải chỉ định đường dẫn đến tệp keyring làm giá trị của tùy chọn --keyring-file-data.
$ xtrabackup --backup --target-dir=/u01/mysql/data/backup/ --user=root --keyring-file-data=/u01/secure_location/keyring_file
Đảm bảo lưu trữ tệp keyring ở một vị trí an toàn. Ngoài ra, hãy đảm bảo luôn có bản sao lưu của tệp. Xtrabackup sẽ không sao chép tệp keyring trong thư mục sao lưu. Để chuẩn bị sao lưu, bạn cần tự tạo bản sao của tệp keyring.
Chuẩn bị sao lưu
Sau khi có tệp sao lưu, chúng ta nên chuẩn bị cho quá trình khôi phục. Tại đây, bạn cũng cần chỉ định keyring-file-data.
$ xtrabackup --prepare --target-dir=/u01/mysql/data/backup/ --keyring-file-data=/u01/secure_location/keyring_file
Bản sao lưu hiện đã được chuẩn bị và có thể được khôi phục bằng tùy chọn --copy-back. Trong trường hợp chuỗi khóa đã được xoay, bạn sẽ cần khôi phục chuỗi khóa (được sử dụng để lấy và chuẩn bị sao lưu).
Để chuẩn bị sao lưu xtrabackup, chúng ta cần truy cập vào keyring. Xtrabackup không nói chuyện trực tiếp với máy chủ MySQL và không đọc tệp cấu hình my.cnf mặc định trong quá trình chuẩn bị, hãy chỉ định cài đặt khóa thông qua dòng lệnh:
$ xtrabackup --prepare --target-dir=/data/backup --keyring-vault-config=/etc/vault.cnf
Bản sao lưu hiện đã được chuẩn bị và có thể được khôi phục bằng tùy chọn --copy-back:
$ xtrabackup --copy-back --target-dir=/u01/backup/ --datadir=/u01/mysql/data/
Thực hiện Sao lưu Tăng dần
Quá trình lấy các bản sao lưu gia tăng với mã hóa vùng bảng InnoDB tương tự như lấy các bản sao lưu gia tăng tương tự với một vùng bảng không được mã hóa.
Để tạo một bản sao lưu gia tăng, hãy bắt đầu bằng một bản sao lưu đầy đủ. Hệ nhị phân xtrabackup ghi một tệp có tên xtrabackup_checkpoints vào thư mục đích của bản sao lưu. Tệp này chứa một dòng hiển thị to_lsn, là LSN của cơ sở dữ liệu ở cuối bản sao lưu.
Trước tiên, bạn cần tạo một bản sao lưu đầy đủ bằng lệnh sau:
$ xtrabackup --backup --target-dir=/data/backups/base --keyring-file-data=/var/lib/mysql-keyring/keyring
Bây giờ bạn đã có một bản sao lưu đầy đủ, bạn có thể tạo một bản sao lưu gia tăng dựa trên bản sao lưu đó. Sử dụng một lệnh như sau:
$ xtrabackup --backup --target-dir=/data/backups/inc1 \
--incremental-basedir=/data/backups/base \
--keyring-file-data=/var/lib/mysql-keyring/keyring
Thư mục / data / backups / inc1 / bây giờ phải chứa các tệp delta, chẳng hạn như ibdata1.delta và test / table1.ibd.delta.
Ý nghĩa phải được hiển nhiên. Giờ đây, có thể sử dụng thư mục này làm cơ sở cho một bản sao lưu gia tăng khác:
$ xtrabackup --backup --target-dir=/data/backups/inc2 \
--incremental-basedir=/data/backups/inc1 \
--keyring-file-data=/var/lib/mysql-keyring/keyring
Chuẩn bị Sao lưu Tăng dần
Cho đến nay quá trình sao lưu cơ sở dữ liệu tương tự như sao lưu thông thường, ngoại trừ cờ mà chúng tôi đã chỉ định vị trí của tệp keyring.
Rất tiếc, bước --prepare để sao lưu gia tăng không giống với bước sao lưu thông thường.
Trong sao lưu thông thường, hai loại hoạt động được thực hiện để làm cho cơ sở dữ liệu nhất quán:các giao dịch đã cam kết được phát lại từ tệp nhật ký so với tệp dữ liệu và các giao dịch chưa cam kết được khôi phục lại. Bạn phải bỏ qua việc khôi phục các giao dịch chưa cam kết khi chuẩn bị sao lưu, vì các giao dịch chưa được cam kết tại thời điểm sao lưu của bạn có thể đang diễn ra và có khả năng chúng sẽ được cam kết trong lần sao lưu gia tăng tiếp theo. Bạn nên sử dụng tùy chọn --apply-log-only để ngăn giai đoạn khôi phục.
Nếu bạn không sử dụng tùy chọn --apply-log-only để ngăn giai đoạn khôi phục, thì các bản sao lưu gia tăng của bạn sẽ vô dụng. Sau khi các giao dịch đã được khôi phục, không thể áp dụng các bản sao lưu gia tăng hơn nữa.
Bắt đầu với bản sao lưu đầy đủ bạn đã tạo, bạn có thể chuẩn bị và sau đó áp dụng các khác biệt gia tăng cho nó. Nhớ lại rằng bạn có các bản sao lưu sau:
/data/backups/base
/data/backups/inc1
/data/backups/inc2
Để chuẩn bị sao lưu cơ sở, bạn cần chạy --prepare như bình thường, nhưng ngăn giai đoạn quay lại:
$ xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base --keyring-file-data=/var/lib/mysql-keyring/keyring
Để áp dụng bản sao lưu gia tăng đầu tiên cho bản sao lưu đầy đủ, bạn nên sử dụng lệnh sau:
$ xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base \
--incremental-dir=/data/backups/inc1 \
--keyring-file-data=/var/lib/mysql-keyring/keyring
nếu chuỗi khóa đã được xoay giữa bản sao lưu cơ bản và gia tăng, bạn sẽ cần sử dụng chuỗi khóa được sử dụng khi sao lưu gia tăng đầu tiên đã được thực hiện.
Chuẩn bị bản sao lưu gia tăng thứ hai là một quá trình tương tự
$ xtrabackup --prepare --target-dir=/data/backups/base \
--incremental-dir=/data/backups/inc2 \
--keyring-file-data=/var/lib/mysql-keyring/keyring
Lưu ý; --apply-log-only nên được sử dụng khi hợp nhất tất cả các phần gia tăng ngoại trừ phần cuối cùng. Đó là lý do tại sao dòng trước đó không chứa tùy chọn - chỉ đăng nhập ứng dụng. Ngay cả khi --apply-log-only được sử dụng ở bước cuối cùng, việc sao lưu sẽ vẫn nhất quán nhưng trong trường hợp đó, máy chủ sẽ thực hiện giai đoạn khôi phục.
Bước cuối cùng là khôi phục nó bằng --copy-back lựa chọn. Trong trường hợp khóa khóa đã được xoay, bạn sẽ cần khôi phục khóa khóa đã được sử dụng để lấy và chuẩn bị sao lưu.
Trong khi phương pháp khôi phục được mô tả hoạt động, nó yêu cầu quyền truy cập vào cùng một khóa mà máy chủ đang sử dụng. Có thể không thực hiện được nếu quá trình sao lưu được chuẩn bị trên một máy chủ khác hoặc muộn hơn nhiều, khi các khóa trong keyring bị xóa, hoặc trong trường hợp trục trặc, khi máy chủ keyring vault hoàn toàn không khả dụng.
Tùy chọn --transition-key =
Tạo Bản sao lưu bằng Cụm mật khẩu
Ví dụ sau minh họa cách tạo bản sao lưu trong trường hợp này:
$ xtrabackup --backup --user=root -p --target-dir=/data/backup \
--transition-key=MySecetKey
Khôi phục Bản sao lưu bằng Khóa đã tạo
Khi khôi phục bản sao lưu, bạn sẽ cần tạo khóa chính mới. Đây là ví dụ cho keyring_file:
$ xtrabackup --copy-back --target-dir=/data/backup --datadir=/data/mysql \
--transition-key=MySecetKey --generate-new-master-key \
--keyring-file-data=/var/lib/mysql-keyring/keyring
Trong trường hợp keyring_vault, nó sẽ giống như sau:
$ xtrabackup --copy-back --target-dir=/data/backup --datadir=/data/mysql \
--transition-key=MySecetKey --generate-new-master-key \
--keyring-vault-config=/etc/vault.cnf