These two factors even interact to make the situation worse. Because at any point, nodes can drop off and you never know if this condition is temporary or permanent, a distributed datastore has to redundantly store everything. This needs much more space than just storing everything at its origin, as is done in location-addressed networks like Web.
These are not insurmountable problems, of course; it's just that right now, conditions like storage on nodes, link asymmetry, traffic distribution asymmetry still favor centralization.
And fundamentally, the operators of individual nodes (i.e. ordinary people) are often not very selfless, and not enough of them contribute to the health of the mesh even if they discretionarily choose the mesh: seeding ratios on BitTorrent networks that are not user-adjustable (e.g. old World of Warcraft downloader, Facebook patchsets) are much, much higher than seed ratios where the peer can bow out at any time, despite all of latter users choosing BitTorrent voluntarily.