ey_cloud_server 1.4.47 → 1.4.49
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 -7
- data/features/support/env.rb +3 -3
- data/lib/ey-flex.rb +2 -3
- data/lib/ey-flex/snapshot_minder.rb +1 -1
- data/lib/ey_backup.rb +8 -2
- data/lib/ey_backup/backend.rb +1 -1
- data/lib/ey_backup/base.rb +1 -1
- data/lib/ey_backup/cli.rb +47 -19
- data/lib/ey_backup/database.rb +15 -1
- data/lib/ey_backup/dumper.rb +31 -3
- data/lib/ey_backup/engine.rb +3 -3
- data/lib/ey_backup/engines/mysql_engine.rb +49 -7
- data/lib/ey_backup/engines/postgresql_engine.rb +69 -21
- data/lib/ey_backup/logger.rb +54 -4
- data/lib/ey_backup/spawner.rb +31 -5
- data/lib/ey_cloud_server.rb +0 -1
- data/lib/ey_cloud_server/version.rb +1 -1
- data/spec/config.yml +11 -0
- data/spec/ey_backup/mysql_backups_spec.rb +11 -10
- data/spec/ey_backup/postgres_backups_spec.rb +9 -9
- data/spec/helpers.rb +16 -10
- data/spec/spec_helper.rb +1 -2
- metadata +126 -141
- data/bin/binary_log_purge +0 -263
- data/bin/clear_binlogs_from_slave +0 -7
- data/bin/ey-agent +0 -5
- data/bin/mysql_start +0 -6
- data/lib/ey-flex/big-brother.rb +0 -80
- data/lib/ey_cloud_server/mysql_start.rb +0 -155
- data/spec/big-brother_spec.rb +0 -12
data/bin/ey-agent
DELETED
data/bin/mysql_start
DELETED
data/lib/ey-flex/big-brother.rb
DELETED
@@ -1,80 +0,0 @@
|
|
1
|
-
module EY
|
2
|
-
class BigBrother
|
3
|
-
def self.check(chef_dna = '/etc/chef/dna.json')
|
4
|
-
json = JSON.parse(File.read(chef_dna))
|
5
|
-
|
6
|
-
# {'skip':[
|
7
|
-
# 'mysqld'
|
8
|
-
# ],
|
9
|
-
# 'check':[
|
10
|
-
# 'ttsrv'
|
11
|
-
# ]}
|
12
|
-
|
13
|
-
skips = JSON.parse(File.read('/etc/ey-alerts.json')) rescue {}
|
14
|
-
|
15
|
-
new(json.merge(skips)).check
|
16
|
-
end
|
17
|
-
|
18
|
-
def initialize(dna)
|
19
|
-
@dna = dna
|
20
|
-
@result = {}
|
21
|
-
end
|
22
|
-
|
23
|
-
def nginx_or_apache
|
24
|
-
server = ''
|
25
|
-
@dna['applications'].each do |name, app_data|
|
26
|
-
if app_data['recipes'].detect { |r| r == 'nginx' }
|
27
|
-
server = 'nginx'
|
28
|
-
end
|
29
|
-
|
30
|
-
if app_data['recipes'].detect { |r| r == 'passenger' }
|
31
|
-
server = 'apache2'
|
32
|
-
end
|
33
|
-
end
|
34
|
-
server
|
35
|
-
end
|
36
|
-
|
37
|
-
def skip?(name)
|
38
|
-
(@dna['skip']||[]).include?(name)
|
39
|
-
end
|
40
|
-
|
41
|
-
def check
|
42
|
-
case @dna['instance_role']
|
43
|
-
when 'solo'
|
44
|
-
check_process(nginx_or_apache) unless skip?(nginx_or_apache)
|
45
|
-
check_mysql unless skip?('mysqld')
|
46
|
-
when 'app', 'app_master'
|
47
|
-
check_process(nginx_or_apache) unless skip?(nginx_or_apache)
|
48
|
-
check_process('haproxy') unless skip?('haproxy')
|
49
|
-
when 'db_master', 'db_slave'
|
50
|
-
check_mysql unless skip?('mysqld')
|
51
|
-
when 'util'
|
52
|
-
end
|
53
|
-
(@dna['check']||[]).each do |check|
|
54
|
-
check_process(check)
|
55
|
-
end
|
56
|
-
@result.to_json
|
57
|
-
end
|
58
|
-
|
59
|
-
def check_mysql
|
60
|
-
check_process('mysqld')
|
61
|
-
DBI.connect("DBI:Mysql:mysql:#{@dna['db_host']}", 'root', @dna['users'].first['password'])
|
62
|
-
rescue DBI::DatabaseError => e
|
63
|
-
@result['mysqld'] = 'down'
|
64
|
-
end
|
65
|
-
|
66
|
-
def check_process(name)
|
67
|
-
return if name == ''
|
68
|
-
pids = `pgrep #{name}`.split("\n")
|
69
|
-
if pids.empty?
|
70
|
-
@result[name] = 'down'
|
71
|
-
else
|
72
|
-
if pids.detect {|p| `kill -0 #{p}; echo $?`.chomp.to_i != 0}
|
73
|
-
@result[name] = 'down'
|
74
|
-
else
|
75
|
-
@result[name] = 'up'
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
@@ -1,155 +0,0 @@
|
|
1
|
-
module EY
|
2
|
-
module CloudServer
|
3
|
-
class MysqlStart
|
4
|
-
def self.run(argv = ARGV, options = {})
|
5
|
-
options = parse(argv, options)
|
6
|
-
new(options).run
|
7
|
-
end
|
8
|
-
|
9
|
-
attr_accessor :password, :check, :start_timeout, :stop_timeout
|
10
|
-
|
11
|
-
def initialize(options = {})
|
12
|
-
@password = options[:password] || abort("ERROR: You must provide a password.")
|
13
|
-
@check = options[:check] || abort("ERROR: You must a check interval.")
|
14
|
-
@start_timeout = options[:start_timeout] || abort("ERROR: You must provide a start timeout.")
|
15
|
-
@stop_timeout = options[:stop_timeout] || 1200
|
16
|
-
|
17
|
-
abort("ERROR: You must be root.") unless Process.euid == 0
|
18
|
-
end
|
19
|
-
|
20
|
-
def run
|
21
|
-
count = 0
|
22
|
-
if system('/etc/init.d/mysql restart')
|
23
|
-
mysql_started()
|
24
|
-
else
|
25
|
-
log_mysql_event("MySQL did not start within the startup timeout")
|
26
|
-
loop {
|
27
|
-
# test to make sure mysql is running
|
28
|
-
if mysql_running()
|
29
|
-
log_mysql_event("MySQL did start and is working through crash recovery")
|
30
|
-
slept = 0
|
31
|
-
loop {
|
32
|
-
if system("mysqladmin -p#{password} status") # mysql is accessible
|
33
|
-
log_mysql_event("MySQL completed crash recovery, performing clean restart")
|
34
|
-
system('killall -TERM mysqld') # safe shutdown of mysql
|
35
|
-
termslept = 0
|
36
|
-
termlimit = stop_timeout
|
37
|
-
loop {
|
38
|
-
break if not mysql_running()
|
39
|
-
sleep(check)
|
40
|
-
termslept = termslept + check
|
41
|
-
if termslept > termlimit
|
42
|
-
log_mysql_event("MySQL did not shut down cleanly within the time limit, killing")
|
43
|
-
system('killall -9 mysqld')
|
44
|
-
end
|
45
|
-
}
|
46
|
-
system('/etc/init.d/mysql zap') # clear files
|
47
|
-
if system('/etc/init.d/mysql restart') # clean start
|
48
|
-
mysql_started()
|
49
|
-
end
|
50
|
-
else
|
51
|
-
log_mysql_event("MySQL has been starting for #{slept/60} minutes and is still attempting to start") if slept % 120 == 0
|
52
|
-
sleep(check)
|
53
|
-
end
|
54
|
-
break if not mysql_running()
|
55
|
-
slept = slept + check
|
56
|
-
if slept > start_timeout
|
57
|
-
log_mysql_event("MySQL was not able to start after #{slept/60} minutes and was forcibly killed")
|
58
|
-
system("killall -9 mysqld")
|
59
|
-
end
|
60
|
-
}
|
61
|
-
else
|
62
|
-
log_mysql_event("MySQL did not start, zapping")
|
63
|
-
begin
|
64
|
-
pidfile = '/var/run/mysqld/mysqld.pid'
|
65
|
-
if File.exists?(pidfile)
|
66
|
-
File.open('/var/run/mysqld/mysqld.pid', 'r') do |f|
|
67
|
-
pid = f.read.to_i
|
68
|
-
Process.kill("TERM", pid)
|
69
|
-
|
70
|
-
mysqld_is_dead = false
|
71
|
-
started_at = Time.now
|
72
|
-
# /etc/init.d/mysql has 120 as STOPTIMEOUT, so we should
|
73
|
-
# wait at least that long
|
74
|
-
until mysqld_is_dead || ((Time.now - started_at) > 120)
|
75
|
-
begin
|
76
|
-
Process.kill(0, pid)
|
77
|
-
sleep 1
|
78
|
-
rescue Errno::ESRCH # no such process
|
79
|
-
mysqld_is_dead = true
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
rescue Exception => e
|
85
|
-
File.open('/root/chef-mysql.log', 'a') do |f|
|
86
|
-
f.write("Blew up: \n")
|
87
|
-
f.write(e.message)
|
88
|
-
f.write("\n")
|
89
|
-
f.write(e.backtrace.join("\t\n"))
|
90
|
-
end
|
91
|
-
end
|
92
|
-
system('/etc/init.d/mysql zap')
|
93
|
-
if system('/etc/init.d/mysql restart')
|
94
|
-
mysql_started()
|
95
|
-
end
|
96
|
-
end
|
97
|
-
count += 1
|
98
|
-
if count > 10
|
99
|
-
log_mysql_event("Failed to start mysql after 10 attempts, raising error.")
|
100
|
-
exit(1)
|
101
|
-
end
|
102
|
-
sleep 1
|
103
|
-
}
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
def log_mysql_event(message)
|
108
|
-
`echo #{message} >> /root/chef-mysql.log`
|
109
|
-
end
|
110
|
-
|
111
|
-
def mysql_started()
|
112
|
-
log_mysql_event("MySQL restarted successfully")
|
113
|
-
exit 0
|
114
|
-
end
|
115
|
-
|
116
|
-
def mysql_running()
|
117
|
-
system("ps -u mysql | grep '[m]ysqld'")
|
118
|
-
end
|
119
|
-
|
120
|
-
def self.parse(argv, options = {})
|
121
|
-
opts = OptionParser.new do |opts|
|
122
|
-
opts.version = VERSION
|
123
|
-
|
124
|
-
opts.banner = "Usage: mysql_start [-flag]"
|
125
|
-
opts.define_head "mysql_start: start, recover, zap, or otherwise pound mysql into submission."
|
126
|
-
opts.separator '*'*80
|
127
|
-
|
128
|
-
opts.on("-p", "--password PASSWORD", "Root password for mysqladmin.") do |password|
|
129
|
-
options[:password] = password
|
130
|
-
end
|
131
|
-
|
132
|
-
opts.on("-c", "--check NUMBER", "Check mysql interval in seconds.") do |check|
|
133
|
-
options[:check] = check.to_i
|
134
|
-
end
|
135
|
-
|
136
|
-
opts.on("-t", "--timeout NUMBER", "Maximum wait time in seconds. (DEPRECATED)") do |start_timeout|
|
137
|
-
options[:start_timeout] = start_timeout.to_i
|
138
|
-
end
|
139
|
-
|
140
|
-
opts.on("-a", "--start NUMBER", "Startup timeout in seconds.") do |start_timeout|
|
141
|
-
options[:start_timeout] = start_timeout.to_i
|
142
|
-
end
|
143
|
-
|
144
|
-
opts.on("-o", "--stop NUMBER", "Graceful termination timeout in seconds.") do |stop_timeout|
|
145
|
-
options[:stop_timeout] = stop_timeout.to_i
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
|
-
opts.parse!(argv)
|
150
|
-
|
151
|
-
options
|
152
|
-
end
|
153
|
-
end
|
154
|
-
end
|
155
|
-
end
|
data/spec/big-brother_spec.rb
DELETED