A plain ring has two weaknesses. First, with only a few servers placed at random points, the gaps between them are uneven, so one server can end up responsible for a much larger arc of the circle, and therefore much more traffic, than the others. Second, when a server dies, its entire share lands on the single neighbor clockwise from it, which can overload that one machine.
The fix is virtual nodes. Each physical server is placed on the ring not once but many times, often 100 to 200 times, by hashing names like server-A#1, server-A#2, and so on. Now each physical server owns many small arcs scattered around the circle instead of one big arc. The load evens out, and when a server fails its share is spread across many neighbors rather than dumped on one.
Virtual nodes also let you weight servers. A machine with twice the memory can be given twice as many points on the ring, so it naturally takes twice the share of keys.