Build an EMQX cluster based on HAProxy

HAProxy is free, open source software that provides a high availability load balancer and proxy server for TCP and HTTP-based applications that spreads requests across multiple servers. It is written in C and has a reputation for being fast and efficient (in terms of processor and memory usage). 1
Preparation
Software versions
- Ubuntu 18.04
- EMQX Broker v4.2.5
- HAProxy 2.2+
Machine allocation
- 172.16.239.107: HAProxy
- 172.16.239.108: EMQX Node 1
- 172.16.239.109: EMQX Node 2
Installation
EMQX
Refer to EMQX Broker
wget https://www.emqx.com/en/downloads/broker/v4.2.5/emqx-ubuntu18.04-4.2.5-x86_64.zip
unzip emqx-ubuntu18.04-4.2.5-x86_64.zip
HAProxy
sudo apt-get update
sudo apt-get install software-properties-common -y
sudo add-apt-repository -y ppa:vbernat/haproxy-2.2
sudo apt-get update
sudo apt-get install -y haproxy=2.2.\*
Configuration
EMQX
Modify emqx/etc/emqx.conf configuration file, and same for the other machine.
## Modify the node name
node.name = emqx@172.16.239.108
## Modify the cluster strategy to static, and no need to add nodes manually any more
cluster.discovery = static
## All cluster nodes
cluster.static.seeds = emqx@172.16.239.108, emqx@172.16.239.109
## To obtain an IP address, you need to set the proxy_protocol
listener.tcp.external.proxy_protocol = on
HAProxy
Modify /etc/haproxy/haproxy.cfg.
Add TCP backend configuration.
backend backend_emqx_tcp
mode tcp
balance roundrobin
server emqx_node_1 172.16.239.108:1883 check-send-proxy send-proxy-v2 check inter 10s fall 2 rise 5
server emqx_node_2 172.16.239.109:1883 check-send-proxy send-proxy-v2 check inter 10s fall 2 rise 5
Add dashboard backend configuration.
backend backend_emqx_dashboard
balance roundrobin
server emqx_node_1 172.16.239.108:18083 check
server emqx_node_2 172.16.239.109:18083 check
Add TCP frontend configuration.
frontend frontend_emqx_tcp
bind *:1883
option tcplog
mode tcp
default_backend backend_emqx_tcp
Add dashboard frontend configuration.
frontend frontend_emqx_dashboard
bind *:18083
option tcplog
mode tcp
default_backend backend_emqx_dashboard
Run
EMQX
$ ./bin/emqx start
## Check the cluster status
$ ./bin/emqx_ctl cluster status
Cluster status: #{running_nodes =>
['emqx@172.16.239.108','emqx@172.16.239.109'],
stopped_nodes => []}
HAProxy
$ sudo service haproxy start
You can access the dashboard via 18083 now.

Connect to the cluster via 1883. The connection status can be checked in the dashboard or by executing the command on the node.
$ ./bin/emqx_ctl clients list
Certificate
If you need TLS termination, you need to prepare the emqx.key and emqx.crt files first and then merge them to produce the emqx.pem file.
$ cat emqx.crt emqx.key > emqx.pem
Then just add the following configuration.
frontend frontend_emqx_tcp
bind *:8883 ssl crt /opt/certs/emqx.pem no-sslv3
option tcplog
mode tcp
default_backend backend_emqx_tcp
So far, we have completed the build and use of the EMQX cluster based on HAProxy. For more detailed use of HAProxy, see HAProxy Documentation.
