For the latter case, the mounting of these partitions can be automated with config management on the linux servers. You have to be careful with UID's and GID's but config management helps with this.
The filers supplying the NFS storage can be exploited to provide replication to other datacenters,snapshots and also provide redundancy with multiple heads serving the volumes.
In the past I've used Fibre channel ( found it overly complex) and iSCSI. iSCSI was fairly straight forward to use, but I've never tried to automate it. I guess there isn't a reason you couldn't however. For complexity I guess its Fibre>iSCSI>NFS.
Performance wise we don't have any issues with NFS itself, the bottleneck is sometimes the filer trying to keep up :-)
Anyhow, in complex environments, sometimes its good to keep things simple where you can. NFS helps with that, its stable, scalable and the performance is comparable to iSCSI.
Removing the need for shared storage on the OS where possible is the ultimate aim though.
It's been the cause of virtually all of our service outages and many of our performance problems---and it's completely obsolete in the era of Jenkins and Ansible.
At some point after that, the hosts running the binary will try to page something involving that binary and will SIGBUS and die.
That's just one of many failure modes.
I'd be interested to know more about your experiences with an NSF "share"...which he mentions...?
Thanks!
These guys avoid the problem by never rolling back the database, and never making changes that might require that.
As for reducing the risk of damage to the data itself from badly behaved application code, I think the best approach is to design your architecture such that you can't lose important data.
There are various other techniques than can help. I wrote about some of them here http://benjiweber.co.uk/blog/2015/03/21/minimising-the-risk-...
Releasing less frequently actually only makes the problem worse. Infrequent changes are often too big to have a chance of understanding their potential affect on the production system. You're also less likely to immediately know how to respond to a problem.
I would not roll out new code with migrations without ad-hoc db backup. Any new code as well.
1. Change your code to write to old and new schema; keep reading from old schema.
2. Migrate data to new schema in background.
3. Add a flag to control where you're reading from. Default it to read from old location. Keep writing to both.
4. Flip the flag on some subset of your jobs. Ensure everything is still running smoothly for as long as you like.
5. Change the default to read from new schema. Wait as long as you like to be comfortable that the change is working properly.
6. Delete the code that reads from the old schema.
7. Delete the code that writes to the old schema.
8. Drop the data in the old schema.
At any point prior to deleting the old data, if you encounter problems you can roll back to an old version of the code. If your schema changes are incompatible, you can make an entire new database with the new schema. This may temporarily waste some storage space, but it's very safe.This idea comes from the concept of inventory waste from lean manufacturing
1) If you can do quick, easy releases, people release small, narrowly-scoped changes instead of huge batches of changes that may interact with each other in all sorts of unknown ways.
2) If you need to fix something, having a process that lets you release quickly and easily means you can get a fix deployed that much sooner. I hate being in a situation where an emergency patch that is really small still takes hours to get out.
The author sure didn't invent them, but they aren't widespread enough yet. In fact e.g. Rails puts you in the opposite mindset (which is OK at early stages).
http://www.cvc.com/Our-Portfolio.htmx?ordertype=1&itemid=112...
PS - They actually make pretty good money too: http://www.cvc.com/Our-Portfolio.htmx?ordertype=1&itemid=112...
As I understand it, Sky bet is quite separate from the rest of the company. This is probably a good thing...
Feature flags in particular are a very powerful tool for managing feature releases independent of the deploy cycle. Here's a good recent article that dives into those in more detail: http://martinfowler.com/articles/feature-toggles.html
I see a lot of other people mentioning the annoyance factor. Like anything else, you get used to it, and appreciate its advantages.
You do have to think several steps ahead when making big changes; the (internal-only) project I work on is in the process of completely changing our DB schema and we're redoing our API completely as well. We're attempting to keep our old API running in parallel while migrating literally everything underneath it, which is a fun challenge. It results in a lot of what can feel like busywork, but when the alternative is bringing down your service temporarily, it's worth it. An hour of planned downtime to do an offline migration can easily turn into several days when Murphy strikes. That's OK when you're first building a system, but once anyone is relying on you to get their work done, it is just pure pain.
The benefit over using views is that at your code is written in the same language, instead of having a while bunch of logic running semi-hidden in the database. If you have a bug in your view, you have to update your DB schema (or at least roll out new PL/SQL DB code or whatever). And if you're working with a planet-scale distributed app, it just plain won't work.
Also 1 site update, or version number, could really be N releases until fruition -- which don't sound like traditional releases to me.
What he's saying is more about convention than writing code. For instance, instead of adding a column "abc" and doing:
foo.abc = 123;
they would do something like:
if (foo.abc) { foo.abc = 123; }
make sure all tests pass, and then migrate the db.
If you're asking about tools to migrate code, all popular languages have one. (I.e. django comes with one that's already really good).