集群 --- LVS + Keepalived

96
月白白222
2016.11.11 16:18* 字数 4306

1、LVS Keepalived 集群的组成

LVS(linux virtual server,linux 虚拟服务器),由以下三部分组成:

  • 负载均衡层(load balance): 位于整个集群的最前端,由一台或多台负载调度器(Director Server)组成。其上安装了 LVS 的核心模块 IPVS,负责把用户请求分发给服务器群组层的应用服务器(Real Server)。同时还有监控模块(Ldirectord),用于监测各个 Real Server 服务的健康情况,当 real server 不可用时,将其从路由表中剔除,待主机恢复后重新加入。
  • 服务器群组(Server Array): 由一组实际运行应用服务的主机组成。每个 Real Server 之间通过高速 LAN 相连。
  • 数据共享存储(Shared Storage): 为所有 Real Server 提供共享存储空间和内容一致性的存储区域,一般由磁盘阵列设备组成。
LVS_Keepalived_组成.png

2、IPVS 的简单介绍

IPVS: 安装于 Director Server 上,并在 Director Server 上虚拟出一个 VIP(Virtual IP)。用户的访问请求通过 VIP 到达负载调度器,然后由负载调度器从 Real Server 列表中选取一个服务节点响应用户的请求。

2.1、IPVS 转发请求的 3 种方式:
  • VS/NAT(Virtual Server via Network Address Translation): 当用户请求到达调度器时,调度器将请求报文的目标地址和端口地址改写成选定的 Real Server 的相应地址和端口,并将请求报文发送给选定的 Real Server。当 Real Server 返回数据时,还需要再次将报文的源地址和端口更改为 VIP 和相应的端口后,再发送给用户。
    因为请求和响应报文都需要经过 Director Server 重写,所以当高并发时,调度器的处理能力将会成为瓶颈。
  • VS/TUN (Virtual Server via IP Tunneling):
    也就是 IP 隧道技术实现虚拟服务器。调度器采用 IP 隧道技术将用户请求转发到某个 Real Server,而这个 Real Server 将直接响应用户的请求,不再经过前端调度器,此外,对 Real Server 的地域位置没有要求,可以和 Director Server 位于同一个网段,也可以是独立的一个网络。由于在 TUN 方式中,调度器将只处理用户的报文请求,集群系统的吞吐量大大提高。

  • VS/DR(Virtual Server via Direct Routing):
    也就是用直接路由技术实现虚拟服务器。VS/DR 通过改写请求报文的 MAC 地址,将请求发送到 Real Server,而 Real Server 将响应直接返回给客户,免去了 VS/TUN 中的 IP 隧道开销。这种方式是三种负载调度机制中性能最高、最好的,但是必须要求 Director Server 与 Real Server 都有一块网卡连在同一物理网段上。

2.2、IPVS 的负载调度算法:

上面我们谈到,负载调度器是根据各个服务器的负载情况,动态地选择一台 Real Server 响应用户请求,那么动态选择是如何实现呢,其实也就是我们这里要说的负载调度算法,根据不同的网络服务需求和服务器配置,IPVS 实现了如下八种负载调度算法,这里我们详细讲述最常用的四种调度算法,剩余的四种调度算法请参考其它资料。

  • 轮询调度(Round Robin)
    “轮询”调度也叫1:1调度,调度器通过“轮询”调度算法将外部用户请求按顺序1:1的分配到集群中的每个 Real Server 上,这种算法平等地对待每一台 Real Server,而不管服务器上实际的负载状况和连接状态。

  • 加权轮询调度(Weighted Round Robin)
    “加权轮询”调度算法是根据 Real Server 的不同处理能力来调度访问请求。可以对每台 Real Server 设置不同的调度权值,对于性能相对较好的 Real Server 可以设置较高的权值,而对于处理能力较弱的 Real Server,可以设置较低的权值,这样保证了处理能力强的服务器处理更多的访问流量,充分合理的利用了服务器资源。同时,调度器还可以自动查询 Real Server 的负载情况,并动态地调整其权值。

  • 最少链接调度(Least Connections)
    “最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用“最小连接”调度算法可以较好地均衡负载。

  • 加权最少链接调度(Weighted Least Connections)
    “加权最少链接调度”,每个服务节点可以用相应的权值表示其处理能力,而系统管理员可以动态的设置相应的权值,缺省权值为1,加权最小连接调度在分配新连接请求时尽可能使服务节点的已建立连接数和其权值成正比。

  • 其它四种调度算法分别为:

    • 基于局部性的最少链接(Locality-Based Least Connections)
    • 带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)
    • 目标地址散列(Destination Hashing)
    • 源地址散列(Source Hashing)

