拓扑图
- Haproxy 提供 TCP 协议下的负载均衡能力,TiDB 客户端通过连接 Haproxy 提供的浮动 IP 即可对数据进行操作,实现 TiDB Server 层的负载均衡。
- 同时,Haproxy 部署2个节点,使用KeepAlived来实现高可用。一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟 IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候, 备份服务器就会接管虚拟 IP,继续提供服务,从而保证了高可用性。
安装Haproxy
下载Haproxy
- 下载地址:https://src.fedoraproject.org/repo/pkgs/haproxy/
- 这里用的是
haproxy-1.8.25.tar.gz
版本。
安装Haproxy
在 172.23.57.232 和 172.23.57.233 上都进行安装。
mkdir /home/software # 将haproxy-1.8.25.tar.gz上传到/home/software目录下
cd /home/software
tar -xvf haproxy-1.8.25.tar.gz
cd haproxy-1.8.25/
make TARGET=4.19.0-91.82.152.uelc20.x86_64 # uname -r 来查看内核版本
sudo make install PREFIX=/home/haproxy # 安装到指定路径
cd /home/haproxy
mkdir conf pid # 分别用来存放配置、进程文件
配置Haproxy
vi /home/haproxy/conf/haproxy.cfg
将下面配置信息写入haproxy.cfg中
global
log 127.0.0.1 local0 info
maxconn 4096
daemon
nbproc 1 # 进程数,创建多个进程,能够减少每个进程的任务队列,但是过多的进程可能会导致进程的崩溃
#nbthread 1 # 最大线程数。线程数的上限与 CPU 数量相同。
pidfile /home/haproxy/pid/haproxy.pid
defaults
log global # 日志继承全局配置段的设置。
retries 3 # 连接后端服务器失败的次数如果超过这里设置的值,haproxy会将对应的后端服务器标记为不可用
timeout connect 2s
timeout client 30000s
timeout server 30000s
timeout check 5s
# 接入配置
listen tidb-cluster # 配置 database 负载均衡。
bind 0.0.0.0:4000 # 浮动 IP 和 监听端口。
mode tcp # HAProxy 要使用第 4 层的传输层。
balance leastconn # 连接数最少的服务器优先接收连接。`leastconn` 建议用于长会话服务,例如 LDAP、SQL、TSE 等,而不是短会话协议,如 HTTP。该算法是动态的,对于启动慢的服务器,服务器权重会在运行中作调整。
server tidb-87 172.23.57.87:4000 check inter 2000 rise 2 fall 3 # 检测 4000 端口,检测频率为每 2000 毫秒一次。如果 2 次检测为成功,则认为服务器可用;如果 3 次检测为失败,则认为服务器不可用。
server tidb-88 172.23.57.88:4000 check inter 2000 rise 2 fall 3
server tidb-89 172.23.57.89:4000 check inter 2000 rise 2 fall 3
# 监控页面
listen admin_stats
bind 0.0.0.0:11001
mode http
option httplog # 开始启用记录 HTTP 请求的日志功能。
maxconn 10 # 最大并发连接数。
stats refresh 30s
stats uri /admin
stats realm welcome login\ Haproxy
stats auth admin:admin123
stats hide-version # 隐藏监控页面上的 HAProxy 版本信息。
stats admin if TRUE # 通过设置此选项,可以在监控页面上手工启用或禁用后端真实服务器
启动Haproxy
/home/haproxy/sbin/haproxy -f /home/haproxy/conf/haproxy.cfg
查看监控页面
- http://172.23.57.232:11001/admin 或 http://172.23.57.233:11001/admin 用户名:admin 密码:admin123
管理 Haproxy 进程
- 修改haproxy.cfg后,每执行一次 /home/haproxy/sbin/haproxy -f /home/haproxy/conf/haproxy.cfg,就会存在一个haproxy的进程,可以通过 ps aux | grep haproxy 查看已存在的进程,将不需要的进程kill掉。可以通过监控页面上的【Statistics Report for pid 4073477】选择进程号删除。
- 如果有新的需求需要进行负载均衡,可以新建一个haproxy_xx.cfg,然后执行
/home/haproxy/sbin/haproxy -f /home/haproxy/conf/haproxy_xx.cfg
或者
在原来的haproxy_xx.cfg中添加新的listen。
安装Keepalived
下载keepalived
- 下载地址:https://www.keepalived.org/download.html
- 这里用的是
keepalived-1.4.5
版本。
安装keepalived
# 将keepalived-1.4.5.tar.gz上传到/home/software目录下
cd /home/software
tar -xvf keepalived-1.4.5.tar.gz
cd keepalived-1.4.5/
./configure --prefix=/home/keepalived
make && make install
注册keepalived为系统服务
cp /home/keepalived/sbin/keepalived /usr/sbin/
# 以下拷贝的原路径为实际安装包解压后的路径
cp /home/software/keepalived-1.4.5/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /home/software/keepalived-1.4.5/keepalived/etc/init.d/keepalived /etc/init.d/
# 赋予可执行权限
chmod +x /etc/init.d/keepalived
# 重启系统服务
systemctl daemon-reload
配置keepalived
- keepalived配置中加入haproxy的脚本检测扩展,keepalived会自动检测haproxy是否启动,如果没有启动会自动启动,启动一次没成功就会自动关闭keepalived,将下面的脚本写入chk_haproxy.sh中
mkdir /etc/keepalived
vi /etc/keepalived/chk_haproxy.sh
#!/bin/bash
A=`ps -C haproxy --no-header |wc -l`
if [ $A -eq 0 ];then
/home/haproxy/sbin/haproxy -f /home/haproxy/conf/haproxy.cfg
sleep 10
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
systemctl stop keepalived
fi
fi
# 修改权限
chmod 744 /etc/keepalived/chk_haproxy.sh
- Keepalived默认读取的路径为: /etc/keepalived/keepalived.conf
vi /etc/keepalived/keepalived.conf
- 将下面的配置写入/etc/keepalived/keepalived.conf中,其中虚拟ip由运维人员分配。
#主机172.23.57.232配置
global_defs {
router_id haproxy1 # 虚拟路由名称
}
# HAProxy健康检查配置
vrrp_script chk_haproxy {
script "/etc/keepalived/chk_haproxy.sh" # 执行自定义脚本
interval 2 # 脚本运行周期,秒
}
# 虚拟路由配置
vrrp_instance VI_1 {
state MASTER # 本机实例状态,MASTER/BACKUP,备机配置文件中请写BACKUP
interface enp4s1 # 本机网卡名称,使用ifconfig命令查看
virtual_router_id 60 # 虚拟路由编号,主备机保持一致
priority 101 # 本机初始权重,备机请填写小于主机的值(例如99)
advert_int 1 # 争抢虚地址的周期,秒
unicast_src_ip 172.23.57.232 # 单播模式源ip
unicast_peer {
172.23.57.233 # 单播模式目标ip
}
authentication {
auth_type PASS
auth_pass Njbl_@)@! # 认证类型和密码主备一样,要不然无法互相认证
}
virtual_ipaddress {
172.23.57.207 # 虚地址IP,主备机保持一致
}
track_script {
chk_haproxy # 对应的健康检查配置
}
}
#备用172.23.57.233机配置
global_defs {
router_id haproxy2 # 虚拟路由名称
}
# HAProxy健康检查配置
vrrp_script chk_haproxy {
script "/etc/keepalived/chk_haproxy.sh" # 执行自定义脚本
interval 2 # 脚本运行周期,秒
}
# 虚拟路由配置
vrrp_instance VI_1 {
state BACKUP # 本机实例状态,MASTER/BACKUP,备机配置文件中请写BACKUP
interface enp4s1 # 本机网卡名称,使用ifconfig命令查看
virtual_router_id 60 # 虚拟路由编号,主备机保持一致
priority 99 # 本机初始权重,备机请填写小于主机的值(例如99)
advert_int 1 # 争抢虚地址的周期,秒
unicast_src_ip 172.23.57.233 # 单播模式源ip
unicast_peer {
172.23.57.232 # 单播模式目标ip
}
authentication {
auth_type PASS
auth_pass Njbl_@)@! # 认证类型和密码主备一样,要不然无法互相认证
}
virtual_ipaddress {
172.23.57.207 # 虚地址IP,主备机保持一致
}
track_script {
chk_haproxy # 对应的健康检查配置
}
}
启动keepalived
# 启动keepalived
systemctl start keepalived
# 设置开机自启动
systemctl enable keepalived
验证keepalived
- 查看keepalived的状态
systemctl status keepalived
- 分别查看主机和备用机的vip
ip addr sh enp4s1
测试
是否起到负载均衡作用
- 客户端通过虚拟ip: 172.23.57.207和配置中的监听端口4000,能访问成功,说明已经生效。
主机发生故障是否会进行漂移,并且不影响访问
- shutdown主机232,如果VIP发生漂移,查看备用机持有VIP就说明主备配置已经生效了。客户端还是能通过172.23.57.207这个虚拟ip进行服务访问,这就是高可用。
sudo shutdown -r now
- 查看备用机233的vip,虚拟ip已经漂到备用机上,且TiDB集群能正常访问。
- 主机232重新启动。
- 分别查看主机的vip和备用机的vip,虚拟ip已经重新漂到主机上,且TiDB集群能正常访问。
TiDB集群1台服务器宕机
- 在87上执行sudo shutdown -r now。
- 服务仍能正常访问
- 87服务器重新拉起后,该节点的TiDB组件自动恢复。
TiDB集群2台服务器宕机
- 在88、89上执行sudo shutdown -r now。
- 服务无法正常访问
- 88、89服务器重新拉起后,2个节点的TiDB组件自动恢复,服务也能正常访问。
TiDB集群3台服务器宕机
- 在87、88、89上执行sudo shutdown -r now。
- 服务无法正常访问
- 87、88、89服务器重新拉起后,3个节点的TiDB组件自动恢复,服务也能正常访问。