Hello Samba,
Thank
you for your comments, please also submit them to the design document
discussion page so they can be tracked accordingly.
Database clustering is obviously a big complex area, and this is our first
entrance into this space. We will not support everything imaginable in
our first release. I think the policies outlined in the design doc cover
the common use cases, and are probably even a little to ambitious for a first
release.
What you seem to be requesting is support for both partitioning and replication...
and load balancing for the same data. As you can understand this would be
pretty complex. Scenarios like this are something that the design of the
partitioning framework are capable of supporting, but given the complexity,
this is not something we will direct support in our first release. To
implement this you can define your own PartitioningPolicy subclass (or subclass
the policy that matches your requirements the closest). Then for a given
query you can define, in your own code, which databases to send the request
to. You would need to define which set of servers each range should go
to. For a read request, you could load balance across these
servers. For a write request, you could write to each of the
servers. If you detect an error in one of the servers, you can failover
to the other.
I
understand that the root class name PartitioningPolicy does not describe
everything it can do adequately. But naming the class
PartitioningLoadBalanacingReplicationAndFailoverPolicy would be a little too
wordy; I think partitioning is the main usecase, hence its name.
-----Original
Message-----
From: Samba [mailto:saasira@xxxxxxxxx]
Sent: Wednesday, November 17, 2010
10:33 AM
To: Dev mailing list for Eclipse
Persistence Services
Subject: Re: [eclipselink-dev]
Code review: initial partitioning support, bug#328937
Hi James,
I
have few comments on the implementation; please read these as constructive
criticism.
A
PartitioningPolicy is supposed to be used for partitioning both the read
queries as well as write statements such that queries get distributed and end
up at different database instances.
A ReplicationPolicy,
as noted in the comments above the class, is instrumented to duplicate all
writes across all the configured nodes of replication.
A
LoadBalancingPolicy can be an implementation of either of the above
or a combination of both the partitioning and the replication features. So, we
need to create a base class for LoadBalancingPolicy that can be
exteded to support various ways of load balancing by utilizing replication or
partitioning or both.
The
difference I'm trying to bring out is that a ReplicationPolicy cannot be an
extension of PartitioningPolicy.
Similarly, a LoadBalancingPolicy
can have an instance each of PartitioningPolicy and ReplicationPolicy but
it is not an extension of either of these; instead it can only be a
composition of these two features.
How we
provide load balancing can be dealt in the implementations like:
1.
RounRobinLoadBalancingPolicy, CluserLoadBalancingPolicy,
etc are possible if the data is only
replicated and not partitioned; they support active/passive fail-over. Their
primary purpose is to support
fail over and optionally to reduce load on a single
server. These implementations rely on having
ReplicationPolicy implementations
and cannot have PartitioningPolicy instance.
2.
RangeLoadBalancingPolicy, HashLoadBalancingPolicy,etc are possible
with partitioning the data across
several nodes, their primary purpose is to provide scalability and
performance.However we can also
replicate
each partitioned node and thus can support passive fail-over.
These policies will primarily reply
on having PartitioingPolicy implementation but can optionally also
include ReplicationPolicy features as
well in order to support fail over in addition to scale and performance.
I hope I'm
making some sense here :)
Thanks and
Regards,
Samba
On Mon, Nov
8, 2010 at 7:57 AM, James Sutherland <JAMES.SUTHERLAND@xxxxxxxxxx>
wrote:
Code review: initial partitioning support,
bug#328937
https://bugs.eclipse.org/bugs/show_bug.cgi?id=328937
design doc,
http://wiki.eclipse.org/EclipseLink/DesignDocs/328937
Changes:
- added partitioningPolicy to
ClassDescriptor
- added null check to FetchGroupManager
to avoid null-pointer on failed deploy
- added PartitionPolicy abstract class,
defines getConnections API
- added ReplicationPolicy, replicates
writes to multiple pools
- added pool reference to Accessor, so it
knows where it came from
- added acquire/release connection
logging
- added partitioningPolicy to
AbstractSession
- changed AbstractSession accessor to
Collection accessors (and updated references)
- changed transaction to work with
multiple accessors (2 stage commit)
- changed call execution to work with
multiple accessors
- made client sessions (isolated,
exclusive) execute calls consistently, added support for partitioning
- added @Overrides to sessions, some
micro
- fixed finally connection release in
ReferenceMapping
- changed DatabaseQuery accessor to
Colleciton accessors
- changed SessionBroker getAccessor API
to use same getAccessor for partitioning, only a single call, pass query
- added setURL to DatabaseLogin
- changed ClientSession writeAccessor to
Map writeAccessors keyed on pool name
- changed ClientSession connection to be
lazily assigned
- changed getAccessor on ClientSession to
assign a connection if in a transaction to support backward compatiblity, and
internal usage
- changed ServerSession call execution to
support partitioning
- added JPA partitioned model
- changed JPA test framework methods to
be instances methods and use inherited getPersistenceUnitName define in test
avoid common mistakes in non default unit tests
- added JPA paritioning test switch using
derby "cluster" and round robin and replication, tests only run on
Derby as need to create multiple databases
- added batch-fetch example
- added partitioned, and isolated
partitioned version of UnitOfWork test model, uses "virtual rack"
(multiple connection pools to the same database)
Code review: Andrei (pending)
_______________________________________________
eclipselink-dev mailing list
eclipselink-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-dev