I'll adjust what Sean said slightly...
For OpenID scenarios, it isn't absolutely mandatory in all cases that you implement a custom store. For OAuth it is mandatory (and its sample store is rigged to not compile outside the samples because it's a bad in production code). But for OpenID, the standard in-memory store is sufficient for most (non web farm) RPs. And in particular RPs that operate in "dumb" mode never have to provide a store at all since there is never anything to store.
For web farms, putting an RP in dumb mode is the easiest way to go. But for RPs that require better performance or to leverage some of DNOA's enhanced security features, a custom store is required for web farms in order facilitate sharing state between the servers. For OPs, a web farm must always implement a custom store because there is no "dumb mode" for OPs, and state must be shared in order to keep the protocol reliable and secure.
As far as how to implement a store securely, DNOA takes care of the security aspects except for exactly what an accurate implementation of the custom store interface would supply -- specifically nonce and association storage and lookup. The documentation of that interface should help you understand what that interface should do. And if you have specific questions we can certainly address those on this forum.
And as Sean said, as far as the load balancer goes, part of the OpenID protocol is to verify that the HTTP request that comes in is exactly what it should be, which load balances often mess with and cause the login to fail. Sean mentioned one of the HTTP headers that DNOA will look at that a load balancer can add that allows DNOA to figure out what the outside-facing HTTP request was in order for the login to succeed.
The RP store interface and the OP store interface both come with a default in-memory implementation built into the library -- again, not good for use in web farms and your implementation should be plugged in at runtime, or the RP should be put in "dumb" mode. The CustomStore implementation is a sample designed, not to be used in production, but to give you an overall idea of how a database-driven store might look and behave.
--
Andrew Arnott
"I [may] not agree with what you have to say, but I'll defend to the death your right to say it." - S. G. Tallentyre