Skip to main content

WildFly Cluster on Raspberry Pi (Tech Tip #28)

Posted by arungupta on May 30, 2014 at 10:51 PM PDT

Tech Tip #25 showed how to configure WildFly on Raspberry Pi. Tech Tip #27 showed how to setup WildFly on two Raspberry Pis in managed domain mode. This tech tip will show how to setup a WildFly cluster over those two hosts.

WildFly supports mod_cluster out of the box. There are several advantages of mod_cluster:

  • Dynamic configuration of httpd workers
  • Server-side load balance factor calculation
  • Fine-grained web app lifecycle control

However there is no ARM build available for it, yet. So we'll use mod_proxy instead that gets pre-installed as part of Apache2. The Domain Controller and HTTP server need not be on the same host and that's the configuration we'll use for our setup. So effectively, there will be three Raspberry Pis:

  • Domain Controller
  • Host Controller
  • Web Server

raspi-cluster-techtip28

Lets get started!

  1. Before installing any modules, including Apache, on Raspbian, the system needs to be fully updated:
    pi@raspberrypi~ $ sudo apt-get update && sudo apt-get upgrade
    Get:1 http://reflection.oss.ou.edu wheezy Release.gpg [490 B]
    Hit http://repository.wolfram.com stable Release.gpg             
    Hit http://repository.wolfram.com stable Release                 
    Get:2 http://reflection.oss.ou.edu wheezy Release [14.4 kB]      
    Get:3 http://raspberrypi.collabora.com wheezy Release.gpg [836 B]
    Get:4 http://archive.raspberrypi.org wheezy Release.gpg [490 B] 

    . . .

    Setting up udisks (1.0.4-7wheezy1) ...
    Setting up rpi-update (20140321) ...
    Setting up ssh (1:6.0p1-4+deb7u1) ...
    Setting up perl-modules (5.14.2-21+rpi2+deb7u1) ...
    Setting up perl (5.14.2-21+rpi2+deb7u1) ...
    Setting up libdpkg-perl (1.16.14+rpi1) ...
    Setting up dpkg-dev (1.16.14+rpi1) ...
    Processing triggers for menu ...

    Trying to install Apache without updating the system will give weird errors:
    Err http://mirrordirector.raspbian.org/raspbian/ wheezy/main apache2.2-bin armhf 2.2.22-13
    404  Not Found
    Err http://mirrordirector.raspbian.org/raspbian/ wheezy/main apache2-utils armhf 2.2.22-13
    404  Not Found
    Err http://mirrordirector.raspbian.org/raspbian/ wheezy/main apache2.2-common armhf 2.2.22-13
    404  Not Found
    Err http://mirrordirector.raspbian.org/raspbian/ wheezy/main apache2-mpm-worker armhf 2.2.22-13
    404  Not Found
    Err http://mirrordirector.raspbian.org/raspbian/ wheezy/main apache2 armhf 2.2.22-13
    404  Not Found

    Now install Apache HTTP as:
    pi@raspberrypi /~ $ sudo apt-get install apache2
    Reading package lists... Done
    Building dependency tree
    Reading state information... Done
    The following extra packages will be installed:
    apache2-mpm-worker apache2-utils apache2.2-bin apache2.2-common libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap ssl-cert
    Suggested packages:
    apache2-doc apache2-suexec apache2-suexec-custom openssl-blacklist
    The following NEW packages will be installed:
    apache2 apache2-mpm-worker apache2-utils apache2.2-bin apache2.2-common libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap ssl-cert
    0 upgraded, 10 newly installed, 0 to remove and 1 not upgraded.
    Need to get 1,352 kB of archives.
    After this operation, 4,916 kB of additional disk space will be used.
    Do you want to continue [Y/n]? y
    Get:1 http://mirrordirector.raspbian.org/raspbian/ wheezy/main libapr1 armhf 1.4.6-3+deb7u1 [90.9 kB]
    Get:2 http://mirrordirector.raspbian.org/raspbian/ wheezy/main libaprutil1 armhf 1.4.1-3 [77.1 kB]

    . . .

    Setting up apache2-mpm-worker (2.2.22-13+deb7u1) ...
    [....] Starting web server: apache2apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
    . ok
    Setting up apache2 (2.2.22-13+deb7u1) ...
    Setting up ssl-cert (1.0.32) ...

    The log messages show that server's name could not be determined, and 127.0.1.1 is instead used for ServerName. This can be fixed by editing "/etc/apache2/apache2.conf" and adding the following line:
    ServerName localhost
  2. After Apache is installed, "mod_proxy" modules already exists in the "/usr/lib/apache2/modules" directory, and just need to enabled.Create "/etc/apache2/mods-enabled/mod_proxy.load" as:
    LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
    LoadModule proxy_balancer_module /usr/lib/apache2/modules/mod_proxy_balancer.so
    LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so
    LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so

    This file will be picked up via a direcinve in "/etc/apache2/apache2.conf".

    Restart the server:
    sudo service apache2 restart
    If there are any errors, then you can see them in "/var/log/apache2/error.log" directory.

    The list of modules loaded can be seen using:

    ~ /apachectl -t -D DUMP_MODULES
    Loaded Modules:
    core_module (static)
    log_config_module (static)
    logio_module (static)
    version_module (static)
    mpm_worker_module (static)
    http_module (static)
    so_module (static)
    alias_module (shared)
    auth_basic_module (shared)
    authn_file_module (shared)
    authz_default_module (shared)
    authz_groupfile_module (shared)
    authz_host_module (shared)
    authz_user_module (shared)
    autoindex_module (shared)
    cgid_module (shared)
    deflate_module (shared)
    dir_module (shared)
    env_module (shared)
    mime_module (shared)
    proxy_module (shared)
    proxy_balancer_module (shared)
    proxy_http_module (shared)
    headers_module (shared)

    negotiation_module (shared)
    reqtimeout_module (shared)
    setenvif_module (shared)
    status_module (shared)
    Syntax OK

    The newly loaded modules are highlighted in bold.
  3. Provide convenient host names for each of the Raspberry Pis. The names chosen for each host is shown in the table below:
    IP Address Role Host Name
    10.0.0.27 Domain Controller raspi-master
    10.0.0.28 Host Controller raspi-slave
    10.0.0.29 Web Server raspi-apache

    This is enabled by editing "/etc/hostname" on each Raspberry Pi and changing "raspberrypi" to the given name.

    In addition, "/etc/hosts" on each Raspberry Pi need to make two entries of the following format:

    127.0.0.1           <Host Name>
    <IP Address>        <Host Name>

    Here and for each host needs to be used from the table above.

    Finally, added the following entries on "/etc/hosts" on my local Mac:

    10.0.0.27       raspi-master.example.com
    10.0.0.28       raspi-slave.example.com
    10.0.0.29       raspi-apache.example.com

    This ensures that any cookies are set from the same domain.

    Flush the DNS using:
    sudo dscacheutil -flushcache
    Now raspi-master.example.com:8330 in the browser shows:

    raspi-master-defaultoutput-techtip28

    And similarly raspi-slave.example.com:8330 shows:

    raspi-slave-default-output-techtip28

  4. Configure mod_proxy load balancer by editing "/etc/apache2/apache2.conf" and add the following lines at the end of the file:
    Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
    <Proxy balancer://raspicluster>
    BalancerMember http://10.0.0.27:8330
    BalancerMember
    http://10.0.0.28:8330
    ProxySet
    stickysession=ROUTEID
    </Proxy>
    ProxyPass / balancer://raspicluster/

    This directive provide load balancing between "master" and "slave". "Header" and "ProxySet" directive provides sticky session.

Now accessing raspi-apache.example.com/http-1.0-SNAPSHOT/index.jsp shows:

raspi-apache-default-output-techtip28

And so in three parts (part 1 and part 2), we learned how to setup a WildFly cluster on Raspberry Pi!