LVS + Keepalived 高可用集群搭建

LVS + Keepalived 高可用负载均衡集群搭建,涵盖 DR/NAT 模式、健康检查和故障转移配置。

环境搭建- -LVS + keepalived


通过 LVS+keepalived 对调度服务器进行双机热备,利用高可用(HA)技术提供持续不间断的服务。

keepalived双机热备

利用高可用(HA)技术提供持续的、不间断的计算机系统或网络服务。

使用keepalived实现双击热备,包括针对IP地址的故障切换,以及在LVS高可用群集中的热备应用。

Keepalived双击热备基础知识

专为LVS和HA设计的一款健康检查工具

  • 支持故障自动切换(Failover)
  • 支持节点健康状态检查(Health Checking)

Keepalived的热备方式

VRRP:一主+多备 ,公用同一个IP地址,但优先级不同

LVS+Keepalived 高可用群集

Keepalived的实际目标是构建高可用的LVS负载均衡群集,可以调用ipvsadm工具来创建虚拟服务,管理服务器池,而不仅仅用作双机热备。使用keepalived
构建LVS群集更加简便易用。主要优势体现在:对LVS负载调度器实现热备切换,提高可用性;对服务器池中的节点进行健康检查,自动移除失效节点,恢复后在重新加入。

负载均衡 + 高可用群集

  • 针对LVS调度器实现双机热备
  • 能够管理服务器池,自动隔离失效节点

安装及服务控制

安装支持软件

rpm -q kernel-devel
# kernel-devel-2.6.32-431.el6.x86_64
rpm -q ipvsadm
# ipvsadm-1.26-2.el6.x86_64
yum -y install openssl-devel
yum -y install popt-devel
rpm -q openssl-devel popt-devel
# openssl-devel-1.0.1e-15.el6.x86_64
# popt-devel-1.13-7.el6.x86_64
# 安装keepalived
tar zxf keepalived-1.2.13.tar.gz
cd keepalived-1.2.13
./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.32-431.el6.x86_64/
make
make install
ll /etc/init.d/keepalived
chkconfig --add keepalived
chkconfig keepalived on

# 从服务器与上安装一样
# 修改配置文件
# 备份
cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak

配置主服务器

  • 主从调度器配置要点
    • DR模式必须调整/proc参数
    • 清除VIP地址、清除ipvsadm策略
    • 配置keepalived双击热备,并添加服务器池设置
  • Web节点注意事项
    • DR模式必须调整/proc参数、清除VIP地址及路由
# 全局配置、热备配置同上
cat > keepalived.conf <<EOF
! Configuration File for keepalived

global_defs {
   router_id TEST
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.104.210
    }
}
EOF

配置从服务器

cat > keepalived.conf <<EOF
! Configuration File for keepalived

global_defs {
   router_id TEST
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.104.210
    }
}
EOF
# 查看日志文件(当主服务器未启动时,从服务器为主服务器,当主服务器启动时,从服务器交出虚拟IP,从新变为BACKUP)
tail -f /var/log/messages 
# 主服务器
Apr 17 16:51:48 wcq10 Keepalived_vrrp[32233]: VRRP_Instance(VI_1) Entering MASTER STATE
Apr 17 16:51:48 wcq10 Keepalived_vrrp[32233]: VRRP_Instance(VI_1) setting protocol VIPs.
Apr 17 16:51:48 wcq10 Keepalived_vrrp[32233]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.104.210
Apr 17 16:51:48 wcq10 Keepalived_healthcheckers[32232]: Netlink reflector reports IP 192.168.104.210 added
Apr 17 16:51:53 wcq10 Keepalived_vrrp[32233]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.104.210
# 从服务器
Apr 17 16:51:47 wcq03 Keepalived_vrrp[4646]: VRRP_Instance(VI_1) Received higher prio advert
Apr 17 16:51:47 wcq03 Keepalived_vrrp[4646]: VRRP_Instance(VI_1) Entering BACKUP STATE
Apr 17 16:51:47 wcq03 Keepalived_vrrp[4646]: VRRP_Instance(VI_1) removing protocol VIPs.
Apr 17 16:51:47 wcq03 Keepalived_healthcheckers[4645]: Netlink reflector reports IP 192.168.104.210 removed

lvs+Keppalived高可用群集

配置双机热备,并添加服务器池设置,主从服务器服务器池设置一样
virtual_server 192.168.104.210 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP

    real_server 192.168.104.20 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.104.30 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

主从服务器的优化设置

# 主服务器新增配置
cat >> /etc/sysctl.conf <<EOF
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.eth1.send_redirects = 0
EOF

# 从服务器新增配置
ifconfig lo:0 192.168.104.210/32

cat >> /etc/sysctl.con <<EOF
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
EOF

# 重启 keepalived
service keepalived restart

Haproxy搭建web集群

Haproxy是目前比较流行的一种集群调度工具,同类的集群调度工具很多,如 LVS 和 Nginx。相比较而言,LVS 性能最好,但是搭建相对复杂,Nginx 的
upstream 模块支持集群功能,但是对集群节点健康检查功能不强,性能没有 Haproxy 好。 Http请求

  • 请求方式:
    • GET方式:GET方法是默认的HTTP请求方法,我们日常用 GET 方法来提交表单数据,然而用 GET 方法提交的表单数据只经过了简单的编码,同时它将
      作为 URL 的一部分向 Web 服务器发送,因此,如果使用 GET 方法来提交表单数据就存在安全隐患。
    • POST方式:POST 方法是 GET 方法的一个替代方法,它主要是向 web 服务器提交表单数据,尤其是大批量的数据。POST 方法克服了 GET 方法的缺点。
      通过 POST 方法提交表单数据时,数据不是作为 URL 请求的一部分而是作为标准数据传送给 web 服务器,这也克服了 GET 方法中的信息无法保密和数据量
      太小的缺点。因此,出于安全考虑以及对用户信息的考虑,通常表单提交时采用 POST 方法。
  • 返回状态码
    • 正常的状态吗为2xx、3xx
    • 异常的状态码为4xx、5xx

