shard - something like raid 0 (each shard have part of the full table, read is faster cause each shard have a well know part of table, for example value from column1 > 10, you can use mpp too, but instead of just mpp you have something like "table partitioning" to speed some queries, and slow full table scan in some cases )
federate - like symbolic links (it's a table in another server, but you define the table in current server to read from that server, this allow apps to continue using database/table without code changes)
cluster - something like raid 1 / drbd (each server have part of the full table (cluster+shard), or have the full table (only cluster), write is slower cause all servers must return commit ok (if it's a sync server, async server don't need but don't have consistent reads, semi-sync cluster have the same problem with more controlled cenario) to ensure a good write, but reads can be faster cause you can use mpp queries / multi thread reads in more than one host/node), you have a fail safe feature here too cause if one server die, the other have all data