最近在项目中需要部署高可用的EMQX集群,这里我们部署 HAproxy 做 EMQX 的负载均衡器,特此记录便于日后查阅。
1、Docker部署
$ docker run -d -p 8999:8999 -p 5678:5678 -p 8001:8001 --name haproxy -v /haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro haproxy:2.1.7
2、编译安装
首先安装HAproxy所以来的编译环境,命令如下:
$ yum install -y openssl openssl-devel systemd-devel.x86_64
$ yum install apr-util apr-util-devel apr apr-devel pcre pcre-devel zlib zlib-devel openssl openssl-devel gcc cmake gcc-c++ -y
注:本文使用的HAproxy版本为2.1.7,其他版本传送门: HAproxy其它版本下载地址
然后下载源码 -> 解压 -> 编译,命令如下:
$ wget https://src.fedoraproject.org/repo/pkgs/haproxy/haproxy-2.1.7.tar.gz/sha512/d3338f128042f40e2969094a614eb840b1bf7409efa4f85aed7f45411af8532d2f2371436902e7b987b661580f9c21439fc027a65bb2d352cb86711a26545adb/haproxy-2.1.7.tar.gz
$ tar -zxvf haproxy-2.1.7.tar.gz
$ cd /root/haproxy-2.1.7
$ make TARGET=linux-glibc USE_OPENSSL=1 USE_SYSTEMD=1 USE_PCRE=1 USE_ZLIB=1 PREFIX=/usr/local/haproxy && make install PREFIX=/usr/local/haproxy
配置HAproxy开机自启动服务,命令如下:
$ vim /usr/lib/systemd/system/haproxy.service
haproxy.service 服务文件,内容如下:
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
ExecStartPre=/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
ExecStart=/usr/local/haproxy/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target
配置文件 /etc/haproxy/haproxy.cfg 需自行配置,不自动生成,命令如下:
$ mkdir /etc/haproxy
$ cp /haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg
修改默认的 haproxy.cfg 配置文件(以EMQX负载均衡修改为例),命令如下:
$ vim /etc/haproxy/haproxy.cfg
修改后内容如下:
global
log 127.0.0.1 local0 info
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 10000 # See also: ulimit -n
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats.sock mode 600 level admin
stats timeout 2m
defaults
mode tcp
log global
option dontlognull
option redispatch
timeout http-request 10s
retries 3
timeout queue 45s
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 10000
listen stats
mode http
bind 0.0.0.0:8089
stats enable
stats uri /admin?stats
stats realm Haproxy\ Statistics
stats auth admin:admin
stats admin if TRUE
listen emqx
bind *:80
mode tcp
maxconn 50000
timeout client 600s
default_backend emqx_cluster
backend emqx_cluster
mode tcp
balance source
timeout server 50s
timeout check 5000
server emqx1 172.18.123.138:1883 check inter 10000 fall 2 rise 5 weight 1
server emqx2 172.18.123.139:1883 check inter 10000 fall 2 rise 5 weight 1
frontend emqtt-admin-front
bind *:8088
default_backend emqtt-admin-backend
backend emqtt-admin-backend
balance roundrobin
server emqx1 172.18.123.138:18083 check
server emqx2 172.18.123.139:18083 check
注:其中 172.18.123.138:1883 为 EMQX 的内网通信端口,172.18.123.138:18083 为 EMQX 的内网控制台访问端口,如果需要外网访问EMQX控制台,则需要添加路由器端口映射规则,将EMQX控制台的内网端口映射到外网端口即可(阿里云服务器则需要配置安全组策略将端口放行)。
配置文件修改完成启动,命令如下:
$ systemctl daemon-reload
$ systemctl enable haproxy
$ systemctl start haproxy
到此HAproxy负载均衡配置完成。