haproxy+keepalived实现双主模式下的高可用正向代理
一、背景简介
为了解决本地集群不能直达数据接收端的现状。使用haproxy做四层代理,keealived解决代理端单点故障。
HAProxy简介:HAProxy是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,HAProxy是完全免费的、借助HAProxy可以快速并且可靠的提供基于TCP和HTTP应用的代理解决方案。
keepalived简介:keepalived是集群管理中保证集群高可用的一个服务软件,它的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后,自动将web服务器加入到服务器集群中。解决了静态路由的单点故障问题。
二、环境介绍
系统:centos7.2
软件版本:keepalived-2.0.20.tar.gz, haproxy-2.1.3.tar.gz
IP:
ha_master1:192.168.1.236
vip1:192.168.1.239
ha_master2:192.168.1.238
vip2:192.168.1.240
es01:192.168.2.235
es02:192.168.2.237
三、基础架构图
四、系统调优
vi /etc/sysctl.conf
vm.swappiness = 1 ##最大限度使用物理内存
net.ipv4.tcp_tw_reuse = 1 ##允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
fs.file-max = 12553500 #文件描述符的最大值
fs.nr_open = 12453500 ##单个进程所允许的文件句柄的最大数目
kernel.msgmax = 65536 #整个系统最大消息队列数量限制
net.core.netdev_max_backlog = 262144 #修改16384,每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目,对重负载服务器而言,该值需要调高一点
net.core.rmem_default = 873200 #默认的接收窗口大小(以字节为单位)
net.core.wmem_default = 873200 #默认的发送窗口大小(以字节为单位)
net.core.rmem_max = 8388608 #接收套接字缓冲区大小的最大值(以字节为单位)
net.core.wmem_max = 8388608 #发送套接字缓冲区大小的最大值(以字节为单位)
net.core.somaxconn = 65535 #已经成功建立连接等待被应用程序接受(accept调用)的(ESTABLISHED)队列长度(等待被接受的连接个数)
net.ipv4.tcp_tw_recycle = 1 #表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭
net.ipv4.tcp_rmem = 4096 87380 8388608 ##为自动调优定义socket使用的内存.第一个值是为socket接收缓冲区分配的最少字节数;第二个值是默认值(该值会被rmem_default覆盖), 缓冲区在系统负载不重的情况下可以增长到这个值;第三个值是接收缓冲区空间的最大字节数(该值会被rmem_max覆盖)
net.ipv4.tcp_wmem = 4096 16384 8388608 #为自动调优定义socket使用的内存.第一个值是为socket发送缓冲区分配的最少字节数;第二个值是默认值(该值会被wmem_default覆盖),缓冲区在系统负载不重的情况下可以增长到这个值;第三个值是发送缓冲区空间的最大字节数(该值会被wmem_max覆盖)
net.ipv4.tcp_max_syn_backlog = 655360 # 默认1024,对重负载服务器,可调整到2048,以以容纳更多等待连接的网络连接
vm.max_map_count = 262144 #单进程可以使用的最大map内存区域数量
sysctl -p 使配置生效
五、安装HAProxy
解压缩
tar xf haproxy-2.1.3.tar.gz
cd haproxy-2.1.3
yum install -y openssl openssl-devel systemd-devel.x86_64 gcc
uname -r
make TARGET=linux3100 CPU=x86_64 PREFIX=/usr/local/haproxy #TARGET对应内核版本号
make install PREFIX=/usr/local/haproxy
mkdir -p /usr/local/haproxy/conf #创建配置目录
mkdir -p /etc/haproxy #创建配置目录
mkdir -p /usr/share/haproxy/ #防止启动出错
touch /usr/local/haproxy/conf/haproxy.cfg #创建配置文件
ln -s /usr/local/haproxy/conf/haproxy.cfg /etc/haproxy/haproxy.cfg #添加配置文件
mkdir -p /usr/local/haproxy/log #创建日志文件
touch /usr/local/haproxy/log/haproxy.log #创建日志文件
ln -s /usr/local/haproxy/log/haproxy.log /var/log/haproxy.log #添加软链接
cp /opt/haproxy-2.1.3/examples/haproxy.init /etc/rc.d/init.d/haproxy #做成系统服务
chmod +x /etc/rc.d/init.d/haproxy #添加脚本权限
chkconfig haproxy on #设置开机启动
ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin #添加软链接
groupadd haproxy #添加haproxy的组
useradd -g haproxy haproxy -s /bin/false
vim /usr/local/haproxy/conf/haproxy.cfg ###两个节点配置文件相同
#全局配置部分
global
#定义全局日志
log 127.0.0.1 local0 warning
#log loghost local0 info
#运行路径
chroot /usr/share/haproxy
#PID 文件存放路径
pidfile /var/run/haproxy.pid
#设置每haproxy进程的最大并发连接数
maxconn 3000000
ulimit-n 1000000
maxconnrate 3000000
maxsessrate 3000000
#maxsslconn 65535
#maxsslrate 65535
#stats maxconn 50
#运行haproxy 用户, 或者使用关键字uid
user haproxy
#运行haproxy 用户组, 或者使用关键字gid
group haproxy
#运行模式,daemon/debug/quiet
daemon
#设置启动的haproxy进程数量, 只能用于守护进程模式的haproxy
nbproc 1
#定义统计信息保存位置
stats socket /usr/local/haproxy/stats
#默认配置
defaults
#默认到模式 tcp:4层转发 http:7层转发
mode tcp
#继承全局的日志定义输出
log global
#自动重试
option redispatch
#自动结束比较久没成功的连接
option abortonclose
#连接重试次数
retries 3
#各类超时时间
timeout http-request 300s
timeout queue 1m
timeout connect 300s
timeout client 1m
timeout server 1m
timeout http-keep-alive 300s
timeout check 300s
#最大并发数
maxconn 3000000
#数据转发至192.168.2.235和237的9200端口。
listen 9200
bind *:9200
balance roundrobin
mode tcp
#maxconn 3000000
server hadoop002 192.168.2.235:9200
server hadoop002 192.168.2.237:9200
listen admin_status
#配置监控运行模式
mode http
#配置统计页面访问端口 后台管理的链接端口
bind 0.0.0.0:54321
#统计页面默认最大连接数
maxconn 2
#http日志格式
option httplog
#开启统计
stats enable
#隐藏统计页面上的haproxy版本信息
stats hide-version
#监控页面自动刷新时间
stats refresh 30s
#统计页面访问url 页面地址可以自己设置http://*.*.*.*:54321/bryan
stats uri /bryan
#统计页面密码框提示文本
stats realm bryan xu
#监控页面的用户和密码:admin, 可设置多个用户名
stats auth admin:admin
#手工启动/禁用后端服务器, 可通过web管理节点
stats admin if TRUE
/etc/init.d/haproxy restart
六、安装keeplived
yum install libnl* libnfnetlink-devel -y
tar xf keepalived-2.0.20.tar.gz
cd keepalived-2.0.20
./configure --prefix=/usr/local/keepalived
make && make install
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /opt/keepalived-2.0.20/keepalived/etc/init.d/keepalived /etc/init.d/keepalived
chmod +x /etc/init.d/keepalived
编译过程中遇到以下错误,先找到openssl的路径
check/libcheck.a(check_ssl.o): In function build_ssl_ctx': /opt/keepalived-2.0.20/keepalived/check/check_ssl.c:81: undefined reference toOPENSSL_init_ssl’
/opt/keepalived-2.0.20/keepalived/check/check_ssl.c:82: undefined reference to `OPENSSL_init_ssl’
重新编译
LDFLAGS="$LDFAGS -L /usr/local/openssl/lib/" ./configure --prefix=/usr/local/keepalived
ln -s /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
节点一修改主配置文件vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id HAproxy
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_haproxy{
script "/usr/local/keepalived/check_haproxy.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state MASTER
interface enp4s0f0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script{
chk_haproxy
}
virtual_ipaddress {
192.168.1.239
}
notify_master "/usr/local/keepalived/clean_arp.sh 192.168.1.239"
}
vrrp_instance VI_2 {
state BACKUP
interface enp4s0f0
virtual_router_id 52
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.240
}
notify_master "/usr/local/keeplived/clean_arp.sh 192.168.1.240"
}
节点二主配置文件 vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id HAproxy1
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_haproxy{
script "/usr/local/keepalived/check_haproxy.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP
interface enp4s0f0
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script{
chk_haproxy
}
virtual_ipaddress {
192.168.1.239
}
notify_master "/usr/local/keepalived/clean_arp.sh 192.168.1.239"
}
vrrp_instance VI_2 {
state MASTER
interface enp4s0f0
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.240
}
notify_master "/usr/local/keepalived/clean_arp.sh 192.168.145.240"
}
设置HAproxy服务监控脚本(两台机器均要操作)
vim /etc/keepalived/check_haproxy.sh
#!/bin/bash
A=ps -C haproxy --no-header | wc -l
if [ $A -eq 0 ];then
/etc/init.d/haproxy start
sleep 3
if [ps -C haproxy --no-header | wc -l-eq 0 ];then
/etc/init.d/keepalived stop
fi
fi
chmod +x /etc/keepalived/check_haproxy.sh
vim /etc/keepalived/clean_arp.sh
#!/bin/sh
VIP=$1
GATEWAY=192.168.1.254 #网关地址
/sbin/arping -I eth0 -c 5 -s $VIP $GATEWAY &>/dev/null
/etc/init.d/keepalived start
ip addr查看网卡
ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp4s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 6c:92:bf:23:84:2c brd ff:ff:ff:ff:ff:ff
inet 192.168.1.238/24 brd 192.168.1.255 scope global noprefixroute enp4s0f0
valid_lft forever preferred_lft forever
inet 192.168.1.240/32 scope global enp4s0f0
valid_lft forever preferred_lft forever
inet6 fe80::6e92:bfff:fe23:842c/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: enp4s0f1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether 6c:92:bf:23:84:2d brd ff:ff:ff:ff:ff:ff
七、对HAProxy进行压测
使用vegeta进行测试:
wget https://github.com/tsenart/vegeta/releases/download/v8.0.0/vegeta-8.0.0-linux-amd64.tar.gz
tar zxvf vegeta-8.0.0-linux-amd64.tar.gz
测试命令
echo “GET http://192.168.1.239:9200” | ./vegeta -cpus=12 attack -duration=3m -header=“sleep:6000” -rate=50000 -workers=1200 -timeout=1800s | tee reports.bin | ./vegeta report
-duration 3m为持续时间
-rate 200050为每秒50000个请求
-workers 1200个线程
sleep为设置后端随机响应时间,以保持连接。
测试对比结果
调整sleep时间和增加压测客户端数量,查看estab数量
查看命令: ss -s&&free -g