ZFS: Làm thế nào để bạn khôi phục đúng số lượng bản sao sau khi mất ổ đĩa?


12

Với zfs, nếu bạn có copies=2và sau đó bạn mất một ổ đĩa chứa một số bản sao đó, làm thế nào để bạn nói với hệ thống rằng nó sẽ tạo một bản sao mới của các khối dữ liệu cho các tệp bị ảnh hưởng? Hoặc zfs chỉ bắt đầu thêm các khối dữ liệu cho các bản sao bổ sung ngay khi phát hiện ra các khối dữ liệu xấu?

Sẽ chà làm điều này?

(v0.6.0.56-rc8, ZFS pool phiên bản 28, hệ thống tập tin ZFS phiên bản 5, Ubuntu 11.10)

Câu trả lời:


10

"Bản sao = 2" (hoặc 3) được thiết kế nhiều hơn để sử dụng với các nhóm không có dự phòng (đĩa đơn hoặc sọc). Mục tiêu là để có thể phục hồi tham nhũng đĩa nhỏ, không phải là lỗi toàn bộ thiết bị. Trong trường hợp thứ hai, hồ bơi là không thể đếm được vì vậy không thể phục hồi khối ditto.

Nếu bạn có sự dư thừa (phản chiếu / raidz / raidz2 / raidz3), các khối ditto không khác biệt so với các khối khác và việc cọ rửa / phục hồi sẽ tái tạo chúng.


Điều này mâu thuẫn trực tiếp với những gì @Redmumba nói - và Redmumba cung cấp các liên kết đến mã. Bạn có thể trích dẫn một số nguồn cho những gì bạn đang nói? Cụ thể, tôi rất muốn thấy những trích dẫn hay về lý do tại sao bạn nghĩ rằng các bản sao = N sẽ không đối phó với sự cố toàn bộ thiết bị - điều đó không phù hợp với bất cứ điều gì tôi đã đọc.
James Moore

1
@James Moore Sau khi toàn bộ thiết bị bị lỗi, sẽ không có khối ditto nào được ghi trên đĩa đó. Không có sự dư thừa ở cấp độ pool nên không có cách nào để thay thế đĩa bị lỗi bằng một cái mới. Phương pháp duy nhất để phục hồi đúng tình huống đó là sao lưu toàn bộ hồ bơi, tạo lại nó bằng các thiết bị lành mạnh và khôi phục từ bản sao lưu trong khi đảm bảo không xảy ra khởi động lại không chủ ý trước khi thực hiện sao lưu đầu tiên. Nếu không, pool có thể không được nhập và dữ liệu của nó bị mất. Đây là một gánh nặng khá lớn so với các nhóm dự phòng trong đó việc khôi phục một đĩa xấu được thực hiện trực tuyến và sống sót khi khởi động lại.
jlliagre

1
Dưới đây là một tài liệu tham khảo: docs.oracle.com/cd/E19082-01/817-2271/gbbvf/. For a device to be replaced, the pool must be in the ONLINE state. The device must be part of a redundant configuration, or it must be healthy (in the ONLINE state). Tôi giả sử bản sao = 2 hoặc 3 không được coi là cấu hình dự phòng.
jlliagre

1
Tuy nhiên, một điều cần lưu ý là nếu ban đầu bạn có copies=1và bạn đã nâng cấp nó lên copies=2, thì có lẽ bạn sẽ muốn khôi phục / khôi phục lại sau đó - sẽ tạo ra các trường hợp này. Nhưng @jilliagre là chính xác: các khối ditto không cấu thành một cấu hình dự phòng. KHÔNG đảm bảo rằng các khối được đặt trên một thiết bị khác, ngay cả khi bạn có nhiều thiết bị trong một nhóm.
Andrew M.

