=== Basic Principles Overview ===
* Each user account gets will be assigned an opaque, immutable user id, numeric userid.** This is only for internal reference and client applications are not required to know it. It will only change if they user completely delete deletes and then re-create creates their account.
* Each user account is explicitly assigned to a particular We run one or more independent '''clusterstorage clusters'''.** Each cluster is identified by a standURL at which it speaks a common storage-alone piece of infrastructure with no links to other server protocol. Different clustersmay be implemented in vastly different ways and have different operational properties.** Each cluster is responsible for its own durability For example, replicationone might be using Cassandra, scalability and so-onanother might be using MySQL. But they all look the same from the outside.
* Each cluster user account is identified by explicitly assigned to a URL, at which particular cluster. Clients are responsible for discovering their assigned cluster and communicating with it speaks a using the common storage protocol.** Different clusters may have different underlying technologies, e.g. one may be MySQL, one may be Cassandra.** But they all look the same from the outside.
* A user's cluster assignment might change over time; this migration will require careful management, due to evolving infrastructure needs.** This would be fairly infrequent For example, howeverwe might decommission a cluster and migrate all its users to a shiny new one. * The user We will take responsibility for moving the data around, but clients must be prepared to re-account and discover their cluster-mapping information lives in a stand-alone piece of infra, the "userdb"URL.
We will run an independent, highly-available piece of infrastructure just for doing cluster management and discovery, the "userdb".
Architecturally, the system winds up looking something like this: