MySQL高阶讲座之:`MySQL`集群的`Load Balancer`:`HAProxy`与`LVS`的选型与配置。

各位观众老爷们,晚上好!我是老码农,今天给大家带来的MySQL高阶讲座,主题是“MySQL集群的Load Balancer:HAProxy与LVS的选型与配置”。别怕,虽然是高阶,但保证通俗易懂,让大家听完都能回去撸起袖子直接干!

咱们都知道,MySQL单机再牛逼,也有扛不住的时候。为了应对高并发、高可用,搞MySQL集群那是必须的。集群有了,问题也来了,一大堆MySQL服务器,客户端怎么知道该连哪一台?这时候,就需要一个“带路党”,也就是Load Balancer(负载均衡器)。今天就来说说两个常用的带路党:HAProxy和LVS。

第一回合:HAProxy vs LVS,谁是你的菜?

首先,咱们先来个简单的对比,让大家对这两个家伙有个初步的印象。

特性 HAProxy LVS
工作层次 应用层(HTTP/HTTPS) & 传输层(TCP) 传输层(TCP/UDP)
功能 负载均衡、健康检查、会话保持、HTTP头部修改等 负载均衡、健康检查
性能 相对LVS较低,但足够应对大部分场景 性能极高,尤其擅长处理大规模并发连接
配置复杂度 相对LVS较高,但更灵活可配置 相对LVS较低,但配置灵活性稍差
适用场景 Web应用、API接口等,需要HTTP层面处理的场景 高并发、高吞吐量的TCP/UDP应用,如数据库、缓存等
健康检查方式 HTTP/TCP/SSL等多种方式 TCP/HTTP等方式

简单来说,HAProxy更像一个“万金油”,什么都能干一点,HTTP层面的特性支持得更好。LVS则像一个“肌肉猛男”,专注于TCP/UDP流量的转发,性能是它的强项。

第二回合:HAProxy,小巧玲珑,功能强大

HAProxy,全称High Availability Proxy,听名字就知道它的目标是“高可用”。它是一个开源的、高性能的TCP/HTTP负载均衡器。

1. HAProxy的安装

这个就比较简单了,根据你的系统选择合适的安装方式。比如,在CentOS上:

sudo yum install -y haproxy

或者在Ubuntu上:

sudo apt-get update
sudo apt-get install -y haproxy

2. HAProxy的配置

HAProxy的配置文件是/etc/haproxy/haproxy.cfg。咱们来个简单的配置示例,假设有两台MySQL服务器,IP分别是192.168.1.101和192.168.1.102,端口都是3306。

global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

defaults
    mode        tcp  # 使用TCP模式,因为是MySQL
    log         global
    option      tcplog
    option      dontlognull
    retries     3
    timeout connect  5000
    timeout client  50000
    timeout server  50000

frontend mysql_frontend
    bind *:3306  # 监听所有IP的3306端口
    default_backend mysql_backend # 默认后端服务器组

backend mysql_backend
    balance     roundrobin # 轮询算法
    server  mysql1 192.168.1.101:3306 check inter 2000 rise 2 fall 3 # MySQL服务器1
    server  mysql2 192.168.1.102:3306 check inter 2000 rise 2 fall 3 # MySQL服务器2
  • global: 全局配置,比如日志、进程ID等。
  • defaults: 默认配置,比如超时时间、日志等。
  • frontend: 前端配置,定义HAProxy监听的端口和默认后端服务器组。
  • backend: 后端配置,定义实际的MySQL服务器,以及负载均衡算法。

配置解释:

  • mode tcp: 指定使用TCP模式,因为MySQL是基于TCP协议的。
  • balance roundrobin: 指定使用轮询算法,HAProxy会依次将请求转发给后端服务器。
  • server mysql1 192.168.1.101:3306 check inter 2000 rise 2 fall 3: 定义一个MySQL服务器,mysql1是服务器的名称,192.168.1.101:3306是服务器的IP地址和端口,check表示开启健康检查,inter 2000表示每2000毫秒检查一次,rise 2表示连续2次健康检查成功才认为服务器恢复正常,fall 3表示连续3次健康检查失败才认为服务器不可用。

3. HAProxy的常用命令

配置好之后,需要重启HAProxy服务:

sudo systemctl restart haproxy

查看HAProxy状态:

sudo systemctl status haproxy

还可以通过HAProxy的统计页面查看服务器的运行状态。需要在配置文件中添加以下内容:

listen stats
    bind *:8080  # 监听8080端口
    mode http
    stats enable
    stats uri /stats  # 统计页面URL
    stats refresh 5s
    stats realm Haproxy Statistics
    stats auth admin:password  # 用户名和密码

然后,重启HAProxy服务,在浏览器中输入http://你的IP:8080/stats,就可以看到HAProxy的统计页面了。

4. HAProxy的高级玩法

  • 会话保持(Session Persistence): 如果你的应用需要会话保持,可以使用cookie insert指令。例如:
backend mysql_backend
    balance     roundrobin
    cookie      SRV insert indirect nocache  # 插入Cookie
    server  mysql1 192.168.1.101:3306 check inter 2000 rise 2 fall 3 cookie mysql1
    server  mysql2 192.168.1.102:3306 check inter 2000 rise 2 fall 3 cookie mysql2

