Thursday, May 1, 2014

Loadbalancing owncloud with HA Proxy

This post shows more advanced loadbalancing for owncloud service. The primary concept is inspired by owncloud with dedicated php-fpm service post.
This architecture is more advanced and provides better scalability for load division and therefore better performance.
Performance is crucial factor for such a service providence and a single Raspberry Pi doesn't have much of it. This architecture (2 loadbalanced Raspberry Pi's) provides 33% performance increase and offers easily to connect more nodes.

HA Proxy provides software based loadbalancing, with numerous configuration options with statistics preview, and yet it can by relatively easy configured.

Connecting individual components:
My architecture consist of three nodes (2xRaspberry Pi and 1xNB). Each node is standardized, so there are only minor configuration differences for each of them (listen socket for nginx).

NOTE: this post does not explain how to setup NFS and enable firewall and access to mysql DB. See owncloud with dedicated php-fpm service post for more details.

Rasppi-p:
All basic services are running on this Raspberry (HA Proxy, nginx, php-fpm, mysql, nfsd).

HA Proxy configuration:
I use version 1.4. Configuration consists of two blocks: nginx and mysql.
/etc/haproxy/haproxy.cfg:
global
    log 127.0.0.1   local0
    log 127.0.0.1   local1 notice
    #log loghost    local0 info
    maxconn 128
    #chroot /usr/share/haproxy
    uid 99
    gid 99
    daemon
    #debug
    #quiet

defaults
    log global
    mode    tcp
    option  tcplog
    option  dontlognull
    retries 3
    option  redispatch
    maxconn 128
    contimeout  5000
    clitimeout  50000
    srvtimeout  50000

listen nginx-rasppi-p 172.16.0.1:443
    option  ssl-hello-chk
#   option  httpchk GET /alive HTTP/1.0 
    mode    tcp
    balance roundrobin
    server  rasppi-p 172.16.0.1:8443 weight 15  check inter 5000 rise 2 fall 3
    server  rasppi-t 172.16.0.3:8443 weight 10  check inter 5000 rise 2 fall 3
    server  krisko   172.16.0.2:8443 weight 200 check inter 5000 rise 2 fall 3

listen mysql-rasppi-p 172.16.0.1:3306
    mode    tcp
    balance roundrobin
    server  rasppi-p 172.16.0.1:3307 check inter 5000 rise 2 fall 3

Notice the different weight value, depending on CPU performance. While primary raspberry (rasppi-p) will process more requests as secondary (rasppi-ta), NB (krisko) will process almost all requests when it is connected.
Secondary raspberry should have less weight as primary, based on performance testing.

To add statistics to HA Proxy, add following section to its configuration:
listen stats 172.16.0.1:1936
    mode http
    stats enable
    stats hide-version
    stats realm Haproxy\ Statistics
    stats uri /
    stats auth user:secret
    stats refresh 10s
Now you can see statistics on URL 172.16.0.1:1936 (login is user, pw: secret).

Nodes configuration:
All nodes have installed nginx and php-fpm instance. HA Proxy section for nginx is connecting to each node (nginx listener). To successfully complete the configuration you need to enable for each node to be able to connect to HA Proxys' mysql listener (which will redirect traffic to mysqld listener).

Another important configuration part is the NFS. In Archlinux you need to enable and mount via NFS following three directories on each node:
  1. /mnt/owncloud (this is my owncloud data path)
  2. /usr/share/webapps/owncloud (owncloud installation path)
  3. /etc/webapps/owncloud/config (owncloud configuration path)
 Components diagram:
An advantage of sharing owncloud instance via NFS is that you only need to update/modify one instance and all nodes will be the same (with updated/modified owncloud).

4 comments:

  1. Fantastic sharing I will share these guides to all of my staff thanks.
    access Bee MP3 in UK

    ReplyDelete
  2. Nice tutorial , but how you can implement sticky-session , if you can provide me details, l would be thankful

    ReplyDelete
  3. Hi, you can find an example on stackoverflow:
    https://stackoverflow.com/questions/13495235/haproxy-and-sticky-session
    and more information in the haproxy documentation:
    https://cbonte.github.io/haproxy-dconv/configuration-1.5.html#4-cookie

    Hope this helps :)

    ReplyDelete
  4. Hi great tutorial with detail step. It seem easy to works with HA proxy. currently i am using Microleaves Dedicated Proxies It is working fine for me. I will try this one, if you have more information regarding this please send me complete detail.
    Regards,
    Gloria Walton

    ReplyDelete