From 27afdcfbc6dffd38d4a2f8bb7e9202bfa096da26 Mon Sep 17 00:00:00 2001 From: Christian Bruckmayer Date: Wed, 6 Jun 2018 10:32:49 +0200 Subject: [PATCH 1/4] [frontend] Add docker-compose file for HAProxy setup as testing ground for a production HA setup. * Loadbalancing by HAProxy is now available via localhost:8080 * First frontend node can be accessed via localhost:3000 * Second frontend node can be accessed via localhost:3001 --- contrib/Procfile.ha | 5 +++++ contrib/haproxy.cfg | 26 ++++++++++++++++++++++++++ contrib/thinking_sphinx.yml.ha | 24 ++++++++++++++++++++++++ docker-compose.ha.yml | 27 +++++++++++++++++++++++++++ 4 files changed, 82 insertions(+) create mode 100644 contrib/Procfile.ha create mode 100644 contrib/haproxy.cfg create mode 100644 contrib/thinking_sphinx.yml.ha create mode 100644 docker-compose.ha.yml diff --git a/contrib/Procfile.ha b/contrib/Procfile.ha new file mode 100644 index 00000000000..33e8998ffa3 --- /dev/null +++ b/contrib/Procfile.ha @@ -0,0 +1,5 @@ +web: bundle exec rails server -P tmp/pids/server$NODE_NUMBER.pid +delayed: bundle exec script/delayed_job.api.rb run +clock: bundle exec clockworkd --log-dir=log -l -c config/clock.rb run +search: bundle exec rake ts:rebuild NODETACH=true +mailcatcher: mailcatcher --ip 0.0.0.0 -f --no-quit -v diff --git a/contrib/haproxy.cfg b/contrib/haproxy.cfg new file mode 100644 index 00000000000..92c0894a226 --- /dev/null +++ b/contrib/haproxy.cfg @@ -0,0 +1,26 @@ +defaults + log global + mode http + option httplog + option dontlognull + timeout connect 5000 + timeout client 50000 + timeout server 50000 + +resolvers dockerdns + nameserver dns 127.0.0.11:53 + +frontend localnodes + bind *:80 + mode http + default_backend nodes + +backend nodes + mode http + balance roundrobin + option forwardfor + http-request set-header X-Forwarded-Port %[dst_port] + http-request add-header X-Forwarded-Proto https if { ssl_fc } + option httpchk HEAD /about HTTP/1.1\r\nHost:localhost + server web01 frontend:3000 check resolvers dockerdns resolve-prefer ipv4 + server web02 frontend_node_2:3000 check resolvers dockerdns resolve-prefer ipv4 diff --git a/contrib/thinking_sphinx.yml.ha b/contrib/thinking_sphinx.yml.ha new file mode 100644 index 00000000000..0f32e5fe308 --- /dev/null +++ b/contrib/thinking_sphinx.yml.ha @@ -0,0 +1,24 @@ +development: + mysql41: 9312 + bin_path: /usr/bin + mem_limit: 512M + charset_table: "0..9, a..z, A..Z->a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F" + mysql41: <%= 9313 + ENV['NODE_NUMBER'].to_i %> + indices_location: <%= File.join(Rails.root, "db", "sphinx", "development#{ENV['NODE_NUMBER']}") %> + configuration_file: <%= File.join(Rails.root, "config", "development#{ENV['NODE_NUMBER']}.sphinx.conf")%> + log: <%= File.join(Rails.root, "log", "development#{ENV['NODE_NUMBER']}.searchd.log") %> + query_log: <%= File.join(Rails.root, "log", "development#{ENV['NODE_NUMBER']}.searchd.query.log") %> + binlog_path: <%= File.join(Rails.root, "tmp", "binlog", "development#{ENV['NODE_NUMBER']}") %> + pid_file: <%= File.join(Rails.root, "tmp", "pids", "development#{ENV['NODE_NUMBER']}.sphinx.pid") %> +test: + mysql41: 9313 + bin_path: /usr/bin + mem_limit: 512M + charset_table: "0..9, a..z, A..Z->a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F" + # To efficiently deal with large ids generated by fixtures + sql_range_step: 10000000 +production: + mysql41: 9314 + bin_path: /usr/bin + mem_limit: 512M + charset_table: "0..9, a..z, A..Z->a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F" diff --git a/docker-compose.ha.yml b/docker-compose.ha.yml new file mode 100644 index 00000000000..731119d33e0 --- /dev/null +++ b/docker-compose.ha.yml @@ -0,0 +1,27 @@ +version: "2.1" +services: + proxy: + image: haproxy:1.7 + volumes: + - ./contrib/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro + ports: + - "8080:80" + depends_on: + - frontend + - frontend_node_2 + frontend_node_2: + image: openbuildservice/frontend + environment: + - NODE_NUMBER=2 + volumes: + - .:/obs + - ./contrib/thinking_sphinx.yml.ha:/obs/src/api/config/thinking_sphinx.yml:ro + - ./contrib/Procfile.ha:/obs/src/api/Procfile + ports: + - "3001:3000" + - "1081:1080" + depends_on: + - db + - cache + - backend + - worker From a9ad4f1e66c666bd25f2566d8d9f8e758d853a42 Mon Sep 17 00:00:00 2001 From: Christian Bruckmayer Date: Wed, 6 Jun 2018 11:27:25 +0200 Subject: [PATCH 2/4] [frontend] Add host to the Peek status bar to show which host the request is serving in the HA mode. This required that we add the hostname package to the base docker image. --- docker-files/base/Dockerfile.42.3 | 2 +- src/api/Gemfile | 1 + src/api/Gemfile.lock | 3 +++ src/api/config/initializers/peek.rb | 1 + 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/docker-files/base/Dockerfile.42.3 b/docker-files/base/Dockerfile.42.3 index 7ff5fdfa498..94f539ac982 100644 --- a/docker-files/base/Dockerfile.42.3 +++ b/docker-files/base/Dockerfile.42.3 @@ -9,7 +9,7 @@ RUN echo 'solver.allowVendorChange = true' >> /etc/zypp/zypp.conf; \ # Install requirements for all our containers RUN zypper -n install --no-recommends --replacefiles \ make gcc gcc-c++ patch curl vim vim-data psmisc \ - timezone ack glibc-locale sudo aaa_base + timezone ack glibc-locale sudo aaa_base hostname # Add our bootstrap script ADD docker-bootstrap.sh /root/bin/docker-bootstrap.sh diff --git a/src/api/Gemfile b/src/api/Gemfile index 70fdcc67d04..972b6c2d895 100644 --- a/src/api/Gemfile +++ b/src/api/Gemfile @@ -63,6 +63,7 @@ gem 'feature' # for profiling gem 'peek' gem 'peek-dalli' +gem 'peek-host' gem 'peek-mysql2' # for kerberos authentication gem 'gssapi', require: false diff --git a/src/api/Gemfile.lock b/src/api/Gemfile.lock index 97948d90ae3..33f5af2517c 100644 --- a/src/api/Gemfile.lock +++ b/src/api/Gemfile.lock @@ -228,6 +228,8 @@ GEM concurrent-ruby-ext dalli peek + peek-host (1.0.0) + peek peek-mysql2 (1.2.0) concurrent-ruby concurrent-ruby-ext @@ -462,6 +464,7 @@ DEPENDENCIES nokogiri peek peek-dalli + peek-host peek-mysql2 poltergeist pry (>= 0.9.12) diff --git a/src/api/config/initializers/peek.rb b/src/api/config/initializers/peek.rb index e3e3e1cbc42..56222705f7a 100644 --- a/src/api/config/initializers/peek.rb +++ b/src/api/config/initializers/peek.rb @@ -1,2 +1,3 @@ Peek.into Peek::Views::Mysql2 Peek.into Peek::Views::Dalli +Peek.into Peek::Views::Host From fde09eec58a36074aeab8afcd41c3db51a67676c Mon Sep 17 00:00:00 2001 From: Christian Bruckmayer Date: Wed, 6 Jun 2018 11:27:37 +0200 Subject: [PATCH 3/4] [ci] Remove old testsuite Dockerfile because we don't use it anymore. It was planned to use it for CI but we now use for all CI runs images build in OBS so this Dockerfile is obsolete. --- src/api/docker-files/Dockerfile.old-test-suite | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 src/api/docker-files/Dockerfile.old-test-suite diff --git a/src/api/docker-files/Dockerfile.old-test-suite b/src/api/docker-files/Dockerfile.old-test-suite deleted file mode 100644 index 95d92cc6228..00000000000 --- a/src/api/docker-files/Dockerfile.old-test-suite +++ /dev/null @@ -1,15 +0,0 @@ -FROM openbuildservice/frontend-base - -RUN /root/bin/docker-bootstrap.sh memcached -RUN /root/bin/docker-bootstrap.sh backend - -ADD --chown=frontend:users . /obs - -USER frontend -WORKDIR /obs/src/api - -# Refresh our bundle -RUN export NOKOGIRI_USE_SYSTEM_LIBRARIES=1; bundle install --jobs=3 --retry=3 || bundle install --jobs=3 --retry=3 - -# Run our command -CMD ["/bin/bash", "-l"] From 678cc1d5c3e9307865414dbe578d8015110d1ef4 Mon Sep 17 00:00:00 2001 From: Christian Bruckmayer Date: Thu, 7 Jun 2018 13:36:03 +0200 Subject: [PATCH 4/4] [frontend] Enable statistics for HAProxy in development --- contrib/haproxy.cfg | 7 +++++++ docker-compose.ha.yml | 1 + 2 files changed, 8 insertions(+) diff --git a/contrib/haproxy.cfg b/contrib/haproxy.cfg index 92c0894a226..8701080ce6d 100644 --- a/contrib/haproxy.cfg +++ b/contrib/haproxy.cfg @@ -24,3 +24,10 @@ backend nodes option httpchk HEAD /about HTTP/1.1\r\nHost:localhost server web01 frontend:3000 check resolvers dockerdns resolve-prefer ipv4 server web02 frontend_node_2:3000 check resolvers dockerdns resolve-prefer ipv4 + +listen stats + bind :32700 + stats enable + stats uri / + stats hide-version + stats auth Admin:opensuse diff --git a/docker-compose.ha.yml b/docker-compose.ha.yml index 731119d33e0..0bfd72ddc02 100644 --- a/docker-compose.ha.yml +++ b/docker-compose.ha.yml @@ -6,6 +6,7 @@ services: - ./contrib/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro ports: - "8080:80" + - "32700:32700" depends_on: - frontend - frontend_node_2