这样,HAProxy会在客户端的Cookie中插入服务器的信息,下次客户端请求时,HAProxy会根据Cookie将请求转发到同一台服务器。

  • HTTP Header修改: HAProxy可以修改HTTP头部,比如添加X-Forwarded-For头,方便后端服务器获取客户端的真实IP地址。
frontend web_frontend
    bind *:80
    http-request add-header X-Forwarded-For %[src]
    default_backend web_backend

第三回合:LVS,性能怪兽,简单粗暴

LVS,全称Linux Virtual Server,是Linux内核自带的负载均衡器。它工作在传输层,直接转发TCP/UDP流量,性能非常高。

1. LVS的工作模式

LVS有三种常用的工作模式:

  • DR(Direct Routing): 直接路由模式,Real Server直接将响应返回给客户端,性能最高。
  • NAT(Network Address Translation): 网络地址转换模式,Real Server的IP地址可以和VIP(Virtual IP)不在同一个网段。
  • TUN(Tunneling): 隧道模式,Real Server将响应通过隧道返回给客户端。

咱们这里主要介绍DR模式,因为它性能最好,也是最常用的。

2. LVS的安装

LVS依赖ipvsadm工具进行配置。在CentOS上:

sudo yum install -y ipvsadm

或者在Ubuntu上:

sudo apt-get update
sudo apt-get install -y ipvsadm

3. LVS的配置

LVS的配置相对HAProxy来说,稍微复杂一些,需要配置VIP、Real Server等。

假设有两台MySQL服务器,IP分别是192.168.1.101和192.168.1.102,端口都是3306。VIP是192.168.1.100。

(1)在LVS服务器上配置VIP

sudo ip addr add 192.168.1.100/32 dev eth0  # 将VIP绑定到网卡eth0上
sudo ip link set dev eth0 arp off
sudo echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
sudo echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
sudo echo 1 > /proc/sys/net/ipv4/ip_forward

(2)在LVS服务器上配置LVS规则

sudo ipvsadm -A -t 192.168.1.100:3306 -s rr  # 添加虚拟服务,使用轮询算法
sudo ipvsadm -a -t 192.168.1.100:3306 -r 192.168.1.101:3306 -g  # 添加Real Server 1,使用DR模式
sudo ipvsadm -a -t 192.168.1.100:3306 -r 192.168.1.102:3306 -g  # 添加Real Server 2,使用DR模式
  • -A: 添加虚拟服务。
  • -t: 指定虚拟服务的IP地址和端口。
  • -s: 指定负载均衡算法,rr表示轮询。
  • -a: 添加Real Server。
  • -r: 指定Real Server的IP地址和端口。
  • -g: 指定使用DR模式。

(3)在Real Server上配置VIP

为了让Real Server能够接收到发往VIP的请求,需要在Real Server上也配置VIP。

sudo ip addr add 192.168.1.100/32 dev lo  # 将VIP绑定到lo(loopback)网卡上
sudo ip link set dev lo arp off
sudo echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
sudo echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

注意: 一定要在Real Server上禁用ARP响应,否则LVS服务器可能会无法正常工作。

4. LVS的常用命令

查看LVS规则:

sudo ipvsadm -L -n

清空LVS规则:

sudo ipvsadm -C

5. LVS的持久连接

LVS也支持持久连接,可以使用-p参数。例如:

sudo ipvsadm -A -t 192.168.1.100:3306 -s rr -p 3600  # 添加虚拟服务,使用轮询算法,持久连接时间为3600秒
sudo ipvsadm -a -t 192.168.1.100:3306 -r 192.168.1.101:3306 -g
sudo ipvsadm -a -t 192.168.1.100:3306 -r 192.168.1.102:3306 -g

6. Keepalived + LVS,打造高可用集群

LVS本身没有高可用功能,如果LVS服务器宕机,整个集群就挂了。为了解决这个问题,可以使用Keepalived。Keepalived可以监控LVS服务器的状态,并在LVS服务器宕机时,自动将VIP切换到备用LVS服务器上。

Keepalived的配置比较复杂,这里就不详细介绍了,大家可以自行查阅相关资料。

第四回合:选型建议

说了这么多,到底该选哪个呢?我的建议是:

  • 如果你的应用是Web应用、API接口等,需要HTTP层面的处理,或者对配置的灵活性要求较高,那就选择HAProxy。
  • 如果你的应用是高并发、高吞吐量的TCP/UDP应用,比如数据库、缓存等,对性能要求极高,那就选择LVS。

当然,也可以结合使用,比如用HAProxy做Web应用的负载均衡,用LVS做数据库的负载均衡。

总结

HAProxy和LVS都是优秀的负载均衡器,各有优缺点。选择哪个,取决于你的实际需求。希望今天的讲座能帮助大家更好地理解和使用这两个工具,打造高可用、高性能的MySQL集群。

最后,记住一点:没有银弹! 选择最适合你的,才是最好的。

今天的讲座就到这里,谢谢大家! 别忘了点赞收藏哦! 咱们下期再见!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注