0
0
0
0
专栏/.../

【TiDB 高可用实践】基于Haproxy+keepalived实现负载均衡

 HZL_0-0  发表于  2025-09-05

拓扑图

image.png

  1. Haproxy 提供 TCP 协议下的负载均衡能力,TiDB 客户端通过连接 Haproxy 提供的浮动 IP 即可对数据进行操作,实现 TiDB Server 层的负载均衡。
  2. 同时,Haproxy 部署2个节点,使用KeepAlived来实现高可用。一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟 IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候, 备份服务器就会接管虚拟 IP,继续提供服务,从而保证了高可用性。

安装Haproxy

下载Haproxy

安装Haproxy

172.23.57.232172.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

安装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

  1. 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
  1. Keepalived默认读取的路径为: /etc/keepalived/keepalived.conf
vi /etc/keepalived/keepalived.conf
  1. 将下面的配置写入/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,能访问成功,说明已经生效。

主机发生故障是否会进行漂移,并且不影响访问

  1. shutdown主机232,如果VIP发生漂移,查看备用机持有VIP就说明主备配置已经生效了。客户端还是能通过172.23.57.207这个虚拟ip进行服务访问,这就是高可用。
sudo shutdown -r now
  • 查看备用机233的vip,虚拟ip已经漂到备用机上,且TiDB集群能正常访问。

  1. 主机232重新启动。
  • 分别查看主机的vip和备用机的vip,虚拟ip已经重新漂到主机上,且TiDB集群能正常访问。

TiDB集群1台服务器宕机

  1. 在87上执行sudo shutdown -r now。
  • 服务仍能正常访问

  1. 87服务器重新拉起后,该节点的TiDB组件自动恢复。

TiDB集群2台服务器宕机

  1. 在88、89上执行sudo shutdown -r now。
  • 服务无法正常访问
  1. 88、89服务器重新拉起后,2个节点的TiDB组件自动恢复,服务也能正常访问。

TiDB集群3台服务器宕机

  1. 在87、88、89上执行sudo shutdown -r now。
  • 服务无法正常访问

  1. 87、88、89服务器重新拉起后,3个节点的TiDB组件自动恢复,服务也能正常访问。

0
0
0
0

版权声明:本文为 TiDB 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

评论
暂无评论