reptile 0.0.4 → 0.0.5
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.
- 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
|