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 +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
|