Хорошо, в конце мне удалось решить это использование следующего vcl файла. Обратите внимание, что я добавил несколько дополнительных битов для разрешения изящества истечения кэша, когда бэкенд умер.
Кажется, что мой основной отказ использовал unset req.http.Set-Cookie;
когда я должен был использовать unset obj.http.Set-Cookie;
в vcl_fetch
раздел. (obj
в vcl_fetch и req
в разделе vcl_recv).
director rails_director round-robin {
{
.backend = {
.host = "xxx.xxx.xxx.xxx";
.port = "http";
.probe = {
.url = "/lbcheck/lbuptest";
.timeout = 0.3 s;
.window = 8;
.threshold = 3;
}
}
}
}
sub vcl_recv {
if (req.backend.healthy) {
set req.grace = 30s;
} else {
set req.grace = 1h;
}
if (req.url ~ "^/login") {
pipe;
}
if (req.url ~ "^/sessions") {
pipe;
}
if (req.url ~ "\.(css|js|jpg|jpeg|gif|ico|png)\??\d*$") {
unset req.http.cookie;
lookup;
} else {
if (req.http.cookie ~ "user_credentials") {
pipe;
} else {
unset req.http.cookie;
}
}
# Only cache GET and HEAD requests
if (req.request != "GET" && req.request != "HEAD") {
pipe;
}
}
sub vcl_fetch {
set obj.grace = 1h;
if (req.url ~ "^/login") {
pass;
}
if (req.url ~ "^/sessions") {
pass;
}
if (req.http.cookie ~ "user_credentials") {
pass;
} else {
unset obj.http.Set-Cookie;
}
# cache CSS and JS files
if (req.url ~ "\.(css|js|jpg|jpeg|gif|ico|png)\??\d*$") {
unset obj.http.Set-Cookie;
}
if (obj.status >=400 && obj.status <500) {
error 404 "File not found";
}
if (obj.status >=500 && obj.status <600) {
error 503 "File is Temporarily Unavailable";
}
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
} else {
set resp.http.X-Cache = "MISS";
}
}
Было предложение добавить новый системный вызов, reflink()
, который сделал бы точно, что Вы хотите. До сих пор это не было принято; однако, ocfs2
(начиная с 2.6.32), уже имеет его как ioctl [1]()[2].
Несколько статей с мая 2009 на предмете:
Более старый вариант идеи назвали Ссылками COW.
Мне поиском снимка WAFL-стиля кажется. Это точно не использует "неизменную жесткую ссылку", семантическую, но очень близко к нему.
http://blog.interlinked.org/tutorials/rsync_time_machine.html http://rsnapshot.org/
оба будут работать с ext3/ext4.
Они не точно снимки, но, создадут новый каталог с hardlinks к предшествующему поколению. Удаление предшествующего поколения оставит новый каталог с корректными файлами.