galera_cluster_migrations 0.0.1.alpha1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e24f85effe38b4e4fc180c833284be6fefab16d5
4
- data.tar.gz: 216ac2decfb6691d8f78f6a55a0eba7e9158e275
3
+ metadata.gz: 1bc341370d48d39e1ebca83c4d827958921b7111
4
+ data.tar.gz: 48a1e9f27c5d19d359652db69647a62a0416565c
5
5
  SHA512:
6
- metadata.gz: f784f267d056c4db43a3aede6245d94034761bf91234a6bbd118830ed6e2ec00da82bf6d0b6e5f5f97b60b9c622a70ae0a0ab8fdde66a1c97d5a79ce7daeaaf4
7
- data.tar.gz: 5e76db6a96bf068af0529d4a0b3c2e4c0c1419f2f2d3d9fc7a9eaf06cd4860187a13e422f3a4a8aa98dcf1545afcbd4cafd9f3fd81ed333bcc85ff6724fab4eb
6
+ metadata.gz: ba9b5b5cb6fc36e458280263a296fa242575039c9d9e8f2d35f2c70086af4d5b01ba5a92379be8e4de65fc3515ec46d6ba7d7b6a7c5cd0e349a59e4fc169e060
7
+ data.tar.gz: 9ff4efb41bedd16edba5bd8c5feda733aa8a18fdacd982cf69f40a52e3bc74fd65744fff874d09b90565889b2730509c0fac18666e910cc38abb05939276c13d
data/README.md CHANGED
@@ -1,6 +1,47 @@
1
1
  # GaleraClusterMigrations
2
2
 
