isolated_database_service 0.0.3 → 0.0.4
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 +4 -4
- data/Gemfile.lock +2 -2
- data/README.md +46 -0
- data/lib/isolated_database_service.rb +19 -0
- data/lib/isolated_database_service/boot_mysql_cluster.rb +53 -0
- data/lib/isolated_database_service/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1e5fca6a1b29b5e97e554dfcf83370d07c23c784
|
4
|
+
data.tar.gz: 82e9c72fe4f16324ba99672f93371b7f2b4590c2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
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.
|
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
|
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.
|
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-
|
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
|