Lưu trữ và sao lưu 10 triệu tệp trên Linux


25

Tôi điều hành một trang web trong đó khoảng 10 triệu tệp (bìa sách) được lưu trữ ở 3 cấp thư mục con, trong phạm vi [0-f]:

0/0/0/
0/0/1/
...
f/f/f/

Điều này dẫn đến khoảng 2400 tệp trên mỗi thư mục, rất nhanh khi chúng ta cần truy xuất một tệp. Đây là một thực tế được đề xuất bởi nhiều câu hỏi .

Tuy nhiên, khi tôi cần sao lưu các tệp này, phải mất nhiều ngày chỉ để duyệt các thư mục 4k chứa các tệp 10m.

Vì vậy, tôi tự hỏi liệu tôi có thể lưu trữ các tệp này trong một thùng chứa (hoặc trong các thùng chứa 4k), mỗi tệp sẽ hoạt động chính xác như một hệ thống tệp (một loại thùng chứa ext3 / 4 được gắn không?). Tôi đoán điều này sẽ gần như hiệu quả như truy cập trực tiếp một tệp trong hệ thống tệp và điều này sẽ có lợi thế lớn là được sao chép sang máy chủ khác rất hiệu quả.

Bất kỳ đề nghị về làm thế nào để làm điều này tốt nhất? Hoặc bất kỳ sự thay thế khả thi nào (noQuery, ...)?


Bạn đang sử dụng hệ thống tập tin nào?
cmcginty

NetApp được coi là một lựa chọn nếu bạn có thể trả giá
Ian Ringrose

Tôi đang sử dụng ext4 theo CentOS 5.6
Benjamin

1
Tò mò tại sao phải mất "nhiều ngày chỉ để duyệt các thư mục 4k chứa các tệp 10m", có vẻ như quá chậm. Giả sử 150 byte cho mỗi tên đường dẫn, tên tệp 10m tạo ra 1,5 GB dữ liệu, do đó, nó có thể là bộ nhớ / CPU có sẵn (bao gồm cả việc sắp xếp kết quả). Ngoài ra, hãy kiểm tra xem việc bật / tắt dir_index có giúp không: lonesysadmin.net/2007/08/17/ với các mẹo khác nhau tại serverfault.com/questions/183821/
Lỗi

Lưu ý 5 năm sau: Tôi đã di chuyển mọi thứ sang Amazon S3, điều này hoàn toàn phù hợp để lưu trữ một lượng lớn tệp như vậy. Thêm vào đó, tôi không phải chia các tệp thành 3 cấp thư mục con nữa, vì đối với S3, nó không có gì khác biệt (một đường dẫn là một đường dẫn, cho dù nó có chứa dấu gạch chéo hay không tạo ra sự khác biệt). Và tôi có thể ngủ ngon hơn, biết rằng dữ liệu của tôi được sao chép an toàn trên một số địa điểm.
Benjamin

Câu trả lời:


11

Tùy chọn để nhanh chóng truy cập và sao lưu hàng triệu tệp

Vay từ những người có vấn đề tương tự

Điều này nghe có vẻ giống như một loại vấn đề dễ dàng hơn phải đối mặt với các máy chủ tin tức USENET và các proxy web lưu trữ bộ đệm: hàng trăm triệu tệp nhỏ được truy cập ngẫu nhiên. Bạn có thể muốn nhận một gợi ý từ họ (ngoại trừ họ thường không phải thực hiện sao lưu).

http://devel.squid-cache.org/coss/coss-notes.txt

http://citeseer.ist.psu.edu/viewdoc/doad;jsessionid=4074B50D266E72C69D6D35FEDCBBA83D?doi=10.1.1.31.4000&rep=rep1&type=pdf

Rõ ràng tính chất chu kỳ của hệ thống tệp tin tuần hoàn không liên quan đến bạn, nhưng khái niệm cấp thấp hơn về việc có nhiều tệp / thiết bị đĩa với hình ảnh đóng gói và chỉ mục nhanh từ thông tin người dùng cung cấp để tra cứu thông tin vị trí là rất phù hợp.

Hệ thống tập tin chuyên dụng

Tất nhiên, đây chỉ là những khái niệm tương tự như những gì mọi người đang nói về việc tạo ra một hệ thống tệp trong một tệp và gắn nó qua loopback ngoại trừ bạn có thể viết mã hệ thống tệp của riêng bạn. Tất nhiên, vì bạn nói rằng hệ thống của bạn đã được đọc - chủ yếu, bạn thực sự có thể dành một phân vùng đĩa (hoặc phân vùng lvm để linh hoạt trong việc định cỡ) cho mục đích này. Khi bạn muốn sao lưu, gắn kết hệ thống tập tin chỉ đọc và sau đó tạo một bản sao của các bit phân vùng.