3、keepalived 的原理的简单介绍:

VRRP (Virtual Router Redundancy Protocol,虚拟路由器冗余协议): 在现实的网络环境中,主机之间的通信都是通过配置静态路由(默认网关)完成的,而主机之间的路由器一旦出现故障,通信就会失败,因此,在这种通信模式中,路由器就成了一个单点瓶颈,为了解决这个问题,就引入了 VRRP 协议。

VRRP 可以将两台或多台物理路由器设备虚拟成一个虚拟路由器,每个虚拟路由器都有一个唯一标识,称为 VRID,一个 VRID 与一组 IP 地址构成了一个虚拟路由器。这个虚拟路由器通过虚拟IP(一个或多个)对外提供服务。而在虚拟路由器内部,同一时间只有一台物理路由器对外提供服务,这台物理路由器被称为主路由器(处于 MASTER 角色)。而其他物理路由器不拥有对外的虚拟 IP,也不提供对外网络功能,仅仅接收 MASTER 的 VRRP 状态通告信息,这些路由器被统称为备份路由器(处于 BACKUP 角色)。当主路由器失效时,处于 BACKUP 角色的备份路由器将重新进行选举,产生一个新的主路由器进入 MASTER 角色继续提供对外服务,整个切换过程对用户来说完全透明。

Keepalived 作为一个高性能集群软件,它还能实现对集群中服务器运行状态的监控及故障隔离。下面继续介绍下 Keepalived 对服务器运行状态监控和检测的工作原理。

Keepalived 工作在 TCP/IP 参考模型的第三、第四和第五层,也就是网络层、传输层和应用层。根据 TCP/IP 参考模型各层所能实现的功能,Keepalived运行机制如下:

  • 在网络层,运行着四个重要的协议:互连网协议 IP、互连网控制报文协议 ICMP、地址转换协议 ARP 以及反向地址转换协议 RARP。Keepalived 在网络层采用的最常见的工作方式是通过ICMP协议向服务器集群中的每个节点发送一个 ICMP 的数据包(类似于 ping 实现的功能),如果某个节点没有返回响应数据包,那么就认为此节点发生了故障,Keepalived 将报告此节点失效,并从服务器集群中剔除故障节点。

  • 在传输层,提供了两个主要的协议:传输控制协议 TCP 和用户数据协议 UDP。传输控制协议 TCP 可以提供可靠的数据传输服务,IP 地址和端口,代表一个 TCP 连接的一个连接端。要获得 TCP 服务,须在发送机的一个端口上和接收机的一个端口上建立连接,而 Keepalived 在传输层就是利用 TCP 协议的端口连接和扫描技术来判断集群节点是否正常的。比如,对于常见的 Web 服务默认的 80 端口、SSH 服务默认的 22 端口等,Keepalived 一旦在传输层探测到这些端口没有响应数据返回,就认为这些端口发生异常,然后强制将此端口对应的节点从服务器集群组中移除。

  • 在应用层,可以运行 FTP、TELNET、SMTP、DNS 等各种不同类型的高层协议,Keepalived 的运行方式也更加全面化和复杂化,用户可以通过自定义 Keepalived 的工作方式,例如用户可以通过编写程序来运行 Keepalived,而 Keepalived 将根据用户的设定检测各种程序或服务是否允许正常,如果 Keepalived 的检测结果与用户设定不一致时,Keepalived 将把对应的服务从服务器中移除。

4、安装配置 load balance 层主机

4.1、安装规划:

IP 地址规划:

  • vip:192.168.135.46
  • lvs_master_dr:192.168.135.42
  • lvs_backup_dr:192.168.135.43
  • realserver1:192.168.135.44
  • realserver2:192.168.135.45
4.2、安装 lvs 管理软件

注1:

以下操作在 lvs_master_dr(192.168.135.42)上进行

下载链接:

http://www.linuxvirtualserver.org/software/ipvs.html

检查主机内核版本

]# uname -r
2.6.32-642.el6.x86_64

根据内核对应关系,下载 ipvsadm-1.26 版本

]# wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz -P /usr/local/src/

安装依赖环境

]# yum install 'gcc' 'kernel-devel' 'libnl-devel' 'openssl-devel' -y
]# yum install 'popt-devel' 'popt-static' -y

