proxysqlweightlifter 0.1.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 +7 -0
- data/bin/proxysqlweightlifter +4 -0
- data/lib/proxysqlweightlifter.rb +21 -0
- data/lib/proxysqlweightlifter/lift.rb +86 -0
- data/lib/proxysqlweightlifter/version.rb +3 -0
- metadata +108 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 4083bbfbafb2c33b3237ab1344346b3a8c38c2f1855a618226c6bf037ff008d8
|
4
|
+
data.tar.gz: 0d090098060d10351ca4f06b935ee6332848dd9412863be9072920000268a574
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 03d8850273413d02f80c9b364dc9bb40f87ce5f4d439c134fdf0ebb4e1d85bca979d27f74e7f6c91e718ae9f8f4ea7f82a6ec9a208a0b3c7ce7d4bc1c01fd9a3
|
7
|
+
data.tar.gz: 260ec3a0299528edd9a8c121728464e6d3dddff2d0904bb29def9c4411bc85eb79f949c907c22fadc16bc51990d72cba26b9bebc28d27ed4be5acac99bbe314b
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'mysql2'
|
2
|
+
require "proxysqlweightlifter/version"
|
3
|
+
require "proxysqlweightlifter/lift"
|
4
|
+
|
5
|
+
module Proxysqlweightlifter
|
6
|
+
class Error < StandardError; end
|
7
|
+
|
8
|
+
def self.run(argv)
|
9
|
+
host, port, user, pass, weight = argv
|
10
|
+
Lift.new(
|
11
|
+
Mysql2::Client.new(
|
12
|
+
host: host,
|
13
|
+
port: port,
|
14
|
+
username: user,
|
15
|
+
password: pass,
|
16
|
+
database: 'main'
|
17
|
+
),
|
18
|
+
weight || 9
|
19
|
+
).run
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module Proxysqlweightlifter
|
2
|
+
# Lift is responsible for resolving current slaves from
|
3
|
+
# mysql_replication_hostgroups table
|
4
|
+
class Lift
|
5
|
+
attr_reader :db, :weight
|
6
|
+
|
7
|
+
def initialize(database, weight = 10)
|
8
|
+
@db = database
|
9
|
+
@weight = weight
|
10
|
+
end
|
11
|
+
|
12
|
+
def run
|
13
|
+
# We reset all weights to 1 because during runs of
|
14
|
+
# lift master might have switched
|
15
|
+
reset_weight
|
16
|
+
|
17
|
+
hostgroups.each do |hostgroup|
|
18
|
+
find_slaves(hostgroup).map do |slave|
|
19
|
+
slave.delete(:weight)
|
20
|
+
update_weight(slave)
|
21
|
+
end
|
22
|
+
|
23
|
+
debug find_slaves(hostgroup)
|
24
|
+
end
|
25
|
+
|
26
|
+
begin
|
27
|
+
db.query('LOAD MYSQL SERVERS TO RUNTIME;')
|
28
|
+
rescue => e
|
29
|
+
puts "LOAD MYSQL SERVERS TO RUNTIME error #{e}"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def hostgroups
|
34
|
+
db.query(%(
|
35
|
+
SELECT writer_hostgroup,reader_hostgroup
|
36
|
+
FROM mysql_replication_hostgroups;
|
37
|
+
)).map { |slave| Hash[slave.map{|(k,v)| [k.to_sym,v]}] }
|
38
|
+
end
|
39
|
+
|
40
|
+
def find_master(writer_hostgroup)
|
41
|
+
master = db.query(%(
|
42
|
+
SELECT hostname
|
43
|
+
FROM mysql_servers
|
44
|
+
WHERE hostgroup_id IN (#{writer_hostgroup});
|
45
|
+
))
|
46
|
+
if master.size > 1
|
47
|
+
raise "More than 1 `writer` #{master} found in #{writer_hostgroup}"
|
48
|
+
end
|
49
|
+
master.map { |m| m['hostname'] }
|
50
|
+
end
|
51
|
+
|
52
|
+
def find_slaves(writer_hostgroup:, reader_hostgroup:)
|
53
|
+
master = find_master(writer_hostgroup)
|
54
|
+
master_ip = master.first
|
55
|
+
|
56
|
+
slaves = db.query(%(
|
57
|
+
SELECT hostgroup_id, hostname, port, weight
|
58
|
+
FROM mysql_servers
|
59
|
+
WHERE hostgroup_id IN (#{writer_hostgroup}, #{reader_hostgroup}) AND hostname != "#{master_ip}";
|
60
|
+
))
|
61
|
+
if slaves.size.zero?
|
62
|
+
debug "No readers #{slaves} found in hostgroup `writer` #{writer_hostgroup} `reader` #{reader_hostgroup}"
|
63
|
+
end
|
64
|
+
slaves.map { |slave| Hash[slave.map{|(k,v)| [k.to_sym,v]}] }
|
65
|
+
end
|
66
|
+
|
67
|
+
def reset_weight(weight = 1)
|
68
|
+
db.query("UPDATE mysql_servers SET weight = #{weight};")
|
69
|
+
end
|
70
|
+
|
71
|
+
def update_weight(hostname:, port:, hostgroup_id:)
|
72
|
+
db.query(%(
|
73
|
+
UPDATE mysql_servers
|
74
|
+
SET weight = #{weight || 1}
|
75
|
+
WHERE hostname = "#{hostname}" AND port = "#{port}" AND hostgroup_id = "#{hostgroup_id}";
|
76
|
+
))
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
def debug(s)
|
82
|
+
return
|
83
|
+
puts s
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
metadata
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: proxysqlweightlifter
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ernestas Poskus
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-11-12 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: mysql2
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.5.2
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.5.2
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.17'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.17'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '10.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '10.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.0'
|
69
|
+
description: ProxySQL mysql_servers table automatic weight lifter for reader hosts
|
70
|
+
email:
|
71
|
+
- ernestas@vinted.com
|
72
|
+
executables:
|
73
|
+
- proxysqlweightlifter
|
74
|
+
extensions: []
|
75
|
+
extra_rdoc_files: []
|
76
|
+
files:
|
77
|
+
- bin/proxysqlweightlifter
|
78
|
+
- lib/proxysqlweightlifter.rb
|
79
|
+
- lib/proxysqlweightlifter/lift.rb
|
80
|
+
- lib/proxysqlweightlifter/version.rb
|
81
|
+
homepage: https://github.com/vinted/proxysqlweightlifter
|
82
|
+
licenses:
|
83
|
+
- MIT
|
84
|
+
metadata:
|
85
|
+
homepage_uri: https://github.com/vinted/proxysqlweightlifter
|
86
|
+
source_code_uri: https://github.com/vinted/proxysqlweightlifter
|
87
|
+
changelog_uri: https://github.com/vinted/proxysqlweightlifter/
|
88
|
+
post_install_message:
|
89
|
+
rdoc_options: []
|
90
|
+
require_paths:
|
91
|
+
- lib
|
92
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
98
|
+
requirements:
|
99
|
+
- - ">="
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
requirements: []
|
103
|
+
rubyforge_project:
|
104
|
+
rubygems_version: 2.7.6
|
105
|
+
signing_key:
|
106
|
+
specification_version: 4
|
107
|
+
summary: ProxySQL mysql_servers table automatic weight lifter for reader hosts
|
108
|
+
test_files: []
|