The design of RavenDB 4.0We already got stuff out there
I mentioned in my previous post that one of the things that pushed the design of RavenDB 4.0 is retrospective analysis. In particular, , "if we had to do it all over again, rewind the clock to 2008, and design RavenDB from the ground up with all the knowledge that we currently have, what would we do differently?". The problem with this approach is that we have shipping software, we have stuff that customers have been using for over six years, so it isn’t like we can start from scratch, and as tempting a decision that would be, it is almost always the wrong decision. RavenDB 4.0 isn’t a re-write, it is a major architectural change, driven by own experience in what is painful.
That is a good guideline, but what does this mean? We had a few rounds of thoughts around this, and we ended up with the following decisions.
As a major version release, we aren’t bound by backward compatibility, and we are going to take full advantage of that. That means that a 4.0 server cannot be accessed by a 3.0 client, and a 3.0 server can’t replicate to a 4.0 server. From the point of view of the wire protocol, we have taken the chance to fix some long standing issues, but I’ll have another post about that. Internally, an upgrade from 3.0 to 4.0 will probably be done by a dedicated migration tool, unlike the previous “in place” upgrade procedure that we previously had. The reason for those decisions is that this gives us a lot of flexibility in fixing our implementation and change how we are doing things.
At the same time, from an external point of view, users of RavenDB should see as little change as we can get away with. Ideally, the process of upgrading a new piece of software to RavenDB 4.0 should be:
- Update the Nuget package
- Recompile
And that would be it. In practice, I’m sure that we’ll have edge cases and things that would require a bit more work from the user, but that is the goal, that as far as users are concerned, they don’t have to do a lot of extra work to upgrade.
We’ll probably have a lot of discussions around what exactly we can change, and what we must absolutely have. In some of the discussion we had with our customers we already learn that running on 32 bits is a hard requirement for some of them, which means that RavenDB 4.0 will support that, even if that makes our life quite a bit more complex.
As a reminder, we have the RavenDB Conference in Texas in a few months, which would be an excellent opportunity to learn about RavenDB 4.0 and the direction in which we are going.
More posts in "The design of RavenDB 4.0" series:
- (26 May 2016) The client side
- (24 May 2016) Replication from server side
- (20 May 2016) Getting RavenDB running on Linux
- (18 May 2016) The cost of Load Document in indexing
- (16 May 2016) You can’t see the map/reduce from all the trees
- (12 May 2016) Separation of indexes and documents
- (10 May 2016) Voron has a one track mind
- (05 May 2016) Physically segregating collections
- (03 May 2016) Making Lucene reliable
- (28 Apr 2016) The implications of the blittable format
- (26 Apr 2016) Voron takes flight
- (22 Apr 2016) Over the wire protocol
- (20 Apr 2016) We already got stuff out there
- (18 Apr 2016) The general idea
Comments
I am sure your upgrade procedure is no worse than everybody else.
However, often you write about performance and distributed databases without downtime.
I would like to read about expected downtime due to upgrade and whether it is possible to serve customers 24/7 by using RavenDB with a delayed replication or the old solution has to enter readonly-mode.
Just an idea for a future post :-)
It sounds very risky to let v3 and v4 coexist like that with a fairly hard upgrade path in between. Python 2/3 had something similar. The differences weren't all that great but there was no smooth transition path. All code breaks just a little bit and many dependencies are not ready for the new version. Python 3 is 8 years old and Python 2 is very much alive.
Carsten, We'll probably need to wait until we have a bit more of the implementation before we start handle the migration story with 24/7 upgrades.
This is going to be a bit hard, because you're going to update both client and server at the same time, we'll need to talk about it sometime down the line
Mark, That is true regardless. We have users that have a committed support contract for 2.x releases up until 2022, for example.
But yes, we'll work to make this as easy as possible, but making this decision is important, because it frees us to do a lot of very important optimizations.
You should use the opportunity to make the thing run on Linux.
Anil, We did, see: https://twitter.com/ayende/status/722529183201681410
Ayende, did any of the original design principles of RavenDb change with 4.0?
Pop Catalin, I'm not sure that I understand that question?
Like "Safe by default", "Zero Administration", "Full Rest" any of these changed? Or new Principles were used?
Pop Catalin, No, we still maintain all of those. But those are for the most part solved. We already have good solution for that. What we do in 4.0 is mostly modify how we do things, not what we do
Ayende, it looks like for 4.0 you got at least one new principle: "Critical components are owned by the Raven team"
Pop Catalin, I'm not sure that I would have phrased it like that, but that is certainly the case. We really want to own / be able to modify every single thing that can cause us pain
Comment preview