在部署mysql 主主高可用时,使用haproxy进行负载,在服务部使用的情况下发现服务器cpu占比高,负载也高,因此急需解决这个问题。
1.解决前现状
1.1 部署配置文件
cat > haproxy.cfg << EOF
global
maxconn 4000
nbthread 2
daemon
defaults
log global
log 127.0.0.1 local3
mode http
option tcplog
option dontlognull
retries 10
option redispatch
maxconn 2000
timeout connect 30s
timeout client 10m
timeout server 10m
#timeout http-keep-alive 10s
timeout check 10s
######## 监控界面配置 #################
listen admin_stats
#监控界面的访问的IP和端口
bind 0.0.0.0:8888
#访问协议
mode http
#URI相对地址
stats uri /dbs
#统计报告格式
stats realm Global\ statistics
#登陆帐户信息
stats auth admin:admin
# 隐藏HAProxy的版本号
stats hide-version
# 管理界面,如果认证成功了,可通过webui管理节点
stats admin if TRUE
# 统计页面自动刷新时间
stats refresh 30s
listen mysql
bind 0.0.0.0:3306
mode tcp
#负载均衡算法(轮询算法)
#轮询算法:roundrobin
#权重算法:static-rr
#最少连接算法:leastconn
#请求源IP算法:source
balance roundrobin
# 监控检查需要一个无密码的账号
# mysql健康检查 haproxy为mysql登录用户名(需要在实体数据有这个账户,且无密码)
# option mysql-check user haproxy
server s1 mysql-master1:3306 check weight 1 maxconn 2000 inter 5000 rise 2 fall 2
server s2 mysql-master2:3306 check weight 1 maxconn 2000 inter 5000 rise 2 fall 2 backup
EOF
cat > dokcer-stark-haproxy.yml << EOF
version: '3'
networks:
liuhm-net:
external: true
services:
haproxy:
image: haproxy:alpine
hostname: haproxy
volumes:
- "${PWD}/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg"
- "/etc/localtime:/etc/localtime:ro"
restart: always
privileged: true
ports:
- 8888:8888
- 3306:3306
networks:
- liuhm-net
deploy:
mode: global
EOF
2.解决后
- 修改了镜像版haproxy:2.9.1-alpine
- 增加了配置 tune.disable-zero-copy-forwarding
- github 解决问题地址
cat > haproxy.cfg << EOF
global
maxconn 4000
nbthread 2
daemon
## tune.disable-zero-copy-forwarding必须配置,不然cpu占比很高
tune.disable-zero-copy-forwarding
defaults
log global
log 127.0.0.1 local3
mode http
option tcplog
option dontlognull
retries 10
option redispatch
maxconn 2000
timeout connect 30s
timeout client 10m
timeout server 10m
#timeout http-keep-alive 10s
timeout check 10s
######## 监控界面配置 #################
listen admin_stats
#监控界面的访问的IP和端口
bind 0.0.0.0:8888
#访问协议
mode http
#URI相对地址
stats uri /dbs
#统计报告格式
stats realm Global\ statistics
#登陆帐户信息
stats auth admin:admin
# 隐藏HAProxy的版本号
stats hide-version
# 管理界面,如果认证成功了,可通过webui管理节点
stats admin if TRUE
# 统计页面自动刷新时间
stats refresh 30s
listen mysql
bind 0.0.0.0:3306
mode tcp
#负载均衡算法(轮询算法)
#轮询算法:roundrobin
#权重算法:static-rr
#最少连接算法:leastconn
#请求源IP算法:source
balance roundrobin
# 监控检查需要一个无密码的账号
# mysql健康检查 haproxy为mysql登录用户名(需要在实体数据有这个账户,且无密码)
# option mysql-check user haproxy
server s1 mysql-master1:3306 check weight 1 maxconn 2000 inter 5000 rise 2 fall 2
server s2 mysql-master2:3306 check weight 1 maxconn 2000 inter 5000 rise 2 fall 2 backup
EOF
cat > dokcer-stark-haproxy.yml << EOF
version: '3'
networks:
liuhm-net:
external: true
services:
haproxy:
image: haproxy:2.9.1-alpine
hostname: haproxy
volumes:
- "${PWD}/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg"
- "/etc/localtime:/etc/localtime:ro"
restart: always
privileged: true
ports:
- 8888:8888
- 3306:3306
networks:
- liuhm-net
deploy:
mode: global
EOF
实际配置后没有飙升