isolated_database_service 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6f69d9eba61fc64b014c0f00bb85ab7e590a4f99
4
- data.tar.gz: 56232793ed16b8a5083c5c5a87ca469765743202
3
+ metadata.gz: 1e5fca6a1b29b5e97e554dfcf83370d07c23c784
4
+ data.tar.gz: 82e9c72fe4f16324ba99672f93371b7f2b4590c2
5
5
  SHA512:
6
- metadata.gz: 11ed5b0c6a2612d90c8affde99d991a5738b999eee3fbc9c87f7d41366447e1d051c16608491892ac16226908e2dae921f8cbfe4aa5d8e46fab447ba3de1f1a6
7
- data.tar.gz: d3ce9c37fa8524f9b91dfa53fe8d64773abc36cd85da26fb21ded84ba7cc6c28c1289a3f2bd573366b1b92bf725b6e556531b5a0789e22c7e70dd9f8108ad41a
6
+ metadata.gz: 468492c226c9d0cad72c812009872e978f509779085312ebff00bd0a29409e1ca8c968e61fd2063188e96914e25f87948fc885ff412958fe029099572a837510
7
+ data.tar.gz: f21529437f58dcfe91b516dcf0acfe95f162eb9e3e4fa76b04e14d5b82658a0e979160dc1fe6c639457b65b67dcdb88aae4eb6219301e5e08e71c8ace0e8cc2e
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- isolated_database_service (0.0.3)
4
+ isolated_database_service (0.0.4)
5
5
  isolated_server
6
6
  mysql2
7
7
  rack-parser
@@ -14,7 +14,7 @@ GEM
14
14
  backports (3.6.7)
15
15
  bump (0.5.3)
16
16
  diff-lcs (1.2.5)
17
- isolated_server (0.4.7)
17
+ isolated_server (0.4.9)
18
18
  multi_json (1.11.2)
19
19
  mysql2 (0.4.2)
20
20
  rack (1.6.4)
data/README.md CHANGED
@@ -164,3 +164,49 @@ curl -X DELETE http://localhost:9292/servers/2
164
164
  ```http
165
165
  204 No Content
166
166
  ```
167
+
168
+ ### Boot MySQL Cluster
169
+ `POST /mysql-clusters`
170
+
171
+ Creates a cluster of MySQL servers with a master, a slave and a chained slave server, with replication established.
172
+
173
+ The optional `initial_sql` property contains an array of SQL statements to execute on the master server before establishing replication.
174
+
175
+ #### Using curl
176
+
177
+ ```bash
178
+ curl -H "Content-Type: application/json" \
179
+ -d '{"cluster":{"initial_sql":[
180
+ "CREATE TABLE test.foo (id INT, value INT)"
181
+ "INSERT INTO test.foo VALUES (1, 2)"]}}' \
182
+ -X POST http://localhost:9000/mysql-clusters
183
+ ```
184
+
185
+ #### Example Response
186
+
187
+ ```http
188
+ 200 OK
189
+
190
+ {
191
+ "cluster": {
192
+ "master": {
193
+ "id": 1,
194
+ "port": 57959,
195
+ "up": true,
196
+ "type": "mysql"
197
+ },
198
+ "slave": {
199
+ "id": 2,
200
+ "port": 27702,
201
+ "up": true,
202
+ "type": "mysql"
203
+ },
204
+ "slave_2": {
205
+ "id": 3,
206
+ "port": 51111,
207
+ "up": true,
208
+ "type": "mysql"
209
+ }
210
+ }
211
+ }
212
+ ```
@@ -5,6 +5,7 @@ require 'json'
5
5
  require 'isolated_server'
6
6
  require 'isolated_server/mysql'
7
7
  require 'isolated_server/mongodb'
8
+ require 'isolated_database_service/boot_mysql_cluster'
8
9
 
9
10
  module IsolatedDatabaseService
10
11
  class ServerList
@@ -60,6 +61,24 @@ module IsolatedDatabaseService
60
61
  json :server => present_server(id, new_server)
61
62
  end
62
63
 
64
+ post '/mysql-clusters' do
65
+ halt(400) unless params[:cluster]
66
+
67
+ initial_sql = params[:cluster][:initial_sql] || []
68
+ mysql_master, mysql_slave, mysql_slave_2 = BootMysqlCluster::boot!(initial_sql)
69
+
70
+ mysql_master_id = servers.add_server(mysql_master)
71
+ mysql_slave_id = servers.add_server(mysql_slave)
72
+ mysql_slave_2_id = servers.add_server(mysql_slave_2)
73
+
74
+ status 201
75
+ json :cluster => {
76
+ master: present_server(mysql_master_id, mysql_master),
77
+ slave: present_server(mysql_slave_id, mysql_slave),
78
+ slave_2: present_server(mysql_slave_2_id, mysql_slave_2),
79
+ }
80
+ end
81
+
63
82
  get '/servers' do
64
83
  json :servers => servers.servers.map { |id, server| present_server(id, server) }
65
84
  end
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'isolated_server'
4
+ require 'isolated_server/mysql'
5
+
6
+ # This is based on https://github.com/osheroff/ar_mysql_flexmaster/blob/master/test/boot_mysql_env.rb
7
+ module BootMysqlCluster
8
+ def self.boot!(initial_sql = [])
9
+ mysql_master = nil
10
+ mysql_slave = nil
11
+ mysql_slave_2 = nil
12
+
13
+ threads = []
14
+ threads << Thread.new do
15
+ mysql_master = IsolatedServer::Mysql.new(allow_output: false)
16
+ mysql_master.boot!
17
+ end
18
+
19
+ threads << Thread.new do
20
+ mysql_slave = IsolatedServer::Mysql.new
21
+ mysql_slave.boot!
22
+ end
23
+
24
+ threads << Thread.new do
25
+ mysql_slave_2 = IsolatedServer::Mysql.new
26
+ mysql_slave_2.boot!
27
+ end
28
+
29
+ threads.each(&:join)
30
+
31
+ mysql_master.connection.query("CHANGE MASTER TO master_host='127.0.0.1', master_user='root', master_password=''")
32
+ mysql_slave.make_slave_of(mysql_master)
33
+ mysql_slave_2.make_slave_of(mysql_slave)
34
+
35
+ initial_sql.each do |sql|
36
+ mysql_master.connection.query(sql)
37
+ end
38
+ mysql_slave.set_rw(false)
39
+ mysql_slave_2.set_rw(false)
40
+
41
+ # let replication for the grants and such flow down. bleh.
42
+ repl_sync = false
43
+ while !repl_sync
44
+ repl_sync = [[mysql_master, mysql_slave], [mysql_slave, mysql_slave_2]].all? do |master, slave|
45
+ master_pos = master.connection.query("show master status").to_a.first["Position"]
46
+ slave.connection.query("show slave status").to_a.first["Exec_Master_Log_Pos"] == master_pos
47
+ end
48
+ sleep 1
49
+ end
50
+
51
+ [mysql_master, mysql_slave, mysql_slave_2]
52
+ end
53
+ end
@@ -1,3 +1,3 @@
1
1
  module IsolatedDatabaseService
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: isolated_database_service
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gary Grossman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-03 00:00:00.000000000 Z
11
+ date: 2015-12-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bump
@@ -156,6 +156,7 @@ files:
156
156
  - config.ru
157
157
  - isolated_database_service.gemspec
158
158
  - lib/isolated_database_service.rb
159
+ - lib/isolated_database_service/boot_mysql_cluster.rb
159
160
  - lib/isolated_database_service/version.rb
160
161
  - spec/isolated_service_spec.rb
161
162
  - spec/spec_helper.rb