LVM

Tôi đã đề cập LVM ở trên là hữu ích để cho phép kích thước phân vùng động để bạn không cần sao lưu nhiều không gian trống. Nhưng, tất nhiên, LVM có các tính năng khác có thể được áp dụng rất nhiều. Cụ thể là chức năng "chụp nhanh" cho phép bạn đóng băng một hệ thống tập tin tại một thời điểm. Bất kỳ tình cờ rm -rfhoặc bất cứ điều gì sẽ không làm phiền ảnh chụp nhanh. Tùy thuộc vào chính xác những gì bạn đang cố gắng làm, điều đó có thể đủ cho nhu cầu sao lưu của bạn.

RAID-1

Tôi chắc rằng bạn đã quen với RAID và có thể đã sử dụng nó để đảm bảo độ tin cậy, nhưng RAID-1 cũng có thể được sử dụng để sao lưu, ít nhất là nếu bạn đang sử dụng RAID phần mềm (bạn có thể sử dụng nó với RAID phần cứng, nhưng thực tế đó là cung cấp cho bạn độ tin cậy thấp hơn bởi vì nó có thể yêu cầu cùng một bộ điều khiển mô hình / sửa đổi để đọc). Khái niệm là bạn tạo một nhóm RAID-1 có nhiều đĩa hơn bạn thực sự cần kết nối cho nhu cầu độ tin cậy thông thường của bạn (ví dụ: đĩa thứ ba nếu bạn sử dụng phần mềm RAID-1 với hai đĩa, hoặc có thể là đĩa lớn và phần cứng- RAID5 với các đĩa nhỏ hơn có phần mềm RAID-1 trên đầu phần cứng RAID-5). Khi đến lúc cần sao lưu, cài đặt đĩa, yêu cầu mdadm thêm đĩa đó vào nhóm đột kích, đợi cho đến khi nó chỉ ra tính đầy đủ, tùy chọn yêu cầu kiểm tra xác minh và sau đó xóa đĩa. Tất nhiên,


Câu trả lời rất đầy đủ, trong đó tóm tắt các giải pháp tốt. Tôi nghĩ rằng tôi sẽ giữ cấu trúc hệ thống tệp hiện có của mình và sử dụng ảnh chụp nhanh LVM, dường như là hoàn hảo cho trường hợp sử dụng của tôi.
Benjamin

9

Bạn có thể gắn hệ thống tệp ảo bằng trình quản lý loopback nhưng trong khi điều này sẽ tăng tốc quá trình sao lưu của bạn, nó có thể ảnh hưởng đến các hoạt động bình thường.

Một cách khác là sao lưu toàn bộ thiết bị bằng dd. Ví dụ , dd if=/dev/my_device of=/path/to/backup.dd.


+1 Sao lưu chính thiết bị là một ý tưởng hay.
asm

3
Bạn nên, nếu bạn sử dụng phương pháp này, hãy kiểm tra khôi phục (tốt, bạn nên luôn luôn làm như vậy), vì nếu đầu vào của bạn là một đĩa như / dev / sdd, dd sẽ lưu trữ phân vùng và kích thước phân vùng. Nếu bạn khôi phục nó vào một đĩa nhỏ hơn, bạn sẽ gặp lỗi và nếu bạn khôi phục nó vào một đĩa lớn hơn, nó sẽ hiển thị bị cắt ngắn. Nó sẽ hoạt động tốt nhất, nếu bạn khôi phục dữ liệu sang một ví dụ khác cùng loại đĩa. Chỉ khôi phục phân vùng (/ dev / sdd1) sẽ ít rắc rối hơn.
người dùng không xác định

1
Lưu ý rằng nếu thiết bị ở trên LVM, một bản sao lưu cũng có thể được thực hiện mà không ngắt kết nối đĩa bằng ảnh chụp nhanh LVM.
bdonlan

Tôi thứ hai phương pháp sao lưu ảnh chụp nhanh LVM. Tôi đã tận dụng lvm trong quá khứ để nhân rộng DR trực tiếp. Sử dụng dd kết hợp với ảnh chụp nhanh giúp dễ dàng thực hiện sao lưu cấp khối nhanh chóng.
slashdot

Tôi cố gắng ddhơn ncvà điều này làm một công việc tốt! Tuy nhiên, tôi có thể có dữ liệu không nhất quán / bị hỏng, trái ngược với việc sử dụng ảnh chụp nhanh LVM thay vì phân vùng trực tiếp.
Benjamin