负载均衡常用的调度算法:

  • RR:轮询查询(加权轮询)
  • LC:最小连接数(加权最小链接)
  • SH:基于来源访问调度

搭建负载均衡高可用环境相对简单,主要是要理解其中原理。 三种负载均衡器的优缺点说明如下:

  • LVS的优点:

    • 抗负载能力强、工作在第4层仅作分发作用,没有流量的产生,这个特点决定了它在负载均衡软件里的性能最强;无流量,同时保证了均衡器IO的性能不会受到
      大流量的影响;
    • 工作稳定,自身有完整的双击热备方案,如 LVS+Keepalived 和 LVS+hertbeat
    • 应用范围比较广,可以对所有应用作负载均衡;
    • 配置型比较低,这是一个缺点,也是一个优点,因为没有太多可配置的东西,所以并不需要太多更改,大大减少了人为出错的几率
  • LVS的缺点:

    • 软件本身不支持正则处理,不能做动静分离,这就凸显了 Nginx/HAProxy+keepalived 的优势
    • 如果网站应用比较大,LVS/DR + Keepalived 就比较复杂,特别是后面有 Windows Server 应用的机器,实施及配置还有维护过程比较麻烦,相对而言,
      Nginx/HAProxy+keepalived 就简单多了。
  • Nginx的优点:

    • 工作在 OSI 第七层,可以针对 HTTP 应用做一些分流的策略,比如针对域名、目录结构。它的正则比 HAProxy 更为强大和灵活;
    • Nginx 对网络的依赖非常小,理论上能 ping 通就能就行负载功能,这个也是它的优势所在;
    • Nginx 安装和配置比较简单,测试起来比较方便;
    • 可以承担高的负载压力且稳定,一般能支撑超过几万次的并发量;
    • Nginx 可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点;
    • Nginx 不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是强大的 Web 应用服务器。LNMP 现在也是非常流行的 web 环境,大有和 LAMP 环境
      分庭抗礼之势。Nginx 在处理静态页面、特别是提高并发方面相对 Apache 有优势;
    • Nginx 现在作为 web 反向加速缓存越来越成熟了。速度比传统的 squid 服务器更快,有需求的朋友可以考虑用其作为反向代理极速器;
  • Nginx的缺点:

    • Nginx 不支持 url 检测;
    • Nginx 仅能支持 http 和 email,这是它的弱势;
    • Nginx 的 session 的保持,cookie 的引导能力相对欠缺。
  • HAProxy的优点:

    • HAProxy 是支持虚拟主机的,可以在4/7层上工作(支持多网段);
    • 能够补充 nginx 的一些缺点比如 session 的保持,cookie 的引导等工作;
    • 支持 url 检测后端的服务器;
    • 它跟 LVS 一样,本身仅仅就只是一款负载均衡软件;单纯从效率上来讲 HAProxy 比 nginx 有更出色的负载均衡速度,在并发处理上也是优于 nginx 的;
    • HAProxy 可以对 mysql 读进行负载均衡,对后端的 mysql 节点进行检测和负载均衡,不过在后端的 mysql slaves 数量超过 10 台时性能不如 LVS;
    • HAProxy 的算法较多,达到8种。

案例

安装haproxy

  • 软件支持包
# 查看是否安装如下依赖
rpm -qa pcre-devel bzip2-devel

# 安装
yum -y install pcre-devel bzip2-devel
# 上传 haproxy安装包,并解压源码编译安装
tar zxf haproxy-1.4.24.tar.gz
cd haproxy-1.4.24
make TARGET=Linux26
make install
  • 修改配置文件
mkdir /etc/haproxy
cp examples/haproxy.cfg /etc/haproxy/
vim /etc/haproxy/haproxy.cfg
# this config needs haproxy-1.1.28 or haproxy-1.2.1

global
    log 127.0.0.1   local0
    log 127.0.0.1   local1 notice
    #log loghost    local0 info
    maxconn 4096
    #chroot /usr/share/haproxy
    uid 99
    gid 99
    daemon
    #debug
    #quiet

defaults
    log     global
    mode    http
    option  httplog
    option  dontlognull
    retries 3
    #redispatch
    maxconn 2000
    contimeout      5000
    clitimeout      50000
    srvtimeout      50000

listen  web-insert 0.0.0.0:80
    option  httpchk GET /index.html
    balance roundrobin
    server  inst1 192.168.104.20:80 check inter 2000 fall 3
    server  inst2 192.168.104.30:80 check inter 2000 fall 3
  • 启动服务
cp examples/haproxy.init /etc/init.d/haproxy
ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
# 添加执行权限
chmod +x /etc/init.d/haproxy
# 启动服务
service haproxy start
# Starting haproxy:                                          [确定]
# 添加开机启动
chkconfig haproxy on
chkconfig --list haproxy
#  haproxy        	0:关闭	1:关闭	2:启用	3:启用	4:启用	5:启用	6:关闭
  • Haproxy日志设置
vim /etc/haproxy/haproxy.cfg
global
    log /dev/log    local1 notice
    log /dev/log    local0 info
    maxconn 4096
    #chroot /usr/share/haproxy
    uid 99
    gid 99
    daemon
    #debug
    #quiet
# 重启服务
service haproxy restart