1
tính năng "copy = N trong đó N> 1" không nhằm mục đích thêm dự phòng. nó được dự định để giải quyết tham nhũng dữ liệu. tất cả mọi thứ được viết cho zfs đều được kiểm tra hoặc băm. khi đọc lại, tổng kiểm tra / hàm băm được xác minh. nếu N = 1, thì lỗi xác minh tổng kiểm tra / băm sẽ dẫn đến lỗi quay lại ứng dụng. nếu N> 1, thì một trong những bản sao khác có thể được tư vấn và sử dụng để sửa chữa tất cả các bản sao khác.
longneck

9

Tôi thấy câu hỏi này thực sự hấp dẫn và sau khi dành một giờ để rót tài liệu, tôi đã đi sâu vào mã. Đây là những gì tôi tìm thấy.

Đầu tiên, một số thuật ngữ. Các khối Ditto (là những bản sao này, trái ngược với gương) được tạo tự động trên một bản ghi nhưng có thể hoặc không thể ở cùng một thiết bị ảo (vdev) như bản sao gốc. Mặt khác, các khối được nhân đôi luôn được phản chiếu lên một thiết bị ảo khác.

Tuy nhiên, mã đề cập đến cả hai loại khối là trẻ em. Bạn sẽ thấy ở đây các khối ditto chỉ là trẻ em với io_vd == NULL(đây là trong chức năng ghi). Đối với khối được nhân đôi, io_vdsẽ được đặt thành thiết bị ảo tương ứng (ví dụ: đĩa thứ hai của bạn).

Với ý nghĩ đó, khi đến phần đọc , nó đối xử với tất cả trẻ em (có thể là gương hoặc khối ditto) là không an toàn nếu nó không chứa dự kiến good_copiesviết lại chúng khi cần . Vì vậy, nó có vẻ như câu trả lời cho câu hỏi của bạn là - vâng, nó sẽ viết lại chúng khi bạn có ít nhất một bản sao tốt và một trong những điều sau đây:

  • Lỗi không mong muốn khi bạn cố đọc dữ liệu,
  • Bạn đang kiên cường, hoặc
  • Bạn đang chà.

Phù! Có lẽ ai đó có thể chỉ ra sai sót, nhưng tôi rất thích tìm hiểu về ZFS thông qua bài tập nhỏ này và tôi hy vọng điều này sẽ giúp!


1
Vấn đề nằm ở câu trả lời của @ jlliagre - pool đã chết nếu mất bất kỳ thiết bị nào. Thực tế là hồ bơi vẫn có đủ khối ditto dường như không quan trọng. Có cách nào khác không?
James Moore

4
@JamesMoore bạn có thể buộc mảng trực tuyến ở trạng thái xuống cấp nếu bạn có 1MB thiết bị đầu tiên bị lỗi. Có lẽ bạn chỉ cần siêu dữ liệu từ thiết bị thất bại. Tôi đã thử nghiệm điều này với một zpool kiểu jbod và nó hoạt động: khôi phục nhãn bị hỏng raidz . Tôi đã thực hiện một md5sum trước và sau khi tôi phá vỡ zpool và chỉ có hệ thống tập tin copy = 1 bị hỏng sau khi nhập. Các bản sao = 2 và bản sao = 3 hệ thống tập tin khớp hoàn hảo.
Jodie C

2

@jlliagre và những người khác dường như nghĩ rằng toàn bộ zpool chết nếu một trong các đĩa (vdevs) chết nhưng pool không dư thừa (mirror / raidz). Đây không phải là sự thật; một nhóm đa đĩa sẽ luôn tồn tại trong một lỗi đĩa hoàn chỉnh ngay cả khi nó không phải là gương hoặc raidz.