8

Như bạn có thể biết, vấn đề của bạn là địa phương. Một tìm kiếm đĩa thông thường mất 10ms hoặc hơn. Vì vậy, chỉ cần gọi "stat" (hoặc mở ()) trên 10 triệu tệp được đặt ngẫu nhiên cần 10 triệu lượt tìm kiếm, hoặc khoảng 100000 giây hoặc 30 giờ.

Vì vậy, bạn phải đặt các tệp của mình vào các thùng chứa lớn hơn, sao cho số lượng có liên quan là băng thông ổ đĩa của bạn (thường là 50 - 100 MB / giây cho một đĩa đơn) thay vì thời gian tìm kiếm của bạn. Ngoài ra, do đó bạn có thể ném RAID vào nó, cho phép bạn tăng tốc độ băng thông (nhưng không giảm thời gian tìm kiếm).

Tôi có thể không nói cho bạn biết bất cứ điều gì bạn chưa biết, nhưng quan điểm của tôi là ý tưởng "container" của bạn chắc chắn sẽ giải quyết vấn đề, và bất kỳ container nào cũng sẽ làm được. Gắn kết loopback có thể sẽ làm việc tốt như bất cứ điều gì.


Yup, địa phương là rất quan trọng. Nhìn vào mô hình sử dụng của bạn. Hầu hết các vấn đề có xu hướng tuân theo Nguyên tắc Pareto (80% quy trình đạt 20% dữ liệu), vì vậy nếu bạn có thể tìm ra tệp nào cần được lưu trong bộ nhớ cache hoặc chỉ đặt trên một phân vùng riêng có bố cục thư mục khác, thì nó mất ít tìm kiếm thư mục hoặc tìm kiếm, nó có thể sẽ giúp rất nhiều. Truyền bá các tệp thường xuyên truy cập trên các trục khác nhau của đĩa để tìm kiếm song song cũng có thể giúp ích. +1 cho @nemo để đưa lên địa phương tham chiếu.
Marcin

5

Có một vài sự lựa chon. Đơn giản nhất và nên hoạt động với tất cả các hệ thống tệp Linux, là ddsao chép toàn bộ phân vùng ( /dev/sdb3hoặc /dev/mapper/Data-ImageVol) vào một hình ảnh duy nhất và lưu trữ hình ảnh đó. Trong trường hợp khôi phục các tệp số ít, loopback gắn hình ảnh ( mount -o loop /usr/path/to/file /mountpoint) và sao chép các tệp bạn cần. Để khôi phục phân vùng đầy đủ, bạn có thể đảo ngược hướng của ddlệnh ban đầu , nhưng bạn thực sự cần một phân vùng có kích thước giống hệt nhau.

Đánh giá từ trường hợp sử dụng của bạn, tôi đoán việc khôi phục tệp riêng lẻ là một sự kiện rất không thường xuyên, nếu chúng từng xảy ra. Đây là lý do tại sao một bản sao lưu dựa trên hình ảnh thực sự có ý nghĩa ở đây. Nếu bạn cần phải thực hiện khôi phục cá nhân thường xuyên hơn, sử dụng ảnh chụp nhanh LVM theo giai đoạn sẽ thuận tiện hơn rất nhiều; nhưng bạn vẫn cần thực hiện sao lưu dựa trên hình ảnh cho những thảm họa "chúng ta đã mất tất cả". Khôi phục dựa trên hình ảnh có xu hướng đi rất nhiều nhanh hơn khôi phục tar dựa trên đơn giản chỉ vì nó chỉ khôi phục lại khối, nó không phải là phát sinh khá nhiều hoạt động siêu dữ liệu với mỗi fopen / fclose, và cũng có thể là một đĩa hoạt động rất tuần tự cho tăng thêm tốc độ.

Thay vào đó, như video Google @casey chỉ ra đề cập đến một nửa, XFS là một hệ thống tệp tuyệt vời (nếu phức tạp). Một trong những tiện ích đẹp hơn với XFS là xfsdumptiện ích, nó sẽ kết xuất toàn bộ hệ thống tệp vào một tệp và thường làm như vậy nhanh hơn tarcó thể. Đây là một tiện ích dành riêng cho hệ thống tập tin, vì vậy có thể tận dụng lợi thế của fs bên trong theo cách mà tar không thể.


Có rất nhiều câu trả lời hay đấy! XFS có vẻ thú vị, nhưng tôi sợ nó nằm ngoài tầm với của tôi.
Benjamin

3

