multibinder 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 00e47bebe4eec94c83ac430fb7d6c887e9159436
4
- data.tar.gz: 5d839a52f9d793ca4c003dbcba8c2f5c5e3b97f9
3
+ metadata.gz: 48c7529264a07e02ceede53195b8865e5d333b55
4
+ data.tar.gz: a46092b200c70902b02fe4d3ba9a76dfb64eb6c0
5
5
  SHA512:
6
- metadata.gz: dbb81e35458b82592b48cf48d6250c796640a94072995f359c54ee08a9d173717442bc518e4e82d758cd437f6796387a9e5e40cfc82de2f054d52869fbdc018e
7
- data.tar.gz: 9dc6ea20ad3ffdb185c2c7a90ff1cd553449356f5952679258418b4e89674cf26e8fab62a02e7b539d892f42300abaddaa71c6897ac04d30920755e516962abd
6
+ metadata.gz: a9353acb7fad02a3a1d84b5a8ab4befa95c3120db2bde5bcaa8db361fdcaa8a248d0bf4db6f08fad4397f76afaf2cdc5b7c612569748ffc1e8b4b8da68cfbe61
7
+ data.tar.gz: 63cde39aa688749c9d3800f64e408461b9dfcc2e74b56b6d199d6d312042c403f059d96749f37ec403f46b35cdf92eb408601b54db91259bb0876a925d46567a
@@ -13,8 +13,8 @@ haproxy_call = ARGV
13
13
  abort 'multibinder-haproxy expects a configuration file to be passed to haproxy' if haproxy_call.index('-f').nil?
14
14
  config_file_index = haproxy_call.index('-f') + 1
15
15
  haproxy_erb = haproxy_call[config_file_index]
16
- abort 'Config file must end with .erb' unless haproxy_erb.end_with? '.erb'
17
- haproxy_cfg = haproxy_erb.sub('.erb', '')
16
+ abort 'Config file must end with .erb or .mb' unless haproxy_erb.end_with? '.erb' or haproxy_erb.end_with? '.mb'
17
+ haproxy_cfg = haproxy_erb.sub(/\.(erb|mb)$/, '')
18
18
  haproxy_call[config_file_index] = haproxy_cfg
19
19
 
20
20
  def bind_tcp(ip, port)
@@ -39,7 +39,10 @@ Signal.trap("USR2") do
39
39
 
40
40
  # wait a while for the pid file to change. after a while, give up and unblock reloads
41
41
  for i in 0..20
42
- break if File.read($PID_FILE) != old_pids
42
+ begin
43
+ break if File.read($PID_FILE) != old_pids
44
+ rescue Errno::ENOENT
45
+ end
43
46
  sleep 1
44
47
  end
45
48
  end
@@ -61,4 +64,4 @@ begin
61
64
  end
62
65
  ensure
63
66
  cleanup_existing
