Tôi có một hồ bơi lớn trên một hệ thống. Hệ thống là một nút lưu trữ trong một cụm Hadoop, do đó, một đường sọc cũng không sao vì nếu chúng ta mất vùng cục bộ, chúng ta có thể xây dựng lại dữ liệu ở cấp độ cụm.

Đĩa đang bị hỏng: tôi có thể yêu cầu ZFS thử và di chuyển các khối lưu trữ khỏi thiết bị để tôi có thể xóa nó hay tôi cần xóa toàn bộ nhóm và xây dựng lại nó? Lý tưởng nhất là tôi có thể kéo đĩa ra và sau đó thêm đĩa mới khi tôi hoán đổi phần cứng bị lỗi.

Tôi giả sử câu trả lời là "không" bởi vì RAID truyền thống hoạt động ở mức khối, nhưng có thể nhóm lưu trữ ZFS đủ thông minh để ít nhất cố gắng di dời dữ liệu tệp.

> sudo zpool list
NAME   SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
tank  19.9T  8.09T  11.8T        -         -    15%    40%  1.00x  DEGRADED  -
> sudo zpool status
  pool: tank
 state: DEGRADED
status: One or more devices has experienced an error resulting in data
        corruption.  Applications may be affected.
action: Restore the file in question if possible.  Otherwise restore the
        entire pool from backup.
   see: http://zfsonlinux.org/msg/ZFS-8000-8A
  scan: scrub repaired 0B in 0 days 02:45:39 with 0 errors on Sun Jan  9 03:09:41 2022
config:

        NAME                               STATE     READ WRITE CKSUM
        tank                               DEGRADED     0     0     0
          ata-ST2000DM001-1ER164_Z4Z0xxxx  ONLINE       0     0     0
          ata-ST2000DM001-1ER164_Z4Z0xxxx  DEGRADED    96     0     0  too many errors
          scsi-35000cca22dc7xxxx           ONLINE       0     0     0
          scsi-35000cca22dc7xxxx           ONLINE       0     0     0
          scsi-35000cca22dc8xxxx           ONLINE       0     0     0
          scsi-35000cca22dc8xxxx           ONLINE       0     0     0
          scsi-35000cca22dc7xxxx           ONLINE       0     0     0
          scsi-35000cca22dc7xxxx           ONLINE       0     0     0
          scsi-35000cca22dc7xxxx           ONLINE       0     0     0
          ata-ST2000DM001-1ER164_Z4Z3xxxx  ONLINE       0     0     0
          ata-ST2000NM0011_Z1P3xxxx        ONLINE       0     0     0

Tôi dự đoán câu trả lời là khi tôi sẵn sàng thay thế đĩa bị lỗi, trước tiên tôi sẽ muốn phá hủy nhóm, thay thế đĩa và xây dựng một nhóm mới.

answer

Trước hết, ZFS cần tất cả các vdev cấp cao nhất phải hoạt động để pool hoạt động. Nếu một vdev ngoại tuyến, bạn sẽ mất quyền truy cập vào tất cả dữ liệu trong nhóm. Bạn đang sử dụng các đĩa riêng lẻ làm vdev, vì vậy nếu đĩa đó bị lỗi (trái ngược với trạng thái hiện tại là "nhiều lỗi đọc"), bạn sẽ phải tạo lại toàn bộ nhóm từ đầu.

Nếu bạn đang sử dụng Solaris hoặc nếu bạn đang sử dụng OpenZFS 0.8 trở lên, bạn sẽ có thể chạy:

zpool remove tank ata-ST2000DM001-1ER164_Z4Z0xxxx

Điều này có thể không hoạt động! Và nếu có, nó có thể làm giảm hiệu suất vĩnh viễn cho hồ bơi.

Việc xóa vdev yêu cầu phải có đủ dung lượng trên các đĩa còn lại cho dữ liệu bị dịch chuyển. Có vẻ như bạn có thể có đủ chỗ trong trường hợp này, nhưng tôi đang đề cập đến vấn đề một cách trọn vẹn.

Trên OpenZFS, ít nhất, có một số hạn chế về thời điểm bạn có thể xóa vdev. Bạn chỉ có thể xóa vdev nếu nhóm của bạn chỉ bao gồm vdev đĩa đơn và / hoặc vdev được nhân đôi. Nhóm của bạn đủ điều kiện, bởi vì bạn đang sử dụng riêng vdev đĩa đơn. Nhưng nếu bạn có bất kỳ vdev đột kích, draid hoặc phân bổ đặc biệt nào trên OpenZFS, bạn sẽ không thể thực hiện điều này.

Một lưu ý cuối cùng là việc xóa vdev sẽ bị phạt hiệu suất vĩnh viễn trong OpenZFS. OpenZFS sẽ ghi lại một bảng nội bộ cho tất cả các khối trước đó đã có trên đĩa bị loại bỏ. Miễn là các khối đó tồn tại trong nhóm kể từ thời điểm đó, tất cả các quyền truy cập vào chúng sẽ yêu cầu tra cứu gián tiếp thông qua bảng ánh xạ lại. Điều này có thể làm chậm truy cập ngẫu nhiên một cách đáng kể. Tôi không biết đủ về nội bộ của Solaris ZFS để có thể nói liệu nó có hoạt động tương tự hay không.

Và, tất nhiên, ZFS sẽ cần đọc tất cả dữ liệu từ đĩa bị lỗi để xóa nó. Hoàn toàn có khả năng nó sẽ gặp đủ lỗi trong quá trình đó mà đơn giản là nó sẽ làm hỏng đĩa. Nếu điều đó xảy ra, như đã thảo luận trước đó, toàn bộ nhóm sẽ chuyển sang chế độ ngoại tuyến và có thể sẽ không thể khôi phục được.

Nếu bạn có một khe trống để thêm đĩa, tốt hơn hết bạn nên đặt một đĩa dự phòng vào và sử dụng zpool replaceđể thay thế đĩa mới cho đĩa bị lỗi. Điều đó sẽ phải chịu cùng một tải đọc để sao chép dữ liệu (và sẽ chịu rủi ro tương tự do đĩa đơn bị lỗi trong quá trình này), nhưng nếu thành công, bạn sẽ không cần phải lo lắng về những nhược điểm tiềm ẩn đi kèm với việc xóa vdev.

Nói chung, ZFS có thể rất giòn khi được sử dụng như bạn đang sử dụng — với vdev đĩa đơn không dư thừa. Có một trò đùa cũ rằng số 0 trong RAID0 là mức độ bạn phải quan tâm đến dữ liệu của mình. Nhóm ZFS của vdev đĩa đơn về cơ bản giống như RAID0 từ quan điểm bảo mật dữ liệu. Việc hỏng bất kỳ đĩa đơn nào cũng có thể khiến bạn mất tất cả dữ liệu của mình. Ngay cả khi bạn có đủ khả năng để thay thế dữ liệu, hãy đảm bảo rằng bạn đang tính đến thời gian cần thiết để thực hiện việc thay thế đó. Nếu bạn có thể chi trả một khoản tiền phạt hiệu suất được đánh đổi để bảo mật dữ liệu, hãy cân nhắc việc đưa các đĩa của các nhóm trong tương lai của bạn vào vdev đột kích. Nếu bạn có đủ khả năng để đánh đổi dung lượng ổ đĩa có thể sử dụng để bảo mật dữ liệu (và có thể tăng hiệu suất đọc), hãy cân nhắc việc đưa các đĩa của nhóm trong tương lai của bạn vào các vdev gương.