murakumo 0.4.5 → 0.4.6
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/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.
|