murakumo 0.4.5 → 0.4.6
Sign up to get free protection for your applications and to get access to all the features.
- data/etc/murakumo.server +7 -0
- data/etc/murakumo.yml.example +7 -0
- data/lib/cli/mrkmctl.rb +8 -3
- data/lib/cli/murakumo_options.rb +23 -0
- data/lib/misc/murakumo_const.rb +1 -1
- data/lib/srv/murakumo_activity_check_notifier.rb +1 -1
- data/lib/srv/murakumo_balancer.rb +46 -9
- data/lib/srv/murakumo_cloud.rb +28 -2
- data/lib/srv/murakumo_health_check_notifier.rb +1 -1
- data/lib/srv/murakumo_health_checker.rb +1 -1
- metadata +30 -30
data/etc/murakumo.server
CHANGED
@@ -79,6 +79,12 @@ max-ip-num: 8
|
|
79
79
|
# (another way)
|
80
80
|
#init-script: /foo/bar/zoo/murakumo-init.rb
|
81
81
|
|
82
|
+
# verifies communication of initial nodes
|
83
|
+
#ping-init-nodes: true
|
84
|
+
|
85
|
+
# delay of a gossip start (cli arg: -D)
|
86
|
+
#gossip-start-delay: 60
|
87
|
+
|
82
88
|
#name-includes: ^app-\d+$, ^db-\d+$
|
83
89
|
#name-excludes:
|
84
90
|
#addr-includes: ^10\..*
|
@@ -123,6 +129,7 @@ host: $ip_addr, $hostname, 60
|
|
123
129
|
# timeout: 5
|
124
130
|
# healthy: 2
|
125
131
|
# unhealthy: 2
|
132
|
+
# #init-status: inactive # active/inactive (default: active)
|
126
133
|
# #on-activate: /foo/bar/zoo.sh # args: address name status
|
127
134
|
# #on-inactivate: /foo/bar/zoo.sh # args: address name status
|
128
135
|
# script: |
|
data/etc/murakumo.yml.example
CHANGED
@@ -19,6 +19,12 @@ max-ip-num: 8
|
|
19
19
|
# (another way)
|
20
20
|
#init-script: /foo/bar/zoo/murakumo-init.rb
|
21
21
|
|
22
|
+
# verifies communication of initial nodes
|
23
|
+
#ping-init-nodes: true
|
24
|
+
|
25
|
+
# delay of a gossip start (cli arg: -D)
|
26
|
+
#gossip-start-delay: 60
|
27
|
+
|
22
28
|
#name-includes: ^app-\d+$, ^db-\d+$
|
23
29
|
#name-excludes:
|
24
30
|
#addr-includes: ^10\..*
|
@@ -63,6 +69,7 @@ alias:
|
|
63
69
|
# timeout: 5
|
64
70
|
# healthy: 2
|
65
71
|
# unhealthy: 2
|
72
|
+
# #init-status: inactive # active/inactive (default: active)
|
66
73
|
# #on-activate: /foo/bar/zoo.sh # args: address name status
|
67
74
|
# #on-inactivate: /foo/bar/zoo.sh # args: address name status
|
68
75
|
# script: |
|
data/lib/cli/mrkmctl.rb
CHANGED
@@ -18,6 +18,9 @@ begin
|
|
18
18
|
case cmd
|
19
19
|
# 一覧表示
|
20
20
|
when :list
|
21
|
+
# アドレスの取得
|
22
|
+
address = there.address
|
23
|
+
|
21
24
|
# レコードの取得
|
22
25
|
records = there.list_records
|
23
26
|
|
@@ -48,11 +51,13 @@ begin
|
|
48
51
|
puts 'No macth'
|
49
52
|
else
|
50
53
|
puts <<-EOF
|
51
|
-
IP address TTL Priority Weight Activity Hostname
|
52
|
-
--------------- ------ --------- ------ -------- ----------
|
54
|
+
IP address TTL Priority Weight Activity Hostname
|
55
|
+
--------------- ------ --------- ------ -------- ----------
|
53
56
|
EOF
|
54
57
|
records.each do |r|
|
55
|
-
|
58
|
+
values = r.values_at(0, 2, 3, 4, 5, 1)
|
59
|
+
values.unshift(address == values[0] ? '*' : ' ')
|
60
|
+
puts '%s %-15s %6d %-9s %6s %-8s %s' % values
|
56
61
|
end
|
57
62
|
end
|
58
63
|
|
data/lib/cli/murakumo_options.rb
CHANGED
@@ -131,6 +131,12 @@ def murakumo_parse_args
|
|
131
131
|
desc 'reception timeout of a gossip protocol'
|
132
132
|
option :gossip_receive_timeout, '-O', '--gossip-receive-timeout NUM', :type => Integer, :default => 3
|
133
133
|
|
134
|
+
desc 'verifies communication of initial nodes'
|
135
|
+
option :ping_init_nodes, '-V', '--ping-init-nodes', :default => false
|
136
|
+
|
137
|
+
desc 'delay of a gossip start'
|
138
|
+
option :gossip_start_delay, '-D', '--gossip-start-delay', :type => Integer, :default => 0
|
139
|
+
|
134
140
|
after do |options|
|
135
141
|
# auth_key
|
136
142
|
if File.exist?(options[:auth_key])
|
@@ -203,6 +209,11 @@ def murakumo_parse_args
|
|
203
209
|
parse_error('same hostname was found')
|
204
210
|
end
|
205
211
|
|
212
|
+
# ping init nodes
|
213
|
+
if options[:ping_init_nodes]
|
214
|
+
options[:ping_init_nodes] = !!options[:ping_init_nodes]
|
215
|
+
end
|
216
|
+
|
206
217
|
# health check
|
207
218
|
if (health_check = options[:health_check])
|
208
219
|
health_check.kind_of?(Hash) or parse_error('configuration of a health check is not right')
|
@@ -221,6 +232,18 @@ def murakumo_parse_args
|
|
221
232
|
end
|
222
233
|
end
|
223
234
|
|
235
|
+
conf['init-status'] ||= 'active'
|
236
|
+
|
237
|
+
unless /\A(active|inactive)\Z/i =~ conf['init-status']
|
238
|
+
parse_error('configuration of a health check is not right', "#{name}/init-status")
|
239
|
+
end
|
240
|
+
|
241
|
+
if conf['init-status'] =~ /\Aactive\Z/i
|
242
|
+
conf['init-status'] = Murakumo::ACTIVE
|
243
|
+
else
|
244
|
+
conf['init-status'] = Murakumo::INACTIVE
|
245
|
+
end
|
246
|
+
|
224
247
|
# 各種変数の設定
|
225
248
|
{
|
226
249
|
'interval' => [ 5, 1, 300],
|
data/lib/misc/murakumo_const.rb
CHANGED
@@ -44,7 +44,7 @@ Status: #{status}
|
|
44
44
|
EOS
|
45
45
|
end
|
46
46
|
|
47
|
-
@logger.info("sent
|
47
|
+
@logger.info("sent notice: #{status}")
|
48
48
|
rescue Exception => e
|
49
49
|
message = (["#{e.class}: #{e.message}"] + (e.backtrace || [])).join("\n\tfrom ")
|
50
50
|
@logger.error("activity check failed: #{@name}: #{message}")
|
@@ -108,28 +108,65 @@ module Murakumo
|
|
108
108
|
end
|
109
109
|
|
110
110
|
# 宛先をソート
|
111
|
-
dests = (0...records.length).map {
|
111
|
+
dests = (0...records.length).map {
|
112
|
+
|i| [records[i].values_at('ip_address', 'weight'), i].flatten
|
113
|
+
}.sort_by {|addr, weight, i| addr }
|
112
114
|
dests_orig = dests
|
113
115
|
dests_orig_len = dests_orig.length
|
114
116
|
|
115
|
-
#
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
117
|
+
# 按分する
|
118
|
+
dests = arrange_length(sources, dests)
|
119
|
+
|
120
|
+
# 宛先がない場合はとりあえずランダムで
|
121
|
+
if dests.length.zero?
|
122
|
+
@logger.warn('destination is not found')
|
123
|
+
return random(records, max_ip_num)
|
121
124
|
end
|
122
125
|
|
123
126
|
# 先頭を決めてローテート
|
124
|
-
|
127
|
+
first_record = sources.zip(dests).assoc(@address)[1]
|
128
|
+
first_index = dests_orig.index {|i| i[0] == first_record[0] }
|
125
129
|
|
126
130
|
# 元の配列に戻す
|
127
131
|
dests = (dests_orig + dests_orig).slice(first_index, dests_orig_len)
|
128
132
|
|
129
133
|
# 先頭インデックスからレコードを並べ直す
|
130
|
-
yield(records.values_at(*dests.map {|addr, i| i }))
|
134
|
+
yield(records.values_at(*dests.map {|addr, weight, i| i }))
|
131
135
|
end # fix_by_src0
|
132
136
|
|
137
|
+
def arrange_length(sources, dests)
|
138
|
+
weights = {}
|
139
|
+
sum = dests.inject(0) {|r, i| r + i[1] }
|
140
|
+
|
141
|
+
# 重みでソースの長さを按分する
|
142
|
+
dests.each do |addr, weight, i|
|
143
|
+
weights[addr] = ((weight.to_f / sum) * sources.length).round
|
144
|
+
end
|
145
|
+
|
146
|
+
# 端数分をそろえる
|
147
|
+
delta = weights.inject(0) {|r, i| r + i[1] } - sources.length
|
148
|
+
key_list = weights.sort_by {|k, v| k }.map {|k, v| k } # 順序は一定に!
|
149
|
+
addval = (delta > 0) ? -1 : 1
|
150
|
+
|
151
|
+
# ローテートしながら端数分を埋める
|
152
|
+
until delta.zero?
|
153
|
+
key = key_list.shift
|
154
|
+
key_list.push(key)
|
155
|
+
weights[key] += addval
|
156
|
+
delta += addval
|
157
|
+
end
|
158
|
+
|
159
|
+
new_dests = []
|
160
|
+
|
161
|
+
dests.each do |addr, weight, i|
|
162
|
+
weights[addr].to_i.times do
|
163
|
+
new_dests << [addr, weight, i]
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
return new_dests
|
168
|
+
end # arrange_length
|
169
|
+
|
133
170
|
end # Balancer
|
134
171
|
|
135
172
|
end # Murakumo
|
data/lib/srv/murakumo_cloud.rb
CHANGED
@@ -26,7 +26,12 @@ module Murakumo
|
|
26
26
|
host_data = options[:host]
|
27
27
|
@address = host_data.shift
|
28
28
|
host_data.concat [ORIGIN, 0, ACTIVE]
|
29
|
-
alias_datas = options[:aliases].map {|r|
|
29
|
+
alias_datas = options[:aliases].map {|r|
|
30
|
+
# ヘルスチェックの初期値に合わせて健康状態を設定
|
31
|
+
health_check_conf = (@options[:health_check] || {}).find {|k, v| k =~ /\A#{r[0]}\Z/i } || []
|
32
|
+
init_status = health_check_conf.fetch(1, {}).fetch('init-status', ACTIVE)
|
33
|
+
r + [init_status]
|
34
|
+
}
|
30
35
|
@logger = options[:logger]
|
31
36
|
|
32
37
|
# 名前は小文字に変換
|
@@ -54,6 +59,7 @@ module Murakumo
|
|
54
59
|
:gossip_interval => options[:gossip_send_interval],
|
55
60
|
:receive_timeout => options[:gossip_receive_timeout],
|
56
61
|
:logger => @logger,
|
62
|
+
:ping_init_nodes => options[:ping_init_nodes],
|
57
63
|
})
|
58
64
|
|
59
65
|
# ノードの更新をフック
|
@@ -153,7 +159,15 @@ module Murakumo
|
|
153
159
|
exec_start_script(@options[:on_start])
|
154
160
|
end
|
155
161
|
|
156
|
-
@gossip
|
162
|
+
@logger.info("Delay of a gossip start: #{@options[:gossip_start_delay]}")
|
163
|
+
|
164
|
+
Thread.start do
|
165
|
+
# ゴシッププロトコルの開始を遅延
|
166
|
+
sleep @options[:gossip_start_delay]
|
167
|
+
|
168
|
+
@logger.info('Gossip was started')
|
169
|
+
@gossip.start
|
170
|
+
end
|
157
171
|
end
|
158
172
|
|
159
173
|
def exec_start_script(script)
|
@@ -200,6 +214,8 @@ module Murakumo
|
|
200
214
|
'gossip-receive-timeout',
|
201
215
|
@gossip.context.receive_timeout
|
202
216
|
]},
|
217
|
+
:ping_init_nodes => 'ping-init-nodes',
|
218
|
+
:gossip_start_delay => 'gossip-start-delay',
|
203
219
|
}
|
204
220
|
|
205
221
|
hash = {}
|
@@ -230,6 +246,16 @@ module Murakumo
|
|
230
246
|
if @options.config_file
|
231
247
|
if @options.config_file['health-check']
|
232
248
|
hash['health-check'] = @options.config_file['health-check']
|
249
|
+
|
250
|
+
# ちょっと直したい…
|
251
|
+
hash['health-check'].values.each do |h|
|
252
|
+
next unless h['init-status']
|
253
|
+
|
254
|
+
h['init-status'] = {
|
255
|
+
ACTIVE => 'active' ,
|
256
|
+
INACTIVE => 'inactive',
|
257
|
+
}.fetch(h['init-status'])
|
258
|
+
end
|
233
259
|
end
|
234
260
|
|
235
261
|
if @options.config_file['activity-check']
|
@@ -45,7 +45,7 @@ Status: #{status}
|
|
45
45
|
EOS
|
46
46
|
end
|
47
47
|
|
48
|
-
@logger.info("sent
|
48
|
+
@logger.info("sent notice: #{status}")
|
49
49
|
rescue Exception => e
|
50
50
|
message = (["#{e.class}: #{e.message}"] + (e.backtrace || [])).join("\n\tfrom ")
|
51
51
|
@logger.error("health check failed: #{@name}: #{message}")
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: murakumo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 3
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 4
|
9
|
-
-
|
10
|
-
version: 0.4.
|
9
|
+
- 6
|
10
|
+
version: 0.4.6
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- winebarrel
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-
|
18
|
+
date: 2012-02-05 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: rubydns
|
@@ -41,12 +41,12 @@ dependencies:
|
|
41
41
|
requirements:
|
42
42
|
- - ">="
|
43
43
|
- !ruby/object:Gem::Version
|
44
|
-
hash:
|
44
|
+
hash: 31
|
45
45
|
segments:
|
46
46
|
- 0
|
47
47
|
- 2
|
48
|
-
-
|
49
|
-
version: 0.2.
|
48
|
+
- 4
|
49
|
+
version: 0.2.4
|
50
50
|
type: :runtime
|
51
51
|
version_requirements: *id002
|
52
52
|
- !ruby/object:Gem::Dependency
|
@@ -99,43 +99,43 @@ extra_rdoc_files: []
|
|
99
99
|
|
100
100
|
files:
|
101
101
|
- README
|
102
|
-
- bin/murakumo-show-ec2-instances
|
103
102
|
- bin/murakumo-show-ec2-private-ip-addresses
|
104
|
-
- bin/murakumo-
|
105
|
-
- bin/murakumo
|
103
|
+
- bin/murakumo-install-init-script
|
106
104
|
- bin/murakumo-show-ec2-tags
|
107
|
-
- bin/murakumo-show-ip-address
|
108
105
|
- bin/murakumo-show-ec2-interfaces
|
109
|
-
- bin/murakumo-
|
106
|
+
- bin/murakumo-show-ip-address
|
107
|
+
- bin/murakumo-show-ec2-instances
|
108
|
+
- bin/murakumo-attach-ec2-attach-interface
|
110
109
|
- bin/mrkmctl
|
110
|
+
- bin/murakumo
|
111
|
+
- lib/cli/murakumo_options.rb
|
111
112
|
- lib/cli/mrkmctl.rb
|
113
|
+
- lib/cli/mrkmctl_options.rb
|
112
114
|
- lib/cli/murakumo.rb
|
113
|
-
- lib/cli/murakumo_options.rb
|
114
115
|
- lib/cli/murakumo_initializer_context.rb
|
115
|
-
- lib/
|
116
|
-
- lib/
|
116
|
+
- lib/srv/murakumo_health_check_notifier.rb
|
117
|
+
- lib/srv/murakumo_balancer.rb
|
118
|
+
- lib/srv/murakumo_server.rb
|
119
|
+
- lib/srv/murakumo_health_checker.rb
|
120
|
+
- lib/srv/murakumo_cloud.rb
|
121
|
+
- lib/srv/murakumo_activity_check_notifier.rb
|
122
|
+
- lib/srv/murakumo_activity_checker.rb
|
123
|
+
- lib/srv/murakumo_health_check_context.rb
|
117
124
|
- lib/util/murakumo_ec2_private_ip_addresses.rb
|
118
125
|
- lib/util/murakumo_ec2_instances.rb
|
126
|
+
- lib/util/murakumo_ec2_client.rb
|
119
127
|
- lib/util/murakumo_ec2_tags.rb
|
120
|
-
- lib/util/murakumo_ec2_interfaces.rb
|
121
128
|
- lib/util/murakumo_self_ip_address.rb
|
129
|
+
- lib/util/murakumo_ec2_interfaces.rb
|
122
130
|
- lib/util/murakumo_ec2_attach_interface.rb
|
123
|
-
- lib/
|
124
|
-
- lib/srv/murakumo_health_check_context.rb
|
125
|
-
- lib/srv/murakumo_server.rb
|
126
|
-
- lib/srv/murakumo_health_check_notifier.rb
|
127
|
-
- lib/srv/murakumo_activity_check_notifier.rb
|
128
|
-
- lib/srv/murakumo_activity_checker.rb
|
129
|
-
- lib/srv/murakumo_health_checker.rb
|
130
|
-
- lib/srv/murakumo_balancer.rb
|
131
|
-
- lib/srv/murakumo_cloud.rb
|
132
|
-
- etc/murakumo.server
|
133
|
-
- etc/murakumo-init.rb.for-ec2
|
134
|
-
- etc/murakumo.yml.example
|
135
|
-
- etc/gai.conf.example
|
131
|
+
- lib/misc/murakumo_const.rb
|
136
132
|
- etc/murakumo-update-config-for-ec2
|
133
|
+
- etc/gai.conf.example
|
137
134
|
- etc/attach_if.sh.example
|
135
|
+
- etc/murakumo.yml.example
|
138
136
|
- etc/dhclient-script.patch
|
137
|
+
- etc/murakumo-init.rb.for-ec2
|
138
|
+
- etc/murakumo.server
|
139
139
|
homepage: https://github.com/cookpad/murakumo/wiki
|
140
140
|
licenses: []
|
141
141
|
|
@@ -165,7 +165,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
165
165
|
requirements: []
|
166
166
|
|
167
167
|
rubyforge_project:
|
168
|
-
rubygems_version: 1.8.
|
168
|
+
rubygems_version: 1.8.1
|
169
169
|
signing_key:
|
170
170
|
specification_version: 3
|
171
171
|
summary: Murakumo is the internal DNS server which manages name information using a gossip protocol.
|