Tôi sẽ đề nghị bạn trước tiên thử nâng cấp lên EXT4, nếu bạn chưa chạy nó.

Google đã thực hiện rất nhiều nghiên cứu về lý do tại sao EXT4 là một ý tưởng tốt .

Sau đó, bạn nên xem xét triển khai kiến ​​trúc hệ thống tệp phân tán. Ví dụ:


Tôi thực sự đã chạy EXT4, trông rất tuyệt!
Benjamin

2

Có lẽ là một câu trả lời đơn giản, nhưng suy nghĩ đầu tiên của tôi là sử dụng một cái gì đó giống như GridFS được xây dựng trên MongoDB . Nhiều trình điều khiển ngôn ngữ chính hỗ trợ nó ra khỏi hộp, vì vậy bạn có thể chỉ cần trao đổi nó với các phần đọc tệp trong mã của bạn. Ngoài ra, bạn chỉ có thể làm cho đường dẫn thư mục hiện tại của mình trở thành chìa khóa cho các tệp này.

Một vấn đề bạn có thể gặp là Mongo có xu hướng chậm lại khá nhanh nếu nó luôn tìm kiếm từ đĩa. Với 10 triệu tệp, tôi hy vọng phần lớn dữ liệu của bạn sẽ nằm trên đĩa. Các khối tệp trong GridFS là 4 MB, như tôi nhớ, vì vậy nếu các tệp của bạn lớn hơn thì bạn sẽ thực hiện một số thao tác tốn kém để có được một tệp. Chìa khóa, tôi nghĩ, sẽ là sắp xếp các tệp của bạn dựa trên cấu trúc thư mục đã gọn gàng của bạn để bạn có thể có một vài trường hợp Mongo chạy trên một số hộp để giảm tải. Tuy nhiên, tôi không biết yêu cầu về hiệu suất của bạn là gì nên tôi có thể nghĩ quá nhiều về nó.

Lợi ích của tất cả những điều này là gì? Hiệu suất khá gần với đĩa đọc nếu được thực hiện đúng. Ngoài ra, Mongo đi kèm với một số cách tích hợp tuyệt vời để sao lưu toàn bộ dữ liệu trong một cá thể DB một cách nhanh chóng và ngay cả khi cơ sở dữ liệu vẫn đang chạy.


Chắc chắn tôi sẽ xem GridFS mà tôi không biết, nhưng tôi nghĩ cuối cùng tôi sẽ giữ mọi thứ dựa trên hệ thống tập tin để giảm lượng công việc, vì mọi thứ đã hoạt động!
Benjamin

1

Nếu bạn hài lòng với một mô hình thiết bị để lưu trữ dữ liệu của mình, có lẽ bạn có thể xem xét NexentaStor . Nó chạy ZFS trên OpenSolaris dưới mui xe nhưng tất cả quản trị đều thông qua GUI web.

Có một vài tính năng sẽ giúp giải quyết vấn đề của bạn.

  • Phiên bản Enterprise hỗ trợ một hình thức sao chép từ xa dựa trên ảnh chụp nhanh không yêu cầu quét qua toàn bộ hệ thống tệp.

  • Nếu bạn không cảm thấy bẩn tay, ZFS có lệnh diff ZFS rất tiện dụng sẽ cho bạn biết các tập tin đã được thêm, sửa đổi hoặc xóa từ ảnh chụp nhanh cuối cùng mà không cần quét toàn bộ hệ thống tập tin. Bạn có thể kết hợp điều này vào hệ thống sao lưu của mình để giảm đáng kể thời gian cần thiết để thực hiện sao lưu gia tăng.


Cảm ơn, sẽ có một cái nhìn vào nó. Có lẽ nó sẽ thêm một chút phức tạp vào dự án của tôi!
Benjamin

1

Bạn có thể sử dụng một dumptiện ích tiêu chuẩn Để sao lưu hệ thống tệp EXT4 với nhiều tệp. Tiện ích này trước tiên kiểm tra các khối được sử dụng trên một hệ thống tập tin và sau đó sao lưu chúng theo thứ tự đĩa, loại bỏ hầu hết các tìm kiếm.

Có một restoretiện ích tương ứng để khôi phục các bản sao lưu được tạo bởi dump.

Nó hỗ trợ sao lưu gia tăng bằng cách sử dụng các tệp sao lưu cấp độ 1 được sửa đổi từ sao lưu cấp 0 (đầy đủ) cuối cùng, cấp 2 - được sửa đổi từ sao lưu cấp 1, v.v.


0