编译安装

]# cd /usr/local/src/
]# tar -xzvf ipvsadm-1.26.tar.gz
]# cd ipvsadm-1.26
]# make && make install

注2:

也可以直接使用 yum 进行安装

]# yum install ipvsadm -y
4.3、安装 keepalived

下载链接:

http://www.keepalived.org/download.html

下载:

]# wget http://www.keepalived.org/software/keepalived-1.2.20.tar.gz -P /usr/local/src/

安装依赖环境

]# yum install libnfnetlink-devel -y

编译安装:

]# cd /usr/local/src/
]# tar -xzvf keepalived-1.2.20.tar.gz 
]# cd keepalived-1.2.20
]# ./configure --prefix=/usr/local/keepalive --with-kernel-dir=/usr/src/kernels/2.6.32-573.el6.x86_64/
]# make && make install

注:

--with-kernel-dir: 这个参数并不是要把 Keepalived 编译进内核,而是指定使用内核源码中的头文件,即 include 目录。只有在使用 LVS 时,才需要用到 --with-kernel-dir 参数,其他时候是不需要的。

环境调整:

]# ln -s /usr/local/keepalive/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
]# ln -s /usr/local/keepalive/etc/sysconfig/keepalived /etc/sysconfig/
]# mkdir /etc/keepalived
]# ln -s /usr/local/keepalive/etc/keepalived/keepalived.conf /etc/keepalived/
]# ln -s /usr/local/keepalive/sbin/keepalived /usr/sbin/

]# vim /etc/profile
export PATH=$PATH:/usr/local/keepalive/sbin:/usr/local/keepalive/bin
]# source /etc/profile
4.5、配置 keepalived
4.5.1、备份配置文件
]# cd /usr/local/keepalive/etc/keepalived/
]# cp keepalived.conf keepalived.conf_`date +%F`.bak
4.5.2、配置文件的整体说明

Keepalived 的配置文件都是以块(block)的形式组织的,每个块的内容都包含在 {} 中,以 #! 开头的行都是注释。

根据配置文件所实现的功能,将 Keepalived 配置分成三类,分别是:

  • 全局配置(Global Configuration)
  • VRRPD 配置
  • Virtual Host 配置
    • 虚拟主机的配置
    • 真实主机的配置
      • 真实主机的健康检查
4.5.3、全局配置

全局配置就是对整个 Keepalived 都生效的配置,基本内容如下:

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
}

全局配置以 global_defs 作为标识,在 global_defs 区域内的都是全局配置选项,其中:

  • notification_email: 用于设置报警邮件地址,可以设置多个,每行一个。注意,如果要开启邮件报警,需要开启本机的 Sendmail 服务。
  • notification_email_from: 用于设置邮件的发送地址。
  • smtp_server: 用于设置邮件的 smtp server 地址。
  • smtp_connect_timeout: 用于设置连接 smtp server 的超时时间。
  • router_id: 表示运行 Keepalived 服务器的一个标识,是发邮件时显示在邮件主题中的信息。
4.5.4、VRRPD 配置

VRRP 实例的配置,也就是配置 Keepalived 的高可用功能。VRRP 实例段主要用来配置节点角色(主或从)、实例绑定的网络接口、节点间验证机制、集群服务IP等。下面是实例 VI_1 的一个配置样例。

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.135.46
    }
}

以上 VRRP 配置以 vrrp_instance 作为标识,在这个实例中包含了若干配置选项,分别介绍如下:

  • vrrp_instance: 是 VRRP 实例开始的标识,后跟 VRRP 实例名称。
  • state: 用于指定 Keepalived 的角色,MASTER 表示此主机是主服务器,BACKUP 表示此主机是备用服务器。
  • interface: 用于指定 HA 监测网络的接口。
  • virtual_router_id: 是虚拟路由标识,这个标识是一个数字,同一个 vrrp 实例使用唯一的标识,即在同一个 vrrp_instance 下,MASTER 和 BACKUP 必须是一致的。
  • priority: 用于定义节点优先级,数字越大表示节点的优先级就越高。在一个 vrrp_instance 下,MASTER 的优先级必须大于 BACKUP 的优先级。
  • advert_int: 用于设定 MASTER 与 BACKUP 主机之间同步检查的时间间隔,单位是秒。
  • authentication: 用于设定节点间通信验证类型和密码,验证类型主要有 PASS 和 AH 两种,在一个 vrrp_instance 下,MASTER 与 BACKUP 必须使用相同的密码才能正常通信。
  • virtual_ipaddress: 用于设置虚拟 IP 地址(VIP),又叫做漂移 IP 地址。可以设置多个虚拟 IP 地址,每行一个。之所以称为漂移 IP 地址,是因为 Keepalived 切换到 Master 状态时,这个 IP 地址会自动添加到系统中,而切换到 BACKUP 状态时,这些 IP 又会自动从系统中删除。Keepalived 通过 ip address add 命令的形式将 VIP 添加进系统中。要查看系统中添加的 VIP 地址,可以通过 ip add 命令实现。virtual_ipaddress 段中添加的 IP 形式可以多种多样,例如可以写成 192.168.16.189/24 dev eth1 这样的形式,而 Keepalived 会使用 IP 命令ip addr add 192.168.16.189/24 dev eth1 将 IP 信息添加到系统中。因此,这里的配置规则和 IP 命令的使用规则是一致的。
