首页 > 数据库 > NewSQL > TIDB分布式集群叠加HAProxy实现负载均衡
软件版本:
haproxy-2.0.20
keepalived-1.4.5
测试环境:
tidb集群:pd_server*3,tidb_server*3,tikv*3
一、修改内核参数
echo "net.ipv4.ip_nonlocal_bind=1" >> /etc/sysctl.conf echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p
net.ipv4.ip_nonlocal_bind=1 意思是启动haproxy的时候,允许忽视VIP的存在
net.ipv4.ip_forward = 1 haproxy代理服务器同时也要打开内核的转发功能
二、安装keepalived和haproxy
yum install kernel-devel openssl-devel popt-devel -y cd /software tar zxvf keepalived-1.4.5.tar.gz cd keepalived-1.4.5 ./configure --prefix=/usr/local/keepalived/ make && make install systemctl enable keepalived
vi /usr/local/keepalived/etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -d -S 0"
vi /etc/rsyslog.conf
local0.* /var/log/keepalived.log
systemctl restart rsyslog
cd /software tar zxvf haproxy-2.0.20.tar.gz cd haproxy-2.0.20 make TARGET=linux2628 PREFIX=/usr/local/haproxy make install PREFIX=/usr/local/haproxy /usr/local/haproxy/sbin/haproxy -v useradd -r -s /sbin/nologin haproxy touch /var/log/haproxy.log chmod 755 /var/log/haproxy.log
修改日志位置
vi /etc/rsyslog.conf local0.* /var/log/haproxy.log vi /etc/sysconfig/rsyslog SYSLOGD_OPTIONS="-r -m 0 -c 2" systemctl restart rsyslog
三、配置keepalived
172.16.254.95
/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id tidb
notification_email {
zdd5503@163.com
}
notification_email_from zdd5503@163.com
smtp_server stmp.163.com
smtp_connect_timeout 30
}
vrrp_script chk_haproxy {
script "/etc/keepalived/scripts/check_haproxy.sh"
interval 2
weight 2
}
vrrp_instance tidb {
interface enp0s3
state MASTER
virtual_router_id 88
priority 200
nopreempt
virtual_ipaddress {
172.16.254.88/24
}
track_script {
chk_haproxy
}
notify_master /etc/keepalived/scripts/haproxy_master.sh
notify_backup /etc/keepalived/scripts/haproxy_backup.sh
notify_fault /etc/keepalived/scripts/haproxy_fault.sh
notify_stop /etc/keepalived/scripts/haproxy_stop.sh
}
172.16.254.96
/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id tidb
notification_email {
zdd5503@163.com
}
notification_email_from zdd5503@163.com
smtp_server stmp.163.com
smtp_connect_timeout 30
}
vrrp_script chk_haproxy {
script "/etc/keepalived/scripts/check_haproxy.sh"
interval 2
weight 2
}
vrrp_instance tidb {
interface enp0s3
state BACKUP
virtual_router_id 88
priority 150
nopreempt
virtual_ipaddress {
172.16.254.88/24
}
track_script {
chk_haproxy
}
notify_master /etc/keepalived/scripts/haproxy_master.sh
notify_backup /etc/keepalived/scripts/haproxy_backup.sh
notify_fault /etc/keepalived/scripts/haproxy_fault.sh
notify_stop /etc/keepalived/scripts/haproxy_stop.sh
}
四、配置haproxy
172.16.254.95
global # 全局配置 log 127.0.0.1 local0 # 定义全局的 syslog 服务器,最多可以定义两个 chroot /usr/local/haproxy # 将当前目录为指定目录,设置超级用户权限启动进程,提高安全性 pidfile /usr/local/haproxy/haproxy.pid # 将 HAProxy 进程写入 PID 文件 maxconn 4000 # 设置每个 HAProxy 进程锁接受的最大并发连接数 user haproxy # 同 uid 参数,使用是用户名 group haproxy # 同 gid 参数,建议专用用户组 nbproc 40 # 启动多个进程来转发请求,需要调整到足够大的值来保证 HAProxy 本身不会成为瓶颈 daemon # 让 HAProxy 以守护进程的方式工作于后台,等同于“-D”选项的功能。当然,也可以在命令行中用“-db”选项将其禁用。 stats socket /usr/local/haproxy/stats # 定义统计信息保存位置 defaults # 默认配置 log global # 日志继承全局配置段的设置 retries 2 # 向上游服务器尝试连接的最大次数,超过此值就认为后端服务器不可用 timeout connect 2s # HAProxy 与后端服务器连接超时时间,如果在同一个局域网内可设置成较短的时间 timeout client 30000s # 定义客户端与 HAProxy 连接后,数据传输完毕,不再有数据传输,即非活动连接的超时时间 timeout server 30000s # 定义 HAProxy 与上游服务器非活动连接的超时时间 listen admin_stats # frontend 和 backend 的组合体,监控组的名称,按需自定义名称 bind 0.0.0.0:8080 # 配置监听端口 mode http # 配置监控运行的模式,此处为 `http` 模式 option httplog # 表示开始启用记录 HTTP 请求的日志功能 maxconn 10 # 最大并发连接数 stats refresh 30s # 配置每隔 30 秒自动刷新监控页面 stats uri /haproxy # 配置监控页面的 URL stats realm HAProxy # 配置监控页面的提示信息 stats auth admin:pingcap123 # 配置监控页面的用户和密码 admin,可以设置多个用户名 stats hide-version # 配置隐藏统计页面上的 HAProxy 版本信息 stats admin if TRUE # 配置手工启用/禁用,后端服务器(HAProxy-1.4.9 以后版本) listen tidb-cluster # 配置 database 负载均衡 bind 0.0.0.0:3390 # 配置浮动 IP 和 监听端口 mode tcp # HAProxy 中要使用第四层的应用层 balance leastconn # 连接数最少的服务器优先接收连接。`leastconn` 建议用于长会话服务,例如 LDAP、SQL、TSE 等,而不是短会话协议,如 HTTP。该算法是动态的,对于实例启动慢的服务器,权重会在运行中作调整。 server tidb5 172.16.254.95:4000 weight 1 check inter 2000 rise 2 fall 5 maxconn 300 server tidb6 172.16.254.96:4000 weight 1 check inter 2000 rise 2 fall 5 maxconn 300 server tidb7 172.16.254.97:4000 weight 1 check inter 2000 rise 2 fall 5 maxconn 300 #服务器定义,check inter 2000检测心跳频率,rise 2 2次正确认为服务器可用,fall 5 5次失败认为服务器不可用,#maxconn 300 最大连接数300
172.16.254.96
global # 全局配置 log 127.0.0.1 local0 # 定义全局的 syslog 服务器,最多可以定义两个 chroot /usr/local/haproxy # 将当前目录为指定目录,设置超级用户权限启动进程,提高安全性 pidfile /usr/local/haproxy/haproxy.pid # 将 HAProxy 进程写入 PID 文件 maxconn 4000 # 设置每个 HAProxy 进程锁接受的最大并发连接数 user haproxy # 同 uid 参数,使用是用户名 group haproxy # 同 gid 参数,建议专用用户组 nbproc 40 # 启动多个进程来转发请求,需要调整到足够大的值来保证 HAProxy 本身不会成为瓶颈 daemon # 让 HAProxy 以守护进程的方式工作于后台,等同于“-D”选项的功能。当然,也可以在命令行中用“-db”选项将其禁用。 stats socket /usr/local/haproxy/stats # 定义统计信息保存位置 defaults # 默认配置 log global # 日志继承全局配置段的设置 retries 2 # 向上游服务器尝试连接的最大次数,超过此值就认为后端服务器不可用 timeout connect 2s # HAProxy 与后端服务器连接超时时间,如果在同一个局域网内可设置成较短的时间 timeout client 30000s # 定义客户端与 HAProxy 连接后,数据传输完毕,不再有数据传输,即非活动连接的超时时间 timeout server 30000s # 定义 HAProxy 与上游服务器非活动连接的超时时间 listen admin_stats # frontend 和 backend 的组合体,监控组的名称,按需自定义名称 bind 0.0.0.0:8080 # 配置监听端口 mode http # 配置监控运行的模式,此处为 `http` 模式 option httplog # 表示开始启用记录 HTTP 请求的日志功能 maxconn 10 # 最大并发连接数 stats refresh 30s # 配置每隔 30 秒自动刷新监控页面 stats uri /haproxy # 配置监控页面的 URL stats realm HAProxy # 配置监控页面的提示信息 stats auth admin:pingcap123 # 配置监控页面的用户和密码 admin,可以设置多个用户名 stats hide-version # 配置隐藏统计页面上的 HAProxy 版本信息 stats admin if TRUE # 配置手工启用/禁用,后端服务器(HAProxy-1.4.9 以后版本) listen tidb-cluster # 配置 database 负载均衡 bind 0.0.0.0:3390 # 配置浮动 IP 和 监听端口 mode tcp # HAProxy 中要使用第四层的应用层 balance leastconn # 连接数最少的服务器优先接收连接。`leastconn` 建议用于长会话服务,例如 LDAP、SQL、TSE 等,而不是短会话协议,如 HTTP。该算法是动态的,对于实例启动慢的服务器,权重会在运行中作调整。 server tidb5 172.16.254.95:4000 weight 1 check inter 2000 rise 2 fall 5 maxconn 300 server tidb6 172.16.254.96:4000 weight 1 check inter 2000 rise 2 fall 5 maxconn 300 server tidb7 172.16.254.97:4000 weight 1 check inter 2000 rise 2 fall 5 maxconn 300 #服务器定义,check inter 2000检测心跳频率,rise 2 2次正确认为服务器可用,fall 5 5次失败认为服务器不可用,#maxconn 300 最大连接数300
172.16.254.95和172.16.254.96都做如下配置:
mkdir -p /etc/keepalived/scripts
vi /etc/keepalived/scripts/check_haproxy.sh
#!/bin/bash STARTHAPROXY="/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg" #STOPKEEPALIVED="systemctl stop keepalived" LOGFILE="/etc/keepalived/scripts/keepalived-haproxy-state.log" echo "[check_haproxy status]" >> $LOGFILE A=`ps -C haproxy --no-header |wc -l` echo "[check_haproxy status]" >> $LOGFILE date >> $LOGFILE if [ $A -eq 0 ];then echo $STARTHAPROXY >> $LOGFILE $STARTHAPROXY >> $LOGFILE 2>&1 sleep 5 fi if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then exit 0 else exit 1 fi
vi /etc/keepalived/scripts/haproxy_master.sh
#!/bin/bash
STARTHAPROXY=`/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg`
STOPHAPROXY=`ps -ef |grep sbin/haproxy| grep -v grep|awk '{print $2}'|xargs kill -s 9`
LOGFILE="/etc/keepalived/scripts/keepalived-haproxy-state.log"
echo "[master]" >> $LOGFILE
date >> $LOGFILE
echo "Being master...." >> $LOGFILE 2>&1
echo "stop haproxy...." >> $LOGFILE 2>&1
$STOPHAPROXY >> $LOGFILE 2>&1
echo "start haproxy...." >> $LOGFILE 2>&1
$STARTHAPROXY >> $LOGFILE 2>&1
echo "haproxy stared ..." >> $LOGFILE
vi /etc/keepalived/scripts/haproxy_backup.sh
#!/bin/bash
STARTHAPROXY=`/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg`
STOPHAPROXY=`ps -ef |grep sbin/haproxy| grep -v grep|awk '{print $2}'|xargs
kill -s 9`
LOGFILE="/etc/keepalived/scripts/keepalived-haproxy-state.log"
echo "[master]" >> $LOGFILE
date >> $LOGFILE
echo "Being master...." >> $LOGFILE 2>&1
echo "stop haproxy...." >> $LOGFILE 2>&1
$STOPHAPROXY >> $LOGFILE 2>&1
echo "start haproxy...." >> $LOGFILE 2>&1
$STARTHAPROXY >> $LOGFILE 2>&1
echo "haproxy stared ..." >> $LOGFILE
vi /etc/keepalived/scripts/haproxy_fault.sh
#!/bin/bash LOGFILE=/etc/keepalived/scripts/keepalived-haproxy-state.log echo "[fault]" >> $LOGFILE date >> $LOGFILE
vi /etc/keepalived/scripts/haproxy_stop.sh
#!/bin/bash LOGFILE=/etc/keepalived/scripts/keepalived-haproxy-state.log echo "[stop]" >> $LOGFILE date >> $LOGFILE
更改脚本属性
chmod 755 /etc/keepalived/scripts/*
五、添加 haproxy_check 用户
mysql> create user haproxy_check@'%' identified by 'haproxy_check'; Query OK, 0 rows affected (0.13 sec) mysql> grant select on *.* to haproxy_check@'%'; Query OK, 0 rows affected (0.06 sec)
六、启动 keepalived
systemctl daemon-reload systemctl enable keepalived systemctl start keepalived
ip a |grep 98 ps -ef |grep keepalived
七、配置keepalived监控脚本
两个节点都做如下配置:
vi /etc/keepalived/keepcheck.sh
#!/bin/bash while : do keepalivedcheck=`ps -C keepalived --no-header | wc -l` if [ $keepalivedcheck -eq 0 ];then systemctl start keepalived else echo "keepalived is running" fi sleep 5 done
chmod +x /etc/keepalived/keepcheck.sh nohup /etc/keepalived/keepcheck.sh & echo "nohup /etc/keepalived/keepcheck.sh &" >> /etc/rc.d/rc.local
八、配置haproxy 启动脚本
vim /etc/rc.d/init.d/haproxy
#! /bin/sh
set -e
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/haproxy/sbin
PROGDIR=/usr/local/haproxy
PROGNAME=haproxy
DAEMON=$PROGDIR/sbin/$PROGNAME
CONFIG=$PROGDIR/$PROGNAME.cfg
PIDFILE=$PROGDIR/$PROGNAME.pid
DESC="HAProxy daemon"
SCRIPTNAME=/etc/init.d/$PROGNAME
# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0
start()
{
echo -n "Starting $DESC: $PROGNAME"
$DAEMON -f $CONFIG
echo "."
}
stop()
{
echo -n "Stopping $DESC: $PROGNAME"
haproxy_pid=`cat $PIDFILE`
kill -9 $haproxy_pid
echo "."
}
restart()
{
echo -n "Restarting $DESC: $PROGNAME"
$DAEMON -f $CONFIG -p $PIDFILE -sf $(cat $PIDFILE)
echo "."
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2
exit 1
;;
esac
exit 0
chmod +x /etc/rc.d/init.d/haproxy echo "nohup /etc/rc.d/init.d/haproxy start &" >> /etc/rc.d/rc.local
systemctl stop keepalived systemctl start keepalived tail -f /var/log/keepalived.log
/etc/rc.d/init.d/haproxy start /etc/rc.d/init.d/haproxy stop tail -f /var/log/haproxy.log
haproxy控制台访问地址:
http://172.16.254.88:8080/haproxy-stat
九、测试负载均衡
[root@tidb5 tidb]# mysql -uroot -h172.16.254.88 -P 3390 -e "select @@hostname;" +------------+ | @@hostname | +------------+ | tidb5 | +------------+ [root@tidb5 tidb]# mysql -uroot -h172.16.254.88 -P 3390 -e "select @@hostname;" +------------+ | @@hostname | +------------+ | tidb7 | +------------+ [root@tidb5 tidb]# mysql -uroot -h172.16.254.88 -P 3390 -e "select @@hostname;" +------------+ | @@hostname | +------------+ | tidb7 | +------------+ [root@tidb5 tidb]# mysql -uroot -h172.16.254.88 -P 3390 -e "select @@hostname;" +------------+ | @@hostname | +------------+ | tidb5 | +------------+ [root@tidb5 tidb]# mysql -uroot -h172.16.254.88 -P 3390 -e "select @@hostname;" +------------+ | @@hostname | +------------+ | tidb6 | +------------+ [root@tidb5 tidb]# mysql -uroot -h172.16.254.88 -P 3390 -e "select @@hostname;" +------------+ | @@hostname | +------------+ | tidb5 | +------------+ [root@tidb5 tidb]# mysql -uroot -h172.16.254.88 -P 3390 -e "select @@hostname;" +------------+ | @@hostname | +------------+ | tidb5 | +------------+ [root@tidb5 tidb]# mysql -uroot -h172.16.254.88 -P 3390 -e "select @@hostname;" +------------+ | @@hostname | +------------+ | tidb6 | +------------+ [root@tidb5 tidb]# mysql -uroot -h172.16.254.88 -P 3390 -e "select @@hostname;" +------------+ | @@hostname | +------------+ | tidb7 | +------------+
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30135314/viewspace-2758606/ ,如需转载,请注明出处,否则将追究法律责任。