Đối với các bản sao lưu gia tăng, một tùy chọn sẽ là có một cây bóng thứ hai cho các bìa mới. Đó là, bạn có cây chính của bạn được sử dụng cho tất cả các hoạt động đọc. Bạn cũng sẽ có một newfiles/012345.....jpgthư mục; bìa mới được thêm vào tạo ra một liên kết cứng ở đây cũng như trong cây chính. Khi thực hiện sao lưu, thỉnh thoảng bạn có thể sao lưu cây chính, nhưng sao lưu cây (nhỏ hơn nhiều) newfilesthường xuyên hơn.

Lưu ý rằng để giữ cho newfilescây nhỏ, trước khi thực hiện sao lưu mới của cây chính, bạn có thể làm trống cây newfiles:

mv newfiles newfiles_
mkdir newfiles
rm -rf newfiles_

Một khi bạn làm điều này, tất nhiên, bạn cam kết tạo ra một bản sao lưu mới của cây chính.


Cách tiếp cận thú vị, cảm ơn vì đã chia sẻ nó. Nhưng tôi e rằng nó sẽ liên quan đến rất nhiều thay đổi trong ứng dụng và sẽ rất khó để giữ ứng dụng và nhu cầu lưu trữ ở hai lớp riêng biệt.
Benjamin

0

Thêm một chút đồng thời thường giúp.

Tôi có một vấn đề tương tự như bạn; trong trường hợp của tôi, tôi phải sao lưu khoảng 30 triệu tệp, hầu hết là các tệp HTML, PHP hoặc JPEG. Đối với tôi BackupPC + rsync trên ssh hoạt động tốt; sao lưu toàn bộ mất khoảng một ngày, nhưng việc gia tăng thường sẽ kết thúc sau vài giờ.

Mẹo nhỏ là thêm từng thư mục cấp chính (0, 1, 2 ... a, b, c ...) làm mục tiêu mới để sao chép trong BackupPC và để nó thực hiện sao lưu song song, để đồng thời sao lưu thư mục a / , b / , c / * v.v. Tùy thuộc vào hệ thống con đĩa của bạn, bất cứ điều gì giữa vài quy trình đến khoảng 10 quy trình có lẽ là cách nhanh nhất để sao lưu.

Ảnh chụp nhanh LVM và sao lưu cấp khối cũng là một tùy chọn, nhưng với BackuPC và sao lưu cấp tệp, bạn vẫn có thể khôi phục các tệp hoặc thư mục riêng lẻ nếu cần.


Tôi ngạc nhiên rằng việc sao lưu các thư mục gốc đồng thời giải quyết vấn đề cho bạn, tôi hy vọng điều đó sẽ thực sự chậm hơn. Có phải tất cả các thư mục trên cùng một đĩa? Bạn đang sử dụng ổ SSD?
Benjamin

Các tập tin dữ liệu được lưu trữ trên SAN.
Janne Pikkarainen

Được rồi, có ý nghĩa ngay bây giờ, bạn đạt được hiệu quả từ việc truy cập đồng thời một số tệp, vì các thư mục khác nhau của bạn rất có thể nằm trên các ổ đĩa khác nhau trong SAN hoặc ít nhất là được sao chép trên một số ổ đĩa, cho phép truy cập đồng thời. Tôi chỉ dựa trên RAID-1, vì vậy tôi đoán rằng trên hai lần truy cập đồng thời, tốc độ của tôi rất có thể bị giảm.
Benjamin

0

Benjamin

Tôi nghĩ rằng vấn đề của bạn có thể được giải quyết ở số lượng tệp cho mỗi cấp thư mục!

Thời gian truy cập có thay đổi theo một yếu tố quan trọng không nếu bạn lưu trữ 20 000 tệp trong một thư mục?

Bạn cũng đã từng lưu trữ siêu dữ liệu hệ thống tập tin trên một ổ đĩa truy cập nhanh hơn riêng biệt chưa (như SSD).


0

Tôi muốn giới thiệu một cơ sở dữ liệu quan hệ cũ tốt thay thế.

Tôi sẽ sử dụng PostgreSQL với 256 bảng được phân đoạn (cover_00, cover_01, ..., cover_ff) với dữ liệu hình ảnh dưới dạng byteacột (nhị phân) với bộ nhớ ngoài, với mã định danh tệp là khóa chính. Lấy một hình ảnh sẽ nhanh chóng (nhờ một chỉ mục trên khóa chính), tính toàn vẹn dữ liệu sẽ được đảm bảo (cơ sở dữ liệu tuân thủ ACID), sao lưu sẽ theo thứ tự đĩa, do đó không quá nhiều tìm kiếm.

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.