2013-05-07 22 views
52

Tôi đang làm việc trên một dự án đang được lưu trữ trên Amazon Web Services. Thiết lập máy chủ bao gồm hai trường hợp EC2, một Bộ cân bằng tải đàn hồi và một Cửa hàng khối đàn hồi phụ mà trên đó ứng dụng web cư trú. Dự án là được cho là để sử dụng S3 để lưu trữ các tệp mà người dùng tải lên. Vì mục đích của câu hỏi này, tôi sẽ gọi xô S3 static.example.comLàm thế nào tôi có thể gắn một thùng S3 vào một cá thể EC2 và ghi vào nó bằng PHP?

Tôi đã cố gắng sử dụng s3fs (https://code.google.com/p/s3fs/wiki/FuseOverAmazon), RioFS (https://github.com/skoobe/riofs) và s3ql (https://code.google.com/p/s3ql/). s3fs sẽ gắn kết hệ thống tệp nhưng sẽ không cho phép tôi ghi vào nhóm (Tôi đã hỏi câu hỏi này trên SO: Làm cách nào để gắn kết ổ đĩa S3 với quyền thích hợp bằng FUSE). RioFS sẽ gắn kết hệ thống tệp và sẽ cho phép tôi ghi vào thùng từ trình bao, nhưng các tệp được lưu bằng cách sử dụng PHP không xuất hiện trong nhóm (Tôi đã mở một vấn đề với dự án trên GitHub). s3ql sẽ gắn kết nhóm, nhưng không có tệp nào trong thùng xuất hiện trong hệ thống tệp.

Đây là những lệnh trên núi tôi đã sử dụng:

s3fs static.example.com -ouse_cache=/tmp,allow_other /mnt/static.example.com 
riofs -o allow_other http://s3.amazonaws.com static.example.com /mnt/static.example.com 
s3ql mount.s3ql s3://static.example.com /mnt/static.example.com 

Tôi cũng đã cố gắng sử dụng lớp này S3: https://github.com/tpyo/amazon-s3-php-class/ và FuelPHP này cụ thể S3 gói: https://github.com/tomschlick/fuel-s3. Tôi đã có thể nhận được gói FuelPHP để liệt kê các nhóm và tệp khả dụng, nhưng lưu tệp vào nhóm không thành công (nhưng không có lỗi).

Bạn đã bao giờ gắn một thùng S3 trên hệ thống tập tin linux cục bộ và sử dụng PHP để ghi tệp vào nhóm thành công chưa? Bạn đã sử dụng công cụ nào? Nếu bạn đã sử dụng một trong các công cụ được đề cập ở trên, bạn đã sử dụng phiên bản nào?

EDIT Tôi đã được thông báo rằng vấn đề tôi đã mở với RioFS trên GitHub đã được giải quyết. Mặc dù tôi đã quyết định sử dụng S3 REST API thay vì cố gắng gắn kết một nhóm dưới dạng một khối lượng, có vẻ như là RioFS có thể là một lựa chọn khả thi trong những ngày này.

+2

Tại sao bạn nên downvote? Tôi có cần phải cụ thể hơn/ít hơn không? –

+1

Tại sao bạn không sử dụng [S3 API] (http://aws.amazon.com/documentation/s3/) thay vì cố gắng sử dụng nó như một hệ thống tập tin? –

+0

Không phải là downvoter, nhưng tôi tự hỏi nếu anh/cô ấy đang tìm kiếm một đoạn mã bạn đang gặp rắc rối với. Mặc dù chúng tôi có chính sách ở đây chống lại các câu hỏi khó hiểu, nhưng câu hỏi có vẻ đủ cụ thể đối với tôi, vì vậy +1. – halfer

Trả lời

48

Bạn đã bao giờ gắn một thùng S3 trên hệ thống tệp linux cục bộ chưa?

No. Thật thú vị khi thử nghiệm, nhưng tôi sẽ không để nó gần hệ thống sản xuất. Sử dụng thư viện để giao tiếp với S3 tốt hơn nhiều. Đây là lý do:

  1. Nó sẽ không ẩn lỗi. Một hệ thống tập tin chỉ có một vài mã lỗi mà nó có thể gửi cho bạn để chỉ ra một vấn đề. Thư viện S3 sẽ cung cấp cho bạn thông báo lỗi chính xác từ Amazon để bạn hiểu những gì đang xảy ra, ghi nhật ký, xử lý các trường hợp góc, v.v.
  2. Thư viện sẽ sử dụng ít bộ nhớ hơn. Các lớp hệ thống tập tin sẽ lưu trữ nhiều thứ ngẫu nhiên mà bạn không bao giờ sử dụng lại. Một thư viện giúp bạn kiểm soát để quyết định bộ nhớ cache nào và không lưu vào bộ nhớ cache.
  3. Mở rộng. Nếu bạn cần làm bất cứ điều gì ưa thích (thiết lập một ACL trên một tập tin, tạo ra một liên kết đã ký, phiên bản, vòng đời, thay đổi độ bền, vv), thì bạn sẽ phải loại bỏ trừu tượng hệ thống tập tin và sử dụng thư viện.
  4. Thời gian và thử lại. Một số phần nhỏ các yêu cầu ngẫu nhiên bị lỗi và có thể được thử lại. Đôi khi bạn có thể muốn thử lại rất nhiều, đôi khi bạn thà bị lỗi nhanh hơn. Hệ thống tệp không cung cấp cho bạn quyền kiểm soát chi tiết, nhưng thư viện sẽ.

Điểm mấu chốt là S3 trong FUSE là leaky abstraction. S3 không có (hoặc cần) thư mục. Hệ thống tệp không được tạo cho hàng tỷ tệp. Mô hình quyền của họ không tương thích. Bạn đang lãng phí rất nhiều sức mạnh của S3 bằng cách cố gắng để shoehorn nó vào một hệ thống tập tin.

Hai thư viện PHP ngẫu nhiên cho nói chuyện với S3:

https://github.com/KnpLabs/Gaufrette

https://aws.amazon.com/sdkforphp/ - cái này rất hữu ích nếu bạn mở rộng vượt ra ngoài chỉ sử dụng S3, hoặc nếu bạn cần phải làm bất cứ yêu cầu lạ mắt nêu trên.

+1

Tôi không biết tại sao tôi thậm chí cố gắng gắn kết xô S3 trên hệ thống tập tin cục bộ ... có lẽ vì đó là ý tưởng của người khác trước. –

+7

+1 cho bài viết trừu tượng bị rò rỉ! – Ricalsin

+0

Tôi đã kiểm tra Gaufrette, nghĩ rằng nó sẽ làm cho việc tích hợp s3 dễ dàng hơn, nhưng thực sự, sdk của amazon khá dễ sử dụng. – targnation

2

Khá thường xuyên, thuận lợi là ghi các tệp vào khối lượng EBS, sau đó buộc các yêu cầu công khai tiếp theo cho (các) tệp để định tuyến qua CDN CloudFront. Theo cách đó, nếu ứng dụng phải thực hiện bất kỳ phép chuyển đổi nào đối với tệp, thì việc thực hiện trên hệ thống ổ đĩa cục bộ & trở nên dễ dàng hơn, sau đó buộc các tệp được chuyển đổi lấy từ nguồn gốc qua CloudFront.

ví dụ: nếu người dùng của bạn đang tải lên hình ảnh cho hình đại diện và hình đại diện cần nhiều lần lặp cho kích thước & cắt, ứng dụng của bạn có thể tạo các hình này trên ổ cục bộ, nhưng tất cả yêu cầu công khai cho tệp sẽ diễn ra thông qua yêu cầu kéo theo nguồn gốc trên đám mây . Theo cách đó, bạn có thể linh hoạt tối đa để giữ nguyên tệp gốc (hoặc phiên bản được tối ưu hóa của tệp) và mọi yêu cầu người dùng tiếp theo có thể kéo phiên bản hiện tại từ cạnh trước đám mây hoặc mặt trước đám mây sẽ chuyển yêu cầu trở lại ứng dụng và tạo mọi lần lặp cần thiết.

Ví dụ cơ bản ở trên sẽ là WordPress, tạo nhiều phiên bản có kích thước/cắt của bất kỳ hình ảnh đồ họa nào được tải lên, ngoài việc giữ nguyên bản gốc (tùy thuộc vào giới hạn kích thước tệp và/hoặc biến đổi plugin). Các plugin WordPress có khả năng CDN như W3 Total Cache ghi đè các yêu cầu để kéo qua CDN, vì vậy ứng dụng chỉ cần tạo các lần lặp yêu cầu đầu tiên duy nhất. Thêm phiên bản URL bộ nhớ đệm của trình duyệt (http://domain.tld/file.php?x123) tiếp tục tinh chỉnh và tận dụng chức năng CDN.

Nếu bạn quan tâm đến việc mở rộng nhanh kích cỡ tệp hoặc khối lượng tệp EBS, bạn có thể tự động hóa quy trình cắt bớt cho các tệp được yêu cầu ít khi hoặc tệp tuổi.

Các vấn đề liên quan