Hi Drizzlelites, Sorry about that, the presentation was larger than I thought. I have put it up on http://www.kindahl.net/pub/DynamicReplicationTopologies.pdf instead.
Best wishes, Mats Kindahl Mats Kindahl wrote: > > Adi Alurkar wrote: >> Greetings, >> >> It was great to meet everybody at Developer day. I have been catching up >> with all the docs on the protocol and discussing them with our CTO and in >> the last brainstorm with him we realized that although the proposed protocol >> offers great enhancements in terms of exposing shard id / QUERY / QUERY_RO >> in the protocol itself, the following idea would make it even better. >> >> To simplify and explain the problem consider the following architecture: >> (also note that this would apply to sharded DBD scenario as well) >> >> Master Slave/Replica >> M1 ---> R1 >> ---> R2 >> ---> R3 >> ... >> ---> R<n> >> >> * R1, R2 use a persistent storage engine (primarily) to serve as backups to >> M1 >> * R3...RN use memory based/memcache storage engines and used to handle most >> of the "READ ONLY" traffic. >> * Data is being updated at the M1. >> * Data is being replicated to each of the replicas R1..RN. >> * The replicas can be applying the changes at master at different rates and >> are thus at different consistency state's >> * The application assumes eventual consistency. This implies the following >> all request for data made by a thread should only be serviced with data that >> is at a consistency state higher than or equal to of the previous state. >> Using timestamp as a crude gauge to measure consistency if thread TH1 >> requests data at 10:00 all subsequent data request from TH1 should only see >> data that is consistent as of 10:00 or later. >> * In reality timestamp is not the correct way to track consistency, which is >> where we rely on SCN within oracle to achieve consistent reads. The simplest >> definition of SCN is a increasing counter which determines the consistency >> state of the database. >> * C<n> indicates the consistency state.(Needless to say this needs to be >> serialized and determined at the end of a transaction) >> >> Consider the following use case in the above architecture: >> >> * all request where QUERY_RO can be proxied to all servers but all QUERY >> i.e. writes/updates need to be sent to and can be served only by M1. >> * new thread TH1 updates (either, INSERT/UPDATE/DATE/DDL) the data at the >> master, it received a C1 as part of the confirmation of the update and is >> set in the protocol. >> * all subsequent QUERY_RO requests via TH1 include C1 as part of the request >> (set in protocol) thus can be served only by servers that have consistency >> state >=C1. Each satisfied request resets the consistency state in the >> protocol. >> * lets assume TH2 performs multiple updates resulting in the M1 to be at >> C50. R1 is at C45, R2 is at C38, R3 is at R24, etc >> * TH1 request data (QUERY_RO) and is at C24. The request can be routed to >> any of the candidate servers which have consistency state >= C24. >> * a new TH3 requests data (QUERY_RO) with empty consistent state (or 0) and >> thus can be served by the first available server. > > This only works if there is a single source of data (i.e., as you note below, > a > single master). > >> As indicated above adding the concept of SCN and exposing it via the >> protocol would make this a really awesome feature. Some other enhancements >> that would make the SCN concept even more rock solid include: >> * Oracle's SCN is tied to the Oracle instance and is not portable from one >> machine to another, except incase of physical standby. This makes it very >> difficult to implement partial replication(ability to replicate only certain >> objects/schemas), support for multi-master multi-slave replicated >> environment. Not to mention moving a slave from one server to another >> impossible unless the new master is a physical standby of the original >> server. > > Exactly. > >> * support manual "override" of the SCN for slaves, this would allow the >> slaves to inherit the SCN from the master per transaction making >> slave->master promotion easier. > > This just adds to the confusion, since "faking" consistency can be a good > source > of problems. The problem is that you assume a total order, but that is not > necessary. > > Use a vector instead (called "version vector" by some), where you have a > partial > order, but not a total order on the elements. I have attached a short > presentation I did for the replication team at MySQL a few years ago, which > describes this approach. > >> * determine SCN from a central source which uses consensus/paxos, etc > > That just adds a single point of failure, which of course can be used, but > does > not scale very well, since you then need to replicate the SCN central source > as > well, and then you need to have an SCN for every SCN distributed (assuming you > use the same scheme for checking consistency of the SCN server), which is kind > of recursive. > >> Does the idea of supporting something like a SCN and exposing it in the >> protocol to support use case such as above seem valid? > > Absolutely. > > However, it would be nice to be able to handle a branching temporal model as > well, not just a linear temporal model. There were some mention that slaves in > an "alternate future" frequently is a problem, so right now I am thinking of > ways to handle that without introducing an unnecessary overhead. > > Just my few cents, > Mats Kindahl > > > ------------------------------------------------------------------------ > > _______________________________________________ > Mailing list: https://launchpad.net/~drizzle-discuss > Post to : [email protected] > Unsubscribe : https://launchpad.net/~drizzle-discuss > More help : https://help.launchpad.net/ListHelp -- Mats Kindahl Senior Software Engineer Database Technology Group Sun Microsystems _______________________________________________ Mailing list: https://launchpad.net/~drizzle-discuss Post to : [email protected] Unsubscribe : https://launchpad.net/~drizzle-discuss More help : https://help.launchpad.net/ListHelp

