A relay accepts signed events over WebSocket, stores them, and pushes them back out to anyone subscribing to matching filters. There is no coordination between relays. Each one has its own storage, its own policies about what to accept, and its own performance characteristics. Clients talk to several at once so no single relay going down takes the user offline.
You can run your own with one command. You can also rent space on a paid relay that promises faster response and higher retention. Most users never need to think about which relays they use, but the option is always there.