virtual_server 192.168.135.46 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 120
    protocol TCP

    # sorry_server 192.168.200.200 1358

    real_server 192.168.135.44 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    
    real_server 192.168.135.45 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

下面介绍每个选项的含义。

  • virtual_server: 设置虚拟服务器的开始,后面跟虚拟 IP 地址和服务端口,IP 与端口之间用空格隔开。
  • delay_loop: 设置健康检查的时间间隔,单位是秒。
  • lb_algo: 设置负载调度算法,可用的调度算法有 rr、wrr、lc、wlc、lblc、sh、dh 等,常用的算法有 rr 和 wlc。
  • lb_kind: 设置LVS实现负载均衡的机制,有 NAT、TUN 和 DR 三个模式可选。
  • persistence_timeout: 会话保持时间,单位是秒。这个选项对动态网页是非常有用的,为集群系统中的 session 共享提供了一个很好的解决方案。有了这个会话保持功能,用户的请求会一直分发到某个服务节点,直到超过这个会话的保持时间。需要注意的是,这个会话保持时间是最大无响应超时时间,也就是说,用户在操作动态页面时,如果在 120 秒内没有执行任何操作,那么接下来的操作会被分发到另外的节点,但是如果用户一直在操作动态页面,则不受 120 秒的时间限制。默认配置为 50 秒,实际生产时建议设置为 120 秒。
  • protocol: 指定转发协议类型,有 TCP 和 UDP 两种可选。
  • sorry_server: 相当于一个备用节点,在所有 real server 失效后,这个备用节点会启用。

健康检测段允许多种检查方式,常见的有 HTTP_GET、SSL_GET、TCP_CHECK、SMTP_CHECK、MISC_CHECK。此处使用的为 TCP_CHECK,下面介绍每个选项的含义:

  • connect_port: 健康检查的端口,如果无指定,默认是 real_server 指定的端口。
  • connect_timeout: 表示无响应超时时间,单位是秒,这里是3秒超时。
  • nb_get_retry: 表示重试次数,这里是3次。
  • delay_before_retry: 表示重试间隔,这里是间隔3秒。

注:

在安装配置 lvs_backup_dr 主机时,步骤与上面完全一致,只是在修改 Keepalived 配置文件时,有两点不一样

state MASTER --> BACKUP
priority 100 --> 90
4.5.5、启动 keepalived
]# /etc/init.d/keepalived start
4.6、安装配置 real server 层主机
4.6.1、安装配置 Apache 服务
]# yum install httpd

# 配置一个首页,填写 real server 主机实际地址,以便在后期测试过程中标识主机
]# vim /var/www/html/index.html
This is 192.168.135.4X

# 启动 http 服务
]# /etc/init.d/httpd start
4.6.2、配置启动 real server
]# vim /etc/init.d/lvsrs
#!/bin/bash
# chkconfig: 35 15 85
# description: start/stop LVS(load balancing software for Linux kernel–based operating systems)

# Source function library.
. /etc/rc.d/init.d/functions

VIP=192.168.135.46

case "$1" in
    start)
        echo " Start LVS  of  Real Server"
        /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
        echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
        echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
        echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
        echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce 
        ;;
    stop)
        echo "close LVS Director server"
        /sbin/ifconfig lo:0 down
        echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
        echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
        echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
        echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
        ;;
    *)
        echo "Usage: $0 {start|stop}"
        exit 1
esac

]# chmod 755 /etc/init.d/lvsrs
]# /etc/init.d/lvsrs start
cluster