64
- end
67
+ end
@@ -0,0 +1,95 @@
1
+ ## multibinder + HAProxy
2
+
3
+ HAProxy by default doesn't include support for zero-downtime reloads. multibinder was developed to work with HAProxy, and has some useful wrappers included that allow running multiple HAProxy instances with multibinder on the same machine, while enabling zero-downtime reloads.
4
+
5
+ ### Installation on Ubuntu 16.04
6
+
7
+ Install multibinder and dependencies:
8
+ ```
9
+ sudo apt-get install -y haproxy ruby
10
+ sudo gem install multibinder
11
+ ```
12
+
13
+ The multibinder systemd scripts automatically support multiple haproxy instances, so stop and disable the default haproxy service:
14
+ ```
15
+ sudo systemctl stop haproxy
16
+ sudo systemctl disable haproxy
17
+ ```
18
+
19
+ Install the `multibinder` and `haproxy-multi@` systemd service files, and start multibinder itself:
20
+ ```
21
+ sudo cp $(gem environment gemdir)/gems/multibinder-0.0.4/haproxy/*.service /etc/systemd/system/
22
+ sudo systemctl daemon-reload
23
+
24
+ sudo systemctl enable multibinder
25
+ sudo systemctl start multibinder
26
+ ```
27
+
28
+ Create your first haproxy service configuration file, replacing all bind IP/ports with ERB code like the following:
29
+ ```
30
+ cat >/etc/haproxy/foo.cfg.erb <<EOF
31
+ global
32
+ user haproxy
33
+ group haproxy
34
+ daemon
35
+ maxconn 256
36
+
37
+ defaults
38
+ mode http
39
+ timeout connect 5000ms
40
+ timeout client 50000ms
41
+ timeout server 50000ms
42
+
43
+ frontend http-in
44
+ bind <%= bind_tcp('0.0.0.0', 80) %>
45
+ EOF
46
+ ```
47
+
48
+ Now start your multibinder-enabled haproxy `foo` service!
49
+ ```
50
+ sudo systemctl enable haproxy-multi@foo
51
+ sudo systemctl start haproxy-multi@foo
52
+ ```
53
+
54
+ You'll have a process tree like the following:
55
+ ```
56
+ $ sudo systemctl status haproxy-multi@foo
57
+ ● haproxy-multi@foo.service - HAProxy Load Balancer
58
+ Loaded: loaded (/etc/systemd/system/haproxy-multi@.service; enabled; vendor preset: enabled)
59
+ Active: active (running) since Mon 2016-10-31 20:56:28 UTC; 1s ago
60
+ Docs: man:haproxy(1)
61
+ file:/usr/share/doc/haproxy/configuration.txt.gz
62
+ Process: 3092 ExecStop=/bin/kill -TERM $MAINPID (code=exited, status=0/SUCCESS)
63
+ Process: 3076 ExecReload=/bin/sh -c /usr/local/bin/multibinder-haproxy-erb /usr/sbin/haproxy -c -f ${CONFIG}; /bin/kill -USR2 $MAINPID (code=exited, status=0/SUCCESS)
64
+ Process: 3105 ExecStartPre=/usr/local/bin/multibinder-haproxy-erb /usr/sbin/haproxy -f ${CONFIG} -c -q (code=exited, status=0/SUCCESS)
65
+ Main PID: 3109 (multibinder-hap)
66
+ CGroup: /system.slice/system-haproxy\x2dmulti.slice/haproxy-multi@foo.service
67
+ ├─3109 /usr/bin/ruby2.3 /usr/local/bin/multibinder-haproxy-wrapper /usr/sbin/haproxy -Ds -f /etc/haproxy/foo.cfg.erb -p /run/haproxy-foo.pid
68
+ ├─3113 /usr/sbin/haproxy -Ds -f /etc/haproxy/foo.cfg -p /run/haproxy-foo.pid
69
+ └─3115 /usr/sbin/haproxy -Ds -f /etc/haproxy/foo.cfg -p /run/haproxy-foo.pid
70
+
71
+ Oct 31 20:56:28 ip-172-31-8-204 systemd[1]: Starting HAProxy Load Balancer...
72
+ Oct 31 20:56:28 ip-172-31-8-204 systemd[1]: Started HAProxy Load Balancer.
73
+ ```
74
+
75
+ With multibinder running separately from the haproxy process(es):
76
+ ```
77
+ $ sudo systemctl status multibinder
78
+ ● multibinder.service - Multibinder
79
+ Loaded: loaded (/etc/systemd/system/multibinder.service; enabled; vendor preset: enabled)
80
+ Active: active (running) since Mon 2016-10-31 20:50:05 UTC; 7min ago
81
+ Main PID: 2751 (multibinder)
82
+ Tasks: 2
83
+ Memory: 4.9M
84
+ CPU: 44ms
85
+ CGroup: /system.slice/multibinder.service
86
+ └─2751 /usr/bin/ruby2.3 /usr/local/bin/multibinder /run/multibinder.sock
87
+
88
+ Oct 31 20:50:05 ip-172-31-8-204 systemd[1]: Started Multibinder.
89
+ Oct 31 20:50:05 ip-172-31-8-204 multibinder[2751]: Listening for binds on control socket: /run/multibinder.sock
90
+ ```
91
+
92
+ Reloading an haproxy instance safely can then be requested through systemctl:
93
+ ```
94
+ $ sudo systemctl reload haproxy-multi@foo
95
+ ```
@@ -1,5 +1,8 @@
1
1
  require 'multibinder/version'
2
2
  require 'json'
3
+ require 'securerandom'
4
+ require 'socket'
5
+ require 'fcntl'
3
6
 
4
7
  module MultiBinder
5
8
  def self.bind(address, port, options={})
@@ -11,6 +14,7 @@ module MultiBinder
11
14
  binder.sendmsg JSON.dump({
12
15
  :jsonrpc => '2.0',
13
16
  :method => 'bind',
17
+ :id => SecureRandom.uuid,
14
18
  :params => [{
15
19
  :address => address,
16
20
  :port => port,
@@ -1,3 +1,3 @@
1
1
  module MultiBinder
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: multibinder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Theo Julienne
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-31 00:00:00.000000000 Z
11
+ date: 2017-09-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -56,6 +56,7 @@ files:
56
56
  - bin/multibinder
57
57
  - bin/multibinder-haproxy-erb
58
58
  - bin/multibinder-haproxy-wrapper
59
+ - haproxy/README.md
59
60
  - haproxy/haproxy-multi@.service
60
61
  - haproxy/multibinder.service
61
62
  - lib/multibinder.rb