You can also "soft"-shard your read replicas. I.e. each replica has still has all the data, but you still direct queries to specific replicas as if they were sharded. We had success with this since each replica can have a high cache hit rate by keeping only the data from its shard in cache. This is a lot simpler than real sharding since all replicas can still answer all queries and resharding is very forgiving.