Single point of failure will not work. You need to make the data store mobile and self-replicating to give it any credible chance of (a) surviving and (b) being found after 1 million years.
The problem is that if something is easily accessible, you're saying various waves or energetic particles or outside matter can act on it. Otherwise how would you see it, hear it, probe it, feel it, etc?
Over a million years, the fact that the information can be touched will change it. This is (one reason) why arguably the best naturally occurring data system, encoding data in proteins, still isn't able to produce the same information every time. If the first self-replicating "thing" was immune to data entropy, our planet would only have one species (a very simple one).
So you need to make something fairly resilient, but acknowledge that anything that depends solely on resistance to elements and energetic particles and such is impractical. It either creates a single point of failure, or just ends up never being found.
At the the same time you need to overcome the mutation problem. In nature, not every replication comes out perfectly. Your data store will have the same problem since you can't perfectly control all environmental conditions. So you need a "deactivate" signal that you can send to what is believed to be an imperfect replica. And you need a way to judge whether replicas are correct.
So in designing your replicating data store, give it introspection and give it an interface for signaling other data stores of the same type. Make a set in this generation that you are confident have the correct data. Have them inspect their own data and communicate that with the others of the generation. If one is found to have different data, send the deactivate signal to that one. It doesn't need to be destroyed - just deactivated to keep it from reproducing the mutated data. It may end up being the best copy available in the event of a local cataclysm. You might also be able to 'repair' clones that came out with different data, depending on whether you use rewritable storage or not. But read only and write-once storage may be more resistant to mutation, so weigh your options.
For the data clones that reproduce a generation, give them an algorithm to move them away from their peers once they are verified. They only need to stay close enough to the group so that the next generation can be verified by a number of individuals (or else deactivated).
In this way you solve the single-point-of-failure problem and make a passable attempt at slowing down data entropy. It could work over the scale of 1 million years. You may end up with subspecies of your data because of unforeseen circumstances preventing mutations from receiving a "deactivate." But you can potentially deal with that in 1 million years by comparing the subspecies and attempting to reconstruct the original data from them.
For "easy to extract," if I understand that term correctly, I think you need to build an interface in for any intelligent creature to access the data. It's a million years, so technology guarantees and biological guarantees are in the same boat... you don't necessarily know what you're going to be dealing with. So it would be smart to build in several sensory representations - visual, auditory, tactile - as well as some reasonable signaling using radio or... whatever you think creatures will use for long range communication in 1mm years.
So there you go. RepRap 3d printers with an extra exabyte of data payload, you might call them. Best I can do for now, good luck, hope it works for you ;)