ZFS Metadata luôn được sao chép ít nhất 2 lần, do đó, toàn bộ lỗi của một đĩa hoàn chỉnh (hoặc bất kỳ phần nào của nó) sẽ không làm hỏng hệ thống tệp. Hơn nữa, nhiều tệp, đặc biệt là các tệp nhỏ hơn, sẽ không được trải rộng trên tất cả các đĩa và do đó sẽ không nhất thiết bị lỗi do lỗi đĩa. OP đang hỏi về trường hợp nhóm đa đĩa sử dụng các khối ditto (bản sao dữ liệu người dùng> 1). Ở đây, một lỗi đĩa hoàn chỉnh sẽ không bao giờ dẫn đến mất dữ liệu.ZFS sẽ luôn cố gắng đặt các khối ditto cách xa khối ban đầu và đối với các nhóm có nhiều vdev, điều này luôn có nghĩa trên một vdev khác (một ngoại lệ có thể là một vdev> 50% của nhóm, điều này rất bất thường) . Dữ liệu meta hệ thống tệp cũng luôn được sao chép gấp 1 hoặc 2 lần so với mức ditto , do đó nó sẽ luôn tồn tại khi bị hỏng đĩa. Hơn nữa, nếu bạn có một nhóm nhiều hơn ba đĩa, bạn sẽ có thể mất tới một nửa trong số chúng mà không mất dữ liệu; ZFS lưu trữ các khối ditto trên đĩa tiếp theo miễn là bạn không bao giờ mất hai đĩa liền kề, bạn sẽ không bao giờ bị mất dữ liệu. (ba lỗi đĩa phụ cho ditto = 2).

Khi có đủ bản sao dữ liệu để truy cập tệp (cho dù các bản sao đó là từ các khối ditto, nhân bản hoặc raidz), thì tất cả các bản sao dữ liệu bị thiếu sẽ được sửa chữa khi tệp được truy cập. Đây là mục đích của chà; đọc tất cả dữ liệu và sửa bất kỳ lỗi nào bằng cách sử dụng các bản sao dự phòng. Vì vậy, để trả lời trực tiếp câu hỏi OP, bạn chỉ cần thực hiện chà sau khi thay thế ổ đĩa bị lỗi và tất cả các bản sao sẽ được khôi phục.

Như mọi khi, bạn có thể dễ dàng thử nghiệm các khái niệm bằng cách tạo các nhóm có vdevs để lưu trữ sao lưu chỉ là các tệp thưa thớt thông thường. Bằng cách xóa hoặc làm hỏng các tệp vdev, bạn có thể mô phỏng bất kỳ loại lỗi nào và có thể xác minh tính toàn vẹn của nhóm, hệ thống tệp và dữ liệu trên đường đi.

EDIT: sau khi thử nghiệm, có vẻ như zfs sẽ thất bại nhóm nếu một đĩa bị lỗi trong nhóm không dự phòng nhiều đĩa có bản sao> = 2. Tham nhũng dữ liệu phụ huynh trên một hoặc nhiều đĩa nên vẫn có thể sống sót và cần được khắc phục bằng cách chà.


Điều đáng sợ về những loại thử nghiệm đó là chúng rất tuyệt khi nói với tôi rằng thiết lập sẽ thất bại ngay lập tức hoặc ít nhất là nhanh chóng. Chúng không tuyệt vời lắm khi nói với tôi rằng thiết lập đôi khi sẽ thất bại. Trong mọi trường hợp, không rõ làm thế nào bạn mang lại một hồ bơi bị lỗi; Tôi đã thử thiết lập một nhóm như thế này với ba tệp thưa thớt và loại bỏ một trong các tệp thưa thớt dường như gây tử vong cho toàn bộ nhóm. thay thế zpool sẽ không thay thế tệp thất bại, zpool chà ở mức 5% (và đây là những nhóm rất nhỏ) và trang lỗi tại illumos.org/msg/ZFS-8000-5E không lạc quan.
James Moore

Tôi đã có một kết quả tương tự với các thử nghiệm của tôi, chỉ được thực hiện sau câu trả lời của tôi. Tôi thường chỉ sử dụng raidz và đã trả lời dựa trên thông tin từ những gì tôi tin là nguồn đáng tin cậy (blog oracle). Tôi không còn tin rằng nhóm loại JBOD nhiều đĩa, với các bản sao> 1 có thể tồn tại khi bị hỏng đĩa.
Aaron B
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.