I'd choose a custom cluster instead of a distributed FS, because it is simpler to understand and troubleshoot, while still working. I.e., the reliability tradeoffs of your own cluster are obvious, while it is a task on its own to figure out how a distributed FS reacts to a dead server or failed switch.
A possible solution to your type of problem is to split the whole photo archive into parts (say, 2 parts) and make the part id explicit in the URL (e.g., make it a subdomain or a GET parameter that is easy to extract with regular expressions). Then, you'll have 4 storage servers with photos (2 servers for each part). Use the fifth server as a reverse proxy that distributes and balances the load. All five servers can run lighttpd. I.e., I propose a very dumb, but working (for the company I worked in - with the total load of ~5000 requests per second, files with 3-10 KB in size, 8 TB of unique files total, server from 24 backends that, however, run a custom HTTP daemon instead of lighttpd) solution.
As for the disks and RAM: we used a software RAID-0 made of four fast but cheap SATA disks on each server (if a disk fails, all data can be copied anyway from a replica on a different server), plus a custom solution to take the whole server offline after a single read error. RAID-5 and RAID-6 are very bad speed-wise even if one disk fails, please don't use them. On the content servers, a lot of RAM is essential (as a disk cache), look for 24 GB or more. Even then, be prepared for a 30-minutes warmup time. On the reverse proxy, if you use lighttpd, please take into account that it buffers the whole upstream response into RAM as fast as possible, and can spend a lot of time pushing the cached photo to someone on dialup or GPRS (and during that time, needs that buffer in RAM). We also took 24 GB just to have identical configurations, but I am not sure if this is overkill. Memory-based HTTP cache on the reverse proxy is not essential (even if there are hot images!), because the OS-provided disk cache on the backends works just as well.
For making sure that all backends that serve the same part of your archive have the same data: this is easy. When publishing photos, just copy them to all servers. Then use rsync on old parts of the archive to correct for any discrepancies, thus making one copy the master.