reptile 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/Rakefile +16 -17
- data/VERSION +1 -0
- data/lib/reptile.rb +1 -8
- data/lib/reptile/delta_monitor.rb +5 -1
- data/lib/reptile/heartbeat.rb +1 -1
- data/replication.yml.sample +39 -0
- data/webgen_site/metainfo.yaml +12 -0
- data/webgen_site/src/about.page +12 -0
- data/webgen_site/src/config.yaml +0 -0
- data/webgen_site/src/default.css +290 -0
- data/webgen_site/src/default.template +73 -0
- data/webgen_site/src/download.page +9 -0
- data/webgen_site/src/features.page +67 -0
- data/webgen_site/src/images/bg.gif +0 -0
- data/webgen_site/src/images/frog.jpg +0 -0
- data/webgen_site/src/images/front.jpg +0 -0
- data/webgen_site/src/images/menubg.gif +0 -0
- data/webgen_site/src/images/menubg2.gif +0 -0
- data/webgen_site/src/index.page +13 -0
- data/webgen_site/src/news/reptile_moved_to_github.template +7 -0
- data/webgen_site/src/news/reptiles_on_rubyforge.page +9 -0
- data/webgen_site/src/news/reptiles_released_as_a_gem.page +9 -0
- data/webgen_site/src/setup.page +23 -0
- data/webgen_site/src/terms/heartbeat.page +19 -0
- metadata +36 -20
data/.gitignore
ADDED
data/Rakefile
CHANGED
@@ -2,23 +2,22 @@ require 'rubygems' unless ENV['NO_RUBYGEMS']
|
|
2
2
|
%w[rake rake/clean fileutils newgem rubigen].each { |f| require f }
|
3
3
|
require File.dirname(__FILE__) + '/lib/reptile'
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
p.rsync_args = '-av --delete --ignore-errors'
|
5
|
+
begin
|
6
|
+
require 'jeweler'
|
7
|
+
Jeweler::Tasks.new do |gem|
|
8
|
+
gem.name = "reptile"
|
9
|
+
gem.summary = %Q{Cold blooded mysql replication monitoring.}
|
10
|
+
gem.description = %Q{Cold blooded mysql replication monitoring.}
|
11
|
+
gem.email = "nick.stielau@gmail.com"
|
12
|
+
gem.homepage = "http://reptile.rubyforge.org/"
|
13
|
+
gem.authors = ["Nick Stielau"]
|
14
|
+
gem.add_runtime_dependency 'tlsmail', '>= 0'
|
15
|
+
gem.add_runtime_dependency 'activerecord', '>= 0'
|
16
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
17
|
+
end
|
18
|
+
Jeweler::GemcutterTasks.new
|
19
|
+
rescue LoadError
|
20
|
+
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
22
21
|
end
|
23
22
|
|
24
23
|
desc "Upload current documentation to Rubyforge"
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.5
|
data/lib/reptile.rb
CHANGED
@@ -7,17 +7,10 @@ require 'rubygems'
|
|
7
7
|
require 'tlsmail'
|
8
8
|
require 'net/smtp'
|
9
9
|
|
10
|
-
|
11
10
|
require 'reptile/heartbeat'
|
12
11
|
require 'reptile/delta_monitor'
|
13
12
|
require 'reptile/replication_monitor'
|
14
13
|
require 'reptile/status'
|
15
14
|
require 'reptile/runner'
|
16
15
|
require 'reptile/users'
|
17
|
-
require 'reptile/databases'
|
18
|
-
|
19
|
-
require 'active_record'
|
20
|
-
|
21
|
-
module Reptile
|
22
|
-
VERSION = '0.0.4'
|
23
|
-
end
|
16
|
+
require 'reptile/databases'
|
@@ -37,7 +37,11 @@ module Reptile
|
|
37
37
|
master_counts = get_table_counts
|
38
38
|
|
39
39
|
deltas= {}
|
40
|
-
master_counts.each do |table, master_count|
|
40
|
+
master_counts.each do |table, master_count|
|
41
|
+
if slave_counts[table].nil?
|
42
|
+
puts "Table '#{table}' exists on master but not on slave."
|
43
|
+
next
|
44
|
+
end
|
41
45
|
delta = master_count.first.to_i - slave_counts[table].first.to_i
|
42
46
|
deltas[table] = delta
|
43
47
|
end
|
data/lib/reptile/heartbeat.rb
CHANGED
@@ -0,0 +1,39 @@
|
|
1
|
+
config:
|
2
|
+
heartbeart_threshold: 10
|
3
|
+
delay_threshold_secs: 360
|
4
|
+
row_difference_threshold: 10
|
5
|
+
|
6
|
+
# You can also set username/passwords here,
|
7
|
+
# so you don't have to repeat them.
|
8
|
+
#
|
9
|
+
# users:
|
10
|
+
# ro_user:
|
11
|
+
# username: ro_user
|
12
|
+
# password: secret
|
13
|
+
# heartbeat_user:
|
14
|
+
# username: heartbeat_user
|
15
|
+
# password: secret
|
16
|
+
# replication_user:
|
17
|
+
# username: repl_user
|
18
|
+
# password: secret
|
19
|
+
|
20
|
+
|
21
|
+
database_01:
|
22
|
+
master:
|
23
|
+
password: test_pass
|
24
|
+
username: read_only_user
|
25
|
+
adapter: mysql
|
26
|
+
database: db01
|
27
|
+
host: db1.somehost.com
|
28
|
+
port: 3306
|
29
|
+
socket: /tmp/mysql.sock
|
30
|
+
|
31
|
+
slave:
|
32
|
+
password: test_pass
|
33
|
+
username: read_only_user
|
34
|
+
adapter: mysql
|
35
|
+
database: db01
|
36
|
+
host: localhost
|
37
|
+
port: 3307
|
38
|
+
socket: /var/lib/mysql/db01.sock
|
39
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
---
|
2
|
+
title: About
|
3
|
+
inMenu: true
|
4
|
+
orderInfo: 10
|
5
|
+
---
|
6
|
+
h2. About Reptile
|
7
|
+
|
8
|
+
Reptile is an easy to use utility that will monitor your MySQL replication, so you can forget about it and focus on the good stuff.
|
9
|
+
|
10
|
+
h2. About the Author
|
11
|
+
|
12
|
+
The author is just trying to get by. Hit me up at nick.stielau_at_gmail.com if you have any questions, ideas or you actually want to use this thing.
|
File without changes
|
@@ -0,0 +1,290 @@
|
|
1
|
+
/* andreas00 - an open source xhtml/css website layout by Andreas Viklund - http://andreasviklund.com . Free to use for any purpose as long as the proper credits are given to the original author.
|
2
|
+
Version: 1.1 (Apr 20, 2006) */
|
3
|
+
|
4
|
+
/***** Body and main container *****/
|
5
|
+
|
6
|
+
body {
|
7
|
+
margin:0 auto;padding:0;font:76% Verdana,Tahoma,Arial,sans-serif;background:#eaeaea url(images/bg.gif) top center repeat-y;color:#3a3a3a;
|
8
|
+
}
|
9
|
+
|
10
|
+
#wrap {
|
11
|
+
background-color:#ffffff;color:#303030;margin:0 auto;padding:1px 5px;width:760px;
|
12
|
+
}
|
13
|
+
|
14
|
+
/***** Header *****/
|
15
|
+
|
16
|
+
#header {
|
17
|
+
color:#505050;background:#000000 url(images/front.jpg) bottom right no-repeat;height:250px;margin:0 0 10px 0;padding:0;
|
18
|
+
}
|
19
|
+
|
20
|
+
#header h1 {
|
21
|
+
font-size:2.5em;font-weight:normal;letter-spacing:-2px;margin:0 0 4px 15px;padding:15px 0 0 0;
|
22
|
+
}
|
23
|
+
|
24
|
+
#header h1 a,#header h1 a:hover {
|
25
|
+
padding:0;
|
26
|
+
}
|
27
|
+
|
28
|
+
#header p {
|
29
|
+
font-size:1.1em;letter-spacing:-1px;margin:0 0 20px 15px;padding:0 0 0 3px;
|
30
|
+
}
|
31
|
+
|
32
|
+
/***** Left sidebar *****/
|
33
|
+
|
34
|
+
#avmenu {
|
35
|
+
clear:left;float:left;width:150px;margin:0 0 10px 0;padding:0;
|
36
|
+
}
|
37
|
+
|
38
|
+
#avmenu ul {
|
39
|
+
list-style:none;width:150px;margin:0 0 20px 0;padding:0;
|
40
|
+
}
|
41
|
+
|
42
|
+
#avmenu li {
|
43
|
+
margin-bottom:5px;
|
44
|
+
}
|
45
|
+
|
46
|
+
#avmenu li a, #avmenu li span {
|
47
|
+
font-weight:bold;height:20px;text-decoration:none;color:#505050;display:block;padding:6px 0 0 10px;background:#f4f4f4 url(images/menubg.gif) bottom left repeat-x;border-top:1px solid #d8d8d8;border-right:1px solid #d8d8d8;border-bottom:1px solid #d8d8d8;border-left:4px solid #cccccc;
|
48
|
+
}
|
49
|
+
|
50
|
+
#avmenu li a:hover, #avmenu li a.current, #avmenu li.webgen-menu-item-selected a, #avmenu li.webgen-menu-item-selected span {
|
51
|
+
background:#eaeaea url(images/menubg2.gif) bottom left repeat-x;color:#505050;border-top:1px solid #b0b0b0;border-right:1px solid #b0b0b0;border-bottom:1px solid #b0b0b0;border-left:4px solid #505050;
|
52
|
+
}
|
53
|
+
|
54
|
+
#avmenu ul ul {
|
55
|
+
margin:5px 0 5px 15px;font-size:0.9em;width:135px;
|
56
|
+
}
|
57
|
+
|
58
|
+
#avmenu ul ul a {
|
59
|
+
height:16px;margin:0;padding:4px 0 0 8px;
|
60
|
+
}
|
61
|
+
|
62
|
+
#avmenu h2 {
|
63
|
+
font-size:1.5em;font-weight:normal;
|
64
|
+
}
|
65
|
+
|
66
|
+
/***** Right sidebar *****/
|
67
|
+
|
68
|
+
#extras {
|
69
|
+
float:right;width:130px;margin:0 0 10px 0;padding:0;font-size:0.9em;
|
70
|
+
}
|
71
|
+
|
72
|
+
#extras p, #extras ul {
|
73
|
+
margin:0 0 1.5em 0;line-height:1.3em;padding:0;
|
74
|
+
}
|
75
|
+
|
76
|
+
#extras a {
|
77
|
+
font-weight:bold;
|
78
|
+
}
|
79
|
+
|
80
|
+
#extras li {
|
81
|
+
list-style:none;margin:0 0 6px 0;padding:0;
|
82
|
+
}
|
83
|
+
|
84
|
+
#extras h2 {
|
85
|
+
font-size:1.6em;font-weight:normal;margin:0 0 6px 0;;letter-spacing:-1px;
|
86
|
+
}
|
87
|
+
|
88
|
+
/***** Main content *****/
|
89
|
+
|
90
|
+
#content {
|
91
|
+
margin:10px 140px 10px 160px;padding:0;line-height:1.5em;text-align:left;
|
92
|
+
}
|
93
|
+
|
94
|
+
#contentwide {
|
95
|
+
margin:10px 0 10px 160px;padding:0;line-height:1.5em;text-align:left;
|
96
|
+
}
|
97
|
+
|
98
|
+
#contentfull {
|
99
|
+
margin:10px 10px 10px 10px;padding:2px 0 0 0;line-height:1.5em;text-align:left;
|
100
|
+
}
|
101
|
+
|
102
|
+
#content h2, #contentwide h2, #contentfull h2 {
|
103
|
+
font-size:1.8em;letter-spacing:-1px;font-weight:normal;margin:8px 0 10px 0;padding:0;
|
104
|
+
}
|
105
|
+
|
106
|
+
#content h3, #contentwide h3, #contentfull h3 {
|
107
|
+
font-size:1.5em;font-weight:normal;margin:6px 0 6px 0;padding:0;
|
108
|
+
}
|
109
|
+
|
110
|
+
#content img, #contentwide img, #contentfull img {
|
111
|
+
padding:1px;display:inline;background:#cccccc;color:#303030;border:4px solid #f0f0f0;
|
112
|
+
}
|
113
|
+
|
114
|
+
#content a, #contentwide a, #contentfull a {
|
115
|
+
font-weight:bold;
|
116
|
+
}
|
117
|
+
|
118
|
+
#content ul, #content ol,
|
119
|
+
#contentwide ul, #contentwide ol,
|
120
|
+
#contentfull ul, #contentfull ol {
|
121
|
+
margin:0 0 16px 20px;
|
122
|
+
padding:0;
|
123
|
+
}
|
124
|
+
|
125
|
+
#content ul ul, #content ol ol,
|
126
|
+
#contentwide ul ul, #contentwide ol ol,
|
127
|
+
#contentfull ul ul, #contentfull ol ol {
|
128
|
+
margin:2px 0 2px 20px;
|
129
|
+
}
|
130
|
+
|
131
|
+
#content li, #contentwide li, #contentfull li {
|
132
|
+
margin:0 0 2px 10px;
|
133
|
+
padding:0 0 0 4px;
|
134
|
+
}
|
135
|
+
|
136
|
+
/***** Footer *****/
|
137
|
+
|
138
|
+
#footer {
|
139
|
+
clear:both;margin:0 auto;padding:8px 0;border-top:2px solid #dadada;width:760px;text-align:center;color:#808080;background-color:#ffffff;font-size:0.9em;
|
140
|
+
}
|
141
|
+
|
142
|
+
#footer p {
|
143
|
+
padding:0;margin:0;
|
144
|
+
}
|
145
|
+
|
146
|
+
#footer a {
|
147
|
+
color:#808080;background-color:inherit;text-decoration:none;
|
148
|
+
}
|
149
|
+
|
150
|
+
#footer a:hover {
|
151
|
+
text-decoration:underline;
|
152
|
+
}
|
153
|
+
|
154
|
+
/***** Various tags *****/
|
155
|
+
|
156
|
+
a {
|
157
|
+
text-decoration:none;color:#505050;background-color:inherit;
|
158
|
+
}
|
159
|
+
|
160
|
+
a:hover {
|
161
|
+
text-decoration:underline;color:#286ea0;background-color:inherit;
|
162
|
+
}
|
163
|
+
|
164
|
+
a img {
|
165
|
+
border:0;
|
166
|
+
}
|
167
|
+
|
168
|
+
p {
|
169
|
+
margin:0 0 16px 0;
|
170
|
+
}
|
171
|
+
|
172
|
+
blockquote {
|
173
|
+
border-top:1px solid #d8d8d8;border-right:1px solid #d8d8d8;border-bottom:1px solid #d8d8d8;border-left:4px solid #cccccc;margin:16px;padding:7px 7px 7px 11px;background:#f4f4f4 url(images/menubg.gif) bottom left repeat-x;color:#505050;
|
174
|
+
}
|
175
|
+
|
176
|
+
blockquote p {
|
177
|
+
font-size:1.1em;line-height:1.3em;margin:0;
|
178
|
+
}
|
179
|
+
|
180
|
+
/***** Table styles *****/
|
181
|
+
|
182
|
+
table {
|
183
|
+
margin:0 0 16px 0;padding:0;line-height:1.3em;border-collapse:collapse;border:1px solid #d8d8d8;
|
184
|
+
}
|
185
|
+
|
186
|
+
caption {
|
187
|
+
text-align:left;font-size:1.5em;font-weight:normal;margin:0;padding:6px 0 8px 0;
|
188
|
+
}
|
189
|
+
|
190
|
+
th {
|
191
|
+
padding:7px;text-align:left;background:#eaeaea url(images/menubg2.gif) bottom left repeat-x;color:#505050;
|
192
|
+
}
|
193
|
+
|
194
|
+
td {
|
195
|
+
padding:7px;font-size:0.9em;text-align:left;background:#f4f4f4 url(images/menubg.gif) bottom left repeat-x;color:#303030;
|
196
|
+
}
|
197
|
+
|
198
|
+
/***** Form styles *****/
|
199
|
+
|
200
|
+
.button {
|
201
|
+
border-top:1px solid #d8d8d8;border-right:1px solid #d8d8d8;border-bottom:1px solid #d8d8d8;border-left:4px solid #cccccc;margin:0 0 15px 0;padding:7px 7px 7px 11px;background:#f4f4f4 url(images/menubg.gif) bottom left repeat-x;color:#505050;font-weight:bold;width:120px;
|
202
|
+
}
|
203
|
+
|
204
|
+
input, textarea {
|
205
|
+
border:1px solid #cccccc;font-family:Verdana,Tahoma,Arial,Sans-Serif;font-size:1em;margin:0;padding:4px;
|
206
|
+
}
|
207
|
+
|
208
|
+
label {
|
209
|
+
margin:2px;
|
210
|
+
}
|
211
|
+
|
212
|
+
input {
|
213
|
+
width:200px;
|
214
|
+
}
|
215
|
+
|
216
|
+
textarea {
|
217
|
+
width:400px;
|
218
|
+
}
|
219
|
+
|
220
|
+
/***** Search box *****/
|
221
|
+
|
222
|
+
#searchbox {
|
223
|
+
padding:0;margin:6px 0 16px 0;
|
224
|
+
}
|
225
|
+
|
226
|
+
#searchform {
|
227
|
+
background:#ffffff;border:1px solid #cccccc;color:#505050;font-size:0.9em;padding:4px;width:116px;
|
228
|
+
}
|
229
|
+
|
230
|
+
#searchbox label {
|
231
|
+
display:none;
|
232
|
+
}
|
233
|
+
|
234
|
+
/***** Various classes *****/
|
235
|
+
|
236
|
+
.left {
|
237
|
+
margin:10px 10px 5px 0;float:left;
|
238
|
+
}
|
239
|
+
|
240
|
+
.right {
|
241
|
+
margin:10px 0 5px 10px;float:right;
|
242
|
+
}
|
243
|
+
|
244
|
+
.announce {
|
245
|
+
margin:10px 0 10px 0;padding:10px 10px 5px 10px;width:105px;color:#505050;background:#f4f4f4 url(images/menubg.gif) bottom left repeat-x;border-top:1px solid #d8d8d8;border-right:1px solid #d8d8d8;border-bottom:1px solid #d8d8d8;border-left:4px solid #cccccc;line-height:1.3em;
|
246
|
+
}
|
247
|
+
|
248
|
+
.announce a {
|
249
|
+
font-weight:bold;
|
250
|
+
}
|
251
|
+
|
252
|
+
.announce p {
|
253
|
+
font-size:0.9em;
|
254
|
+
}
|
255
|
+
|
256
|
+
.announce h2 {
|
257
|
+
margin:0 0 10px 0;padding:0;
|
258
|
+
}
|
259
|
+
|
260
|
+
#avmenu .announce {
|
261
|
+
width:125px;
|
262
|
+
}
|
263
|
+
|
264
|
+
.textright {
|
265
|
+
text-align:right;margin:-10px 0 4px 0;
|
266
|
+
}
|
267
|
+
|
268
|
+
.center {
|
269
|
+
text-align:center;
|
270
|
+
}
|
271
|
+
|
272
|
+
.small {
|
273
|
+
font-size:0.8em;
|
274
|
+
}
|
275
|
+
|
276
|
+
.large {
|
277
|
+
font-size:1.3em;
|
278
|
+
}
|
279
|
+
|
280
|
+
.bold {
|
281
|
+
font-weight:bold;
|
282
|
+
}
|
283
|
+
|
284
|
+
.highlighted {
|
285
|
+
padding:3px;background-color:#f0f0f0;color:#303030;border:1px solid #b0b0b0;
|
286
|
+
}
|
287
|
+
|
288
|
+
.hide {
|
289
|
+
display:none;
|
290
|
+
}
|
@@ -0,0 +1,73 @@
|
|
1
|
+
--- content, html
|
2
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
3
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
4
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="{lang:}">
|
5
|
+
<head>
|
6
|
+
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
7
|
+
<meta name="description" content="Reptile is a ruby library for monitoring mysql replicaiton." />
|
8
|
+
<meta name="keywords" content="ruby, mysql, replication, monitoring" />
|
9
|
+
<meta name="author" content="Nick Stielau / Original design: Andreas Viklund - http://andreasviklund.com/" />
|
10
|
+
<meta name="generator" content="webgen - http://webgen.rubyforge.org" />
|
11
|
+
<link rel="stylesheet" type="text/css" href="{relocatable: default.css}" media="screen,projection" />
|
12
|
+
<link rel="stylesheet" type="text/css" href="{resource: webgen-css}" />
|
13
|
+
<title>{title:} Reptile: MySQL Replication Monitor</title>
|
14
|
+
</head>
|
15
|
+
|
16
|
+
<body>
|
17
|
+
<div id="wrap">
|
18
|
+
<div id="header">
|
19
|
+
<h1><a href="{relocatable: /index.page}">Reptile</a></h1>
|
20
|
+
<p><strong>Cold blooded replication monitoring</strong></p>
|
21
|
+
</div>
|
22
|
+
|
23
|
+
<div id="avmenu">
|
24
|
+
<h2 class="hide">Site menu:</h2>
|
25
|
+
{menu: vertical}
|
26
|
+
|
27
|
+
<div class="announce">
|
28
|
+
<h2>Latest news:</h2>
|
29
|
+
<p><strong>08.10.2009:</strong><br />
|
30
|
+
Reptile moved to github</p>
|
31
|
+
<p class="textright"><a href="/news/reptile_moved_to_github.html">Read more »</a></p>
|
32
|
+
<p><strong>06.25.2009:</strong><br />
|
33
|
+
Reptile's released as a gem!</p>
|
34
|
+
<p class="textright"><a href="/news/reptiles_released_as_a_gem.html">Read more »</a></p>
|
35
|
+
<p><strong>02.09.2009:</strong><br />
|
36
|
+
|
37
|
+
Reptile's up on rubyforge!</p>
|
38
|
+
<p class="textright"><a href="/news/reptiles_on_rubyforge.html">Read more »</a></p>
|
39
|
+
</div>
|
40
|
+
|
41
|
+
</div>
|
42
|
+
|
43
|
+
<div id="extras">
|
44
|
+
<h2>Information:</h2>
|
45
|
+
<p>Its good for you.</p>
|
46
|
+
<h2>Links:</h2>
|
47
|
+
<ul>
|
48
|
+
<li><a href="http://dev.mysql.com/doc/refman/5.0/en/replication.html">MySQL 5.0 Replication</a></li>
|
49
|
+
<li><a href="http://www.oreilly.com/catalog/hpmysql/">Oreilly: "High Performance MySQL"</a></li>
|
50
|
+
<li><a href="http://jeremy.zawodny.com/mysql/managing-mysql-replication.html">Managing MySQL Replication</a></li>
|
51
|
+
</ul>
|
52
|
+
|
53
|
+
</div>
|
54
|
+
|
55
|
+
<div id="content">
|
56
|
+
{block:}
|
57
|
+
</div>
|
58
|
+
|
59
|
+
<div id="footer">
|
60
|
+
<p>Copyright © 2009 Nick Stielau | Generated by <a href="http://webgen.rubyforge.org">webgen</a> | Design by <a href="http://andreasviklund.com">Andreas Viklund</a></p>
|
61
|
+
</div>
|
62
|
+
</div>
|
63
|
+
<script type="text/javascript">
|
64
|
+
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
|
65
|
+
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
|
66
|
+
</script>
|
67
|
+
<script type="text/javascript">
|
68
|
+
var pageTracker = _gat._getTracker("UA-3403241-4");
|
69
|
+
pageTracker._initData();
|
70
|
+
pageTracker._trackPageview();
|
71
|
+
</script>
|
72
|
+
</body>
|
73
|
+
</html>
|
@@ -0,0 +1,67 @@
|
|
1
|
+
---
|
2
|
+
title: Features
|
3
|
+
inMenu: true
|
4
|
+
orderInfo: 20
|
5
|
+
---
|
6
|
+
h2. Features
|
7
|
+
|
8
|
+
h3. Redundant replication checks:
|
9
|
+
|
10
|
+
<ul>
|
11
|
+
<li>checking MySQL 'SHOW SLAVE STATUS'</li>
|
12
|
+
<li>diffing table row counts</li>
|
13
|
+
<li>comparing '<a href="terms/heartbeat.html">heartbeat</a>' timestamps</li>
|
14
|
+
</ul>
|
15
|
+
|
16
|
+
h3. Easy Email Alerts
|
17
|
+
|
18
|
+
<ul>
|
19
|
+
<li>Send reports and alerts via email or SMS</li>
|
20
|
+
<li>Change alert thresholds, i.e. row count difference before an email alert, real-time latency before alert</li>
|
21
|
+
</ul>
|
22
|
+
|
23
|
+
h3. Easy to run.
|
24
|
+
|
25
|
+
<pre>
|
26
|
+
[nick@s34 ~]$ replication_status -h
|
27
|
+
Usage: replication_status [path_to_config_file]
|
28
|
+
-h, --help Displays this help info
|
29
|
+
-s, --status Displays the slave status
|
30
|
+
-d, --diff Checks the row count difference between master and slave
|
31
|
+
-r, --report Sends a report email
|
32
|
+
-b, --heartbeat Checks the heartbeat timestamp difference between master and slave
|
33
|
+
[nick@s34 ~]$ replication_status -s
|
34
|
+
* a_database slave is up and running
|
35
|
+
* b_database slave is up and running
|
36
|
+
* c_database slave is up and running
|
37
|
+
</pre>
|
38
|
+
|
39
|
+
h3. Easy to configure with a YML file
|
40
|
+
|
41
|
+
<pre>
|
42
|
+
|
43
|
+
config:
|
44
|
+
heartbeart_threshold: 10
|
45
|
+
delay_threshold_secs: 360
|
46
|
+
row_difference_threshold: 10
|
47
|
+
|
48
|
+
database_01:
|
49
|
+
master:
|
50
|
+
password: test_pass
|
51
|
+
username: read_only_user
|
52
|
+
adapter: mysql
|
53
|
+
database: db01
|
54
|
+
host: db1.somehost.com
|
55
|
+
port: 3306
|
56
|
+
socket: /tmp/mysql.sock
|
57
|
+
|
58
|
+
slave:
|
59
|
+
password: test_pass
|
60
|
+
username: read_only_user
|
61
|
+
adapter: mysql
|
62
|
+
database: db01
|
63
|
+
host: localhost
|
64
|
+
port: 3307
|
65
|
+
socket: /var/lib/mysql/db01.sock
|
66
|
+
|
67
|
+
</pre>
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,13 @@
|
|
1
|
+
---
|
2
|
+
title: Homepage
|
3
|
+
inMenu: true
|
4
|
+
orderInfo: 0
|
5
|
+
directoryName: Reptile
|
6
|
+
---
|
7
|
+
h2. Reptile
|
8
|
+
|
9
|
+
Welcome to Reptile!
|
10
|
+
|
11
|
+
Reptile is an easy to use utility that will monitor your MySQL replication, so you can forget about it and focus on the good stuff. For a little more info, check out the <a href="features.html">features</a> or check out the <a href="http://reptile.rubyforge.org/doc/">RDoc</a>.
|
12
|
+
|
13
|
+
Reptile will hopefully work for you, but I would bet (*sigh*) that it is really just a starting place. Take a look at the code, and hopefully you can find something that will work for you.
|
@@ -0,0 +1,9 @@
|
|
1
|
+
---
|
2
|
+
title: Reptile is on Rubyforge!
|
3
|
+
inMenu: false
|
4
|
+
---
|
5
|
+
h2. We're on RubyForge!
|
6
|
+
|
7
|
+
Rubyforge rocks!
|
8
|
+
|
9
|
+
My first open source project, and I'm trying to do it right. Hang tight while I solidify the Reptile codebase. Any suggestions, requests, or even a code review would be appreciated.
|
@@ -0,0 +1,9 @@
|
|
1
|
+
---
|
2
|
+
title: Reptile released as a gem!
|
3
|
+
inMenu: false
|
4
|
+
---
|
5
|
+
h2. No shortage of exclamation points, we're gemified!
|
6
|
+
|
7
|
+
Well, an eternity and two interested parties later, we've (I have) got a gem on ruby forge. I dance hither and thither, playing with the newgem gem, the rubyforge gem, ruby 1.9. Yak shaving. Almost wished I was using CPAN. But its out there.
|
8
|
+
|
9
|
+
Open source ain't easy, but the best advice I've heard is "just get it out there," so that is what I am going for.
|
@@ -0,0 +1,23 @@
|
|
1
|
+
---
|
2
|
+
title: Setup
|
3
|
+
inMenu: true
|
4
|
+
orderInfo: 40
|
5
|
+
---
|
6
|
+
|
7
|
+
h2. Setup
|
8
|
+
|
9
|
+
h3. Replication
|
10
|
+
|
11
|
+
Clearly, before you setup monitoring for your replication, it would be nice to actually have a master/slave replication already in place to monitor. But who am I to tell you how to do things. Replication in MySQL is actually easy to set up, but a little fragile, which is why a monitor comes in handy. Here are some links to help you get started with replication.
|
12
|
+
|
13
|
+
<ul>
|
14
|
+
<li><a href="http://dev.mysql.com/doc/refman/5.0/en/replication.html">MySQL 5.0 Replication</a></li>
|
15
|
+
<li><a href="http://www.oreilly.com/catalog/hpmysql/">Oreilly: "High Performance MySQL"</a></li>
|
16
|
+
<li><a href="http://jeremy.zawodny.com/mysql/managing-mysql-replication.html">Managing MySQL Replication</a></li>
|
17
|
+
</ul>
|
18
|
+
|
19
|
+
h3. Setting up Monitoring
|
20
|
+
|
21
|
+
MySQL allows for fairly fine-grained permissions, and while you could always run everything as your root MySQL user, Reptile will at least facilitate using a better security policy. This means using users with specific permissions for specific tasks. In addition to setting up some new users, Reptile requires a new database/table in order to read and write "<a href="terms/heartbeat.html">Heartbeats</a>," which is the best look at the "real time" latency of your system. We'll also try to help with that.
|
22
|
+
|
23
|
+
But give me some time!
|
@@ -0,0 +1,19 @@
|
|
1
|
+
---
|
2
|
+
title: Heartbeat
|
3
|
+
inMenu: false
|
4
|
+
---
|
5
|
+
|
6
|
+
h2. What is a Heartbeat?
|
7
|
+
|
8
|
+
A heartbeat is a way to monitor the "pulse" of your replication, and give you a reliable look at the "real time" latency of your replication. Heartbeats work as follows
|
9
|
+
|
10
|
+
<ul>
|
11
|
+
<li>Write a heartbeat timestamp to the master</li>
|
12
|
+
<li>Read the most recent heartbeat timestamp that was replicated to the slave</li>
|
13
|
+
<li>Compare the replicated timestamp to the current time.</li>
|
14
|
+
<li>Ooola: The time it took to replicate a row from the master to the slave. The latency of the replication.</li>
|
15
|
+
</ul>
|
16
|
+
|
17
|
+
There is also a little timing overhead. It might take you a couple seconds to disconnect from the master, connect to the slave, and read the heartbeat, but that should be minimal.
|
18
|
+
|
19
|
+
Also, just because your heartbeats are replicating does not necessarily mean all your data is up to date, but it does mean replication is working. A lot of changes to the master, especially with lots of data (binary blobs or whatever) will take some time to transfer to the slave machine and then run.
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: reptile
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Stielau
|
@@ -9,47 +9,45 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2010-01-05 00:00:00 -08:00
|
13
13
|
default_executable: replication_status
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
17
|
-
type: :
|
16
|
+
name: tlsmail
|
17
|
+
type: :runtime
|
18
18
|
version_requirement:
|
19
19
|
version_requirements: !ruby/object:Gem::Requirement
|
20
20
|
requirements:
|
21
21
|
- - ">="
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version:
|
23
|
+
version: "0"
|
24
24
|
version:
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
|
-
name:
|
27
|
-
type: :
|
26
|
+
name: activerecord
|
27
|
+
type: :runtime
|
28
28
|
version_requirement:
|
29
29
|
version_requirements: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: "0"
|
34
34
|
version:
|
35
|
-
description:
|
36
|
-
email:
|
37
|
-
- nick.stielau@gmail.com
|
35
|
+
description: Cold blooded mysql replication monitoring.
|
36
|
+
email: nick.stielau@gmail.com
|
38
37
|
executables:
|
39
38
|
- replication_status
|
40
39
|
extensions: []
|
41
40
|
|
42
41
|
extra_rdoc_files:
|
43
|
-
- History.txt
|
44
|
-
- Manifest.txt
|
45
|
-
- PostInstall.txt
|
46
42
|
- README.rdoc
|
47
43
|
files:
|
44
|
+
- .gitignore
|
48
45
|
- History.txt
|
49
46
|
- Manifest.txt
|
50
47
|
- PostInstall.txt
|
51
48
|
- README.rdoc
|
52
49
|
- Rakefile
|
50
|
+
- VERSION
|
53
51
|
- bin/replication_status
|
54
52
|
- lib/reptile.rb
|
55
53
|
- lib/reptile/databases.rb
|
@@ -60,19 +58,37 @@ files:
|
|
60
58
|
- lib/reptile/runner.rb
|
61
59
|
- lib/reptile/status.rb
|
62
60
|
- lib/reptile/users.rb
|
61
|
+
- replication.yml.sample
|
63
62
|
- script/console
|
64
63
|
- script/destroy
|
65
64
|
- script/generate
|
66
65
|
- test/test_helper.rb
|
67
66
|
- test/test_reptile.rb
|
67
|
+
- webgen_site/metainfo.yaml
|
68
|
+
- webgen_site/src/about.page
|
69
|
+
- webgen_site/src/config.yaml
|
70
|
+
- webgen_site/src/default.css
|
71
|
+
- webgen_site/src/default.template
|
72
|
+
- webgen_site/src/download.page
|
73
|
+
- webgen_site/src/features.page
|
74
|
+
- webgen_site/src/images/bg.gif
|
75
|
+
- webgen_site/src/images/frog.jpg
|
76
|
+
- webgen_site/src/images/front.jpg
|
77
|
+
- webgen_site/src/images/menubg.gif
|
78
|
+
- webgen_site/src/images/menubg2.gif
|
79
|
+
- webgen_site/src/index.page
|
80
|
+
- webgen_site/src/news/reptile_moved_to_github.template
|
81
|
+
- webgen_site/src/news/reptiles_on_rubyforge.page
|
82
|
+
- webgen_site/src/news/reptiles_released_as_a_gem.page
|
83
|
+
- webgen_site/src/setup.page
|
84
|
+
- webgen_site/src/terms/heartbeat.page
|
68
85
|
has_rdoc: true
|
69
86
|
homepage: http://reptile.rubyforge.org/
|
70
87
|
licenses: []
|
71
88
|
|
72
|
-
post_install_message:
|
89
|
+
post_install_message:
|
73
90
|
rdoc_options:
|
74
|
-
- --
|
75
|
-
- README.rdoc
|
91
|
+
- --charset=UTF-8
|
76
92
|
require_paths:
|
77
93
|
- lib
|
78
94
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -89,11 +105,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
89
105
|
version:
|
90
106
|
requirements: []
|
91
107
|
|
92
|
-
rubyforge_project:
|
108
|
+
rubyforge_project:
|
93
109
|
rubygems_version: 1.3.5
|
94
110
|
signing_key:
|
95
|
-
specification_version:
|
96
|
-
summary: Cold
|
111
|
+
specification_version: 3
|
112
|
+
summary: Cold blooded mysql replication monitoring.
|
97
113
|
test_files:
|
98
114
|
- test/test_helper.rb
|
99
115
|
- test/test_reptile.rb
|