Khóa tập tin với một twist
Giống như câu trả lời khác đã đề cập, phương pháp đơn giản nhất là để tạo ra một tập tin khóa trong cùng thư mục với các datafile.
Vì bạn muốn có thể truy cập cùng một tệp trên nhiều PC, giải pháp tốt nhất tôi có thể nghĩ là chỉ bao gồm số nhận dạng của máy hiện đang ghi vào tệp dữ liệu.
Vì vậy, trình tự cho văn bản cho các tập tin dữ liệu sẽ là:
Kiểm tra nếu có một tập tin khóa hiện
Nếu có một tập tin khóa, xem nếu tôi là một trong những sở hữu nó bằng cách kiểm tra xem nội dung của nó có nhận dạng của tôi hay không.
Nếu đúng như vậy, chỉ cần ghi vào tệp dữ liệu, sau đó xóa tệp khóa.
Nếu đó không phải là trường hợp, chỉ cần chờ một giây hoặc một khoảng thời gian ngẫu nhiên nhỏ và thử lại toàn bộ chu kỳ.
Nếu không có tệp khóa, hãy tạo một tệp có mã định danh của tôi và thử lại toàn bộ chu kỳ để tránh tình trạng cuộc đua (kiểm tra lại xem tệp khóa thực sự là của tôi).
Cùng với số nhận dạng, tôi sẽ ghi lại dấu thời gian trong tệp khóa và kiểm tra xem nó có lớn hơn giá trị thời gian chờ nhất định hay không.
Nếu dấu thời gian quá cũ, hãy giả sử rằng tệp khóa cũ và chỉ xóa nó vì nó sẽ là một trong những PC ghi vào tệp dữ liệu có thể đã bị lỗi hoặc kết nối của nó có thể bị mất.
Một giải pháp khác
Nếu bạn đang ở trong kiểm soát các định dạng của tập tin dữ liệu, có thể là để dự trữ một cấu trúc ở phần đầu của tập tin để ghi lại cho dù đó là bị khóa hay không.
Nếu bạn chỉ đặt một byte cho mục đích này, bạn có thể giả định rằng 00
có nghĩa là tệp dữ liệu không bị khóa và các giá trị khác sẽ đại diện cho số nhận dạng của máy hiện đang ghi vào đó.
Các vấn đề với NFS
OK, tôi thêm một vài điều vì Jiri Klouda một cách chính xác chỉ ra rằng NFS uses client-side caching rằng sẽ cho kết quả trong file khóa thực tế là trong tình trạng không xác định.
Một vài cách để giải quyết vấn đề này:
gắn kết thư mục với noac
hoặc sync
tùy chọn NFS. Điều này là dễ dàng nhưng không hoàn toàn đảm bảo tính nhất quán dữ liệu giữa máy khách và máy chủ mặc dù vậy vẫn có thể có vấn đề mặc dù trong trường hợp của bạn nó có thể là OK.
Mở tệp khóa hoặc tệp dữ liệu bằng các thuộc tính O_DIRECT
, O_SYNC
hoặc O_DSYNC
. Điều này là nghĩa vụ phải vô hiệu hóa bộ nhớ đệm hoàn toàn.
Điều này sẽ giảm hiệu suất nhưng sẽ đảm bảo tính nhất quán.
Bạn thể có thể sử dụng flock()
để khóa các tập tin dữ liệu nhưng việc thực hiện của nó là đốm và bạn sẽ cần phải kiểm tra xem hệ điều hành cụ thể của bạn thực sự sử dụng các dịch vụ khóa NFS. Nó có thể không làm gì cả.
Nếu tệp dữ liệu bị khóa, khi đó một ứng dụng khách khác mở tệp để ghi sẽ không thành công.
Ồ vâng, và nó dường như không hoạt động trên cổ phiếu SMB, vì vậy tốt nhất nên quên nó đi.
Không sử dụng NFS và chỉ sử dụng Samba thay vào đó: có good article on the subject và lý do NFS có thể không phải là câu trả lời hay nhất cho kịch bản sử dụng của bạn.
Bạn cũng sẽ tìm thấy trong bài viết này các phương pháp khác nhau để khóa tệp.
Giải pháp của Jiri cũng là giải pháp tốt nhất.
Về cơ bản, nếu bạn muốn giữ mọi thứ đơn giản, không sử dụng NFS cho các tệp được cập nhật thường xuyên được chia sẻ giữa nhiều máy.
Something khác nhau
Sử dụng một máy chủ cơ sở dữ liệu nhỏ để lưu dữ liệu của bạn vào và bỏ qua các vấn đề khóa NFS/SMB hoàn toàn hoặc giữ nhiều hệ thống tập tin dữ liệu hiện tại của bạn và chỉ cần viết một tiện ích nhỏ để nối kết quả.
Nó vẫn có thể là giải pháp an toàn và đơn giản nhất cho vấn đề của bạn.
Nguồn
2009-03-21 00:15:32
Bạn phải bỏ lỡ phần mà anh ấy nói anh ấy cần đồng bộ hóa giữa các máy tính khác nhau. –
Và giải pháp này sẽ không hoạt động trên NFS như ông yêu cầu. –
Tại sao lại không làm việc này? Tôi không có nghĩa là viết một tập tin cục bộ trong mỗi máy tính nhưng ở một vị trí duy nhất cho tất cả chúng. – Seb