1. A dynamically scalable redundant distributed storage system, the storage system having a plurality of components implemented using functional programming, the components comprising: a plurality of file managers, each file manager having responsibility for providing access to a group of stored files or data blocks and being configured to store metadata associated with each of the files and data blocks for which it is responsible, the metadata including discovery metadata, utility metadata, and a unique file identifier for each file or data block, the metadata for all files managed by a file manager is kept in a file on the file manager; a file manager control component adapted for allocating individual responsibilities among each of the plurality of file managers, the file manager control component being configured to assign file management responsibilities for individual files and data blocks to individual file managers and to maintain a record of which files and data blocks are assigned to each file manager; a plurality of storage managers, each storage manager having responsibility for managing the storage of files and data blocks on one or more data storage devices for which it is responsible and being configured to maintain a record of a location of each stored file and data block on the data storage devices; a storage manager control component adapted for allocating individual responsibilities among each of the plurality of storage managers, the storage manager control component being configured to assign file storage responsibilities for individual files among individual storage managers and to maintain a record of which files and data storage devices are assigned to each storage manager; and at least one client adapted to provide user access to the storage system, the client being configured to initiate actions within the storage system by means of the file manager control component and the storage manager control component, the client further comprising a processor configured to implement a redundant data recovery and reconstruction scheme; wherein the file managers and storage managers divide logical responsibility for files and data blocks from actual control of the files and data blocks; and wherein each individual file manager and individual storage manager has local state knowledge, but cannot know the precise state of other nodes.