3
- TODO: Write a gem description
3
+ GaleraClusterMigrations helps to alleviate some of the woes of executing Rails
4
+ database migrations with [Galera Cluster](http://galeracluster.com). Galera
5
+ Cluster provides two options for executing DDL (Data Definition Language)
6
+ statements: Total Order Isolation (TOI) and Rolling Schema Upgrade (RSU).
7
+ Each has its advantages and disadvantages, but once your database reaches a
8
+ certain size you must start considering RSU for modifications on large tables.
9
+
10
+ ## Total Order Isolation (TOI)
11
+
12
+ TOI is the default DDL replication method in Galera Cluster. When the master
13
+ node receives a DDL statement it sends out a replication event before starting
14
+ the DDL processing. Every node in the cluster will processs the replicated DDL
15
+ statement during the same "slot" in the cluster transaction stream. This
16
+ ensures that every node in the cluster will process the schema change at the
17
+ same time.
18
+
19
+ With this guarantee you don't have to worry about schema backwards
20
+ compatibility, but there are some drawbacks. The strict commit order will make
21
+ every transaction wait until DDL processing is over. Meaning that altering a
22
+ table will block any queries that are trying to access that table. For a table
23
+ with a large number or rows, altering a table or adding an index could take
24
+ several minutes, or longer, during which the table cannot be queried.
25
+
26
+ ## Rolling Schema Upgrade (RSU)
27
+
28
+ To allow the rest of the cluster to continue operating at full speed Galera
29
+ Cluster offers the RSU method for DDL statements. During RSU the node executing
30
+ a DDL statement is desynchronized from replication for the duration of the DDL
31
+ processing. All incoming replication events are buffered and the node will not
32
+ send replication events to the other nodes in the cluster. When DDL processing
33
+ is over, the node will automatically join back into the cluster and process
34
+ missed transactions from the buffer. Once the node has rejoined and caught up
35
+ with the rest of the cluster, you must repeat the DDL statements on the next
36
+ node in the cluster.
37
+
38
+ The RSU method will not slow down the cluster; all other transactions can
39
+ complete at full speed on the two synced nodes. However, there are caveats that
40
+ must be considered when using RSU. The entire session will be processed with
41
+ RSU (i.e. any insert statements will not be replicated to the other nodes).
42
+ Second, upgrading the schema on all nodes is a manual operation. As a result
43
+ the schema changes must be backward compatible since queries will be processed
44
+ against and replicated to upgraded and non-upgraded nodes.
4
45
 
5
46
  ## Installation
6
47
 
@@ -18,7 +59,66 @@ Or install it yourself as:
18
59
 
19
60
  ## Usage
20
61
 
21
- TODO: Write usage instructions here
62
+ GaleraClusterMigrations contains 3 components:
63
+
64
+ 1. An ActiveSupport concern that should be included in your database migrations,
65
+ 2. A rake task for performing database migrations on a single cluster node,
66
+ 3. And a capistrano task for remotely executing the rake task.
67
+
68
+ ### To Use RSU within a Migration
69
+
70
+ The `GaleraClusterMigrations` ActiveSupport concern contains methods to enable
71
+ RSU and TOI. The `#with_rsu` method is the recommended way to run migrations
72
+ with RSU. It accepts a block and will enable RSU for the duration of the block
73
+ and then re-enable TOI.
74
+
75
+ The first step is to include the `GaleraClusterMigrations` module in your
76
+ migration and use the `#with_rsu` method to enable RSU for DDL statements
77
+ specified inside a block:
78
+
79
+ # db/migrate/20140710000000_add_foo_to_bars.rb
80
+ class AddFooToBars < ActiveRecord::Migration
81
+ include GaleraClusterMigrations
82
+
83
+ def change
84
+ with_rsu do
85
+ add_column :bars, :foo, :integer, default: 0
86
+ end
87
+ end
88
+ end
89
+
90
+ The `add_column` statement above will be executed in RSU mode when the migration
91
+ is run.
92
+
93
+ If you are using Capistrano, require `galera_cluster_migrations/capistrano` in
94
+ your `config/deploy.rb` file and use the `galera:migrate` task to run the
95
+ migration on each node:
96
+
97
+ # config/deploy.rb
98
+ ...
99
+ require 'galera_cluster_migrations/capistrano'
100
+ ...
101
+
102
+ You should also disable the default `deploy:migrate` task from running during
103
+ a deploy. Once the migration has been deployed to your cluster, execute the
104
+ migration on each node checking that the entire cluster is in the *Synced*
105
+ state before proceeding with the next node. Be sure to use the `HOSTFILTER`
106
+ option to specify a single node to migrate at a time.
107
+
108
+ $ cap production galera:migrate HOSTFILTER=db1.example.com
109
+ # check that db1 has rejoined the cluster and is Synced
110
+ $ cap production galera:migrate HOSTFILTER=db2.example.com
111
+ # check that db2 has rejoined the cluster and is Synced
112
+ $ cap production galera:migrate HOSTFILTER=db3.example.com
113
+ # check that db3 has rejoined the cluster and is Synced
114
+
115
+ You have now successfully upgraded the schema on every database node using
116
+ RSU! During this time the two nodes not processing the migration will be
117
+ available to process queries at full speed.
118
+
119
+ For migrations that you want to run using TOI there is nothing special required
120
+ to migrate the database. Write the database migration as you normally would and
121
+ migrate the database with `cap production deploy:migrate`.
22
122
 
23
123
  ## Contributing
24
124
 
@@ -7,7 +7,7 @@ module GaleraClusterMigrations
7
7
  require 'galera_cluster_migrations/railtie' if defined?(Rails)
8
8
 
9
9
  included do
10
- def set_db_to_rsu
10
+ def enable_rsu
11
11
  say "Setting wsrep_OSU_method to RSU"
12
12
  unless [:development, :test].include?(Rails.env)
13
13
  execute "SET GLOBAL wsrep_OSU_method=RSU"
@@ -29,7 +29,7 @@ module GaleraClusterMigrations
29
29
  end
30
30
  end
31
31
 
32
- def set_db_to_toi
32
+ def enable_toi
33
33
  say "Setting wsrep_OSU_method to TOI"
34
34
  unless [:development, :test].include?(Rails.env)
35
35
  execute "SET GLOBAL wsrep_OSU_method=TOI"
@@ -9,10 +9,6 @@ module GaleraClusterMigrations
9
9
  def self.load_into(capistrano_config)
10
10
  capistrano_config.load do
11
11
 
12
- before(Capistrano::TASKS) do
13
- Config.load(self)
14
- end
15
-
16
12
  namespace :galera do
17
13
  desc <<-DESC
18
14
  Run the migrate rake task. By default, it runs this in most recently \
@@ -1,3 +1,3 @@
1
1
  module GaleraClusterMigrations
2
- VERSION = "0.0.1.alpha1"
2
+ VERSION = "1.0.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: galera_cluster_migrations
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.alpha1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bryan Traywick
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-03 00:00:00.000000000 Z
11
+ date: 2014-07-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -99,9 +99,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
99
99
  version: '0'
100
100
  required_rubygems_version: !ruby/object:Gem::Requirement
101
101
  requirements:
102
- - - '>'
102
+ - - '>='
103
103
  - !ruby/object:Gem::Version
104
- version: 1.3.1
104
+ version: '0'
105
105
  requirements: []
106
106
  rubyforge_project:
107
107
  rubygems_version: 2.2.2