Linux集群架构

  • 集群介绍
  • keepalived介绍
  • 用keepalived配置高可用
  • 负载均衡集群介绍
  • LVS介绍
  • LVS的调试算法
  • LVS NAT模式搭建
  • LVS DR模式搭建
  • keepalived LVS

集群介绍

根据功能划分为两大类:高可用和负载均衡
高可用集群常为两台服务器,一台工作,另外一台作为冗余,当提供服务的机器宕机,冗余将接替继续提供服务
实现高可用的开源软件有:keepalived、heartbeat
负载均衡集群,需要有一台服务器作为分发器,它负责把用户的请求分发给后端的服务器处理,在这个集群里,除了分发器外,就是给用户提供服务的服务器了,这些服务器数量至少为2
实现负载均衡的开源软件有LVS、keepalived、haproxy、nginx,商业的有F5、Netscaler


keepalived介绍

使用keepalived来实现高可用集群,因为heartbeat在centos6上有一些问题
keepalived通过VRRP(Virtual Router Redundancy Protocol)来实现高可用
在这个协议里会将多台功能相同的路由器组成一个小组,这个小组会有1个master角色和N(N>=1)个backup角色。
master会通过组播的形式向各个backup发送VRRP协议的数据包,当backup收不到master发来的VRRP数据包时,就会认为master宕机了。此时就需要根据各个backup的优先级来决定谁成为新的master。
keepalived有三个模块,分别是core、check和vrrp。其中core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件加载和解析,check模块负责健康检查,vrrp模块是来实现VRRP的。


用keepalived配置高可用集群

mater:192.168.221.10

1.安装keepalived
2.安装nginx
3.编辑keepalived.conf
4.编辑监控脚本,给脚本文件执行权限
5.启动keepalived

代码如下:

yum install keepalived.x86_64 -y
yum install epel-release -y
yum install nginx -y
vim keepalived.conf   //以下是文件内容
1 global_defs {
  2    notification_email {
  3      apeng@apenglinux.com
  4    }
  5    notification_email_from root@apenglinux.com
  6    smtp_server 127.0.0.1
  7    smtp_connect_timeout 30
  8    router_id LVS_DEVEL
  9 }
 10 vrrp_script check_nginx {
 11         script "/usr/local/sbin/check_nginx.sh"
 12         interval 3
 13 }
 14 vrrp_instance VI_1 {
 15     state MASTER
 16     interface ens33
 17     virtual_router_id 51
 18     priority 100
 19     advert_int 1
 20     authentication {
 21         auth_type PASS
 22         auth_pass 1111
 23     }
 24     virtual_ipaddress {
 25         192.168.221.100
 26     }
 27     track_script {
 28         check_nginx
 29     }
 30 }

 vim /usr/local/sbin/check_nginx.sh
 #!/bin/bash
#
d=`date --date today +%Y%m%d_%H:%M:%S`
n=`ps -C nginx --on-heading | wc -l`
if [ $n -eq "0" ]; then
    systemctl start nginx
    n2=`ps -C nginx --no-heading | wc -l`
    if [ $n2 -eq "0" ]; then
        echo "$d nginx down,keepalived will stop." >> /var/log/check_nginx.log
        systemctl stop keepalived
    fi
fi

chmod +x /usr/local/sbin/check_nginx.sh
systemctl start keepalived

启动keepalived时,如果没有将拉起nginx进程,则需要关闭selinux
backup:192.168.221.20

1.安装keepalived
2.安装nginx(源码包安装过了)
3.编辑keepalived.conf
4.编辑监控脚本,给脚本文件执行权限
5.启动keepalived

代码如下:

yum install keepalived.x86_64 -y
vim /etc/keepalived/keepalived.conf
global_defs {
   notification_email {
     apeng@apenglinux.com
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_script check_nginx {
        script "/usr/local/sbin/check_nginx.sh"
        interval 3
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.221.100
    }
    track_script {
        check_nginx
    }
}
vim /usr/local/sbin/check_nginx.sh
#!/bin/bash
#
d=`date --date today +%Y%m%d_%H:%M:%S`
n=`ps -C nginx --no-heading | wc -l`
if [ $n -eq "0" ]; then
    /etc/init.d/nginx start
    n2=`ps -C nginx --no-heading | wc -l`
    if [ $n2 -eq "0" ]; then
        echo "$d nginx down,keepalived will stop." >> /var/log/check_nginx.log
        systemctl stop keepalived
    fi
fi
chmod +x /usr/local/sbin/check_nginx.sh
systemctl start keepalived.service

vip:192.168.221.100(用于用户访问)

负载均衡集群介绍

主流开源软件LVS、keepalived、haproxy、nginx等
其中LVS属于4层(网络OSI7层模型),nginx属于7层,haproxy既可以为是4层,也可以当做7层使用
keepalived的负载均衡功能其实就是lvs
lvs这种4层的负载均衡是可以分发除80外的其他端口通信的,比如Mysql的,而nginx仅仅支持http、https、mail、haproxy也支持mysql这种
相比较来说,LVS这种4层的更稳定,能承受更多的请求,而nginx这种7层的更加灵活,能实现更多的个性化需求

LVS介绍

LVS(Linux Virtual Server)是由中国大牛章文嵩开发的,这款软件的流行度不亚于Apache的httpd,它是一款四层的负载均衡软件,是针对TCP/IP做的转发和路由,所以稳定性和效率相当高。虽然目前越来越多的企业选择使用Nginx实现负载均衡,但LVS依然被很多企业应用在核心的架构中。该架构中有一个核心的角色叫做调度器(Load Balance),用来分发用户的请求,还有诸多的真实服务器(Real Server),也就是处理用户的服务器。

LVS根据实现方式的不同,主要分为三种类型:NAT模式、IP Tunnel(IP隧道)模式、DR模式。

LVS NAT模式

调试器会把用户的请求通过预设的iptables规则转发给后端的真实服务器。其中调试器有两个IP,一个是公网ip,一个是内网ip,而真实服务器只有内网ip。用户访问的时候请求的是调试器的公网IP,它会把用户的请求转发到真实服务器的内网ip上。这种模式的好处是节省公网ip,但是调试器会成为一个瓶颈。

IP Tunnel模式

IP隧道是将一个IP报文封装在另一个IP报文的技术,这可以使目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。像大家熟知的×××技术其实就是IP隧道。在LVS的IP Tunnel架构中,后端服务器有一组而非一个,所以不可能静态地建立一一对应的隧道,而是动态地选择一台服务器,将请求报文封装和转发给选出的服务器。这样,我们可以利用IP隧道的原理,将一组服务器上的网络服务组成在一个IP地址上的虚拟网络服务。
这种模式需要有一个公共的IP配置在分发器和所有rs上,我们把它叫做vip。
客户端请求的目标IP为vip,分发器接收到请求数据包后,会对数据包做一个加工,会把目标ip所为rs的ip,这样数据包就到了rs上。rs接收数据包后,会还原始数据包,这样目标ip为vip,因为所有rs上配置了这个vip,所以它会认为是它自己。

DR模式

和IP Tunnel模式方法相同,用户的请求被调度器动态地分配到真实服务器上,真实服务器响应请求把结果返回给用户。不过,在这种模式下不会封装ip,而是将数据帧的MAC地址改为真实服务器的MAC地址。

LVS的调度算法

调度器把客户端发来的请求均衡地分发给后端的真实服务器,这是依靠预先设定好的调度算法实现的,在LVS中支持的调度算法主要有以下8种。

  • 轮询调度(Round-Robin)
  • 带权重的轮询调度(Weighted Round-Robin)
  • 最小连接调度(Least-Connection)
  • 带权重最小连接调度(Weight Least-Connection)
  • 基于局部性的最少链接调度(Locality-Based Least Connection)
  • 带复制的基于局部性最小链接调度(Locality-Based Least-Connection with Replication)
  • 目标地址散列调度(Destination Hashing)
  • 源地址散列调度(Source Hashing)

LVS NAT模式搭建

  • 调度器dir :192.168.221.10(内网) 192.168.1.50(外网) 安装ipvsadm,脚本lvs_nat.sh
  • 真实服务器rs1:192.168.221.20(内网) nginx
  • 真实服务器rs2:192.168.221.30(内网) ngnix
  • rs1,rs1的网关指向dir的内网ip
  • 将三台机器上的防火墙规则清空
    iptables -F;iptables -t nat -F;service iptables save

    调度器dir的配置代码如下:

    yum install ipvsadm.x86_64 -y
    
    vim /usr/local/sbin/lvs_nat.sh  //以下脚本内容
    #!/bin/bash
    #
    echo 1 > /proc/sys/net/ipv4/ip_forward
    echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
    echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
    echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects
    echo 0 > /proc/sys/net/ipv4/conf/ens37/send_redirects
    iptables -t nat -F
    iptables -t nat -X
    iptables -t nat -A POSTROUTING -s 192.168.221.0/24 -j MASQUERADE
    IPVSADM="/usr/sbin/ipvsadm"
    $IPVSADM -C
    $IPVSADM -A -t 192.168.1.50:80 -s wlc -p 300
    $IPVSADM -a -t 192.168.1.50:80 -r 192.168.221.20:80 -m -w 1
    $IPVSADM -a -t 192.168.1.50:80 -r 192.168.221.30:80 -m -w 1
ipvsadm [options]
-C  //清空规则
-A //增加Virtual Server
-t //tcp
-s //调度算法
-p //指定超时时间
-a //添加rs
-r //指定rs的ip
-m //表示lvs的模式为NAT(masquerad)
-g //表示lvs模式为DR
-i //表示lvs模式为IP Tunnel
bash /usr/local/sbin/lvs_nat.sh

rs1配置如下:

yum install epel-release -y
yum install nginx -y
grep -i gateway ifcfg-ens33 //以下一行是查出的内容
GATEWAY=192.168.221.10
echo "Real Server1 IP is 192.168.221.20" > /usr/share/nginx/html/index.html
systemctl start nginx.service

rs2配置如下:

yum install epel-release -y
yum install nginx -y
grep -i gateway ifcfg-ens33 //以下一行是查出的内容
GATEWAY=192.168.221.10
echo "Real Server2 IP is 192.168.221.30" > /usr/share/nginx/html/index.html
systemctl start nginx.service

测试
在dir上分别访问两个rs,在dir上访问dir外网ip:192.168.1.50(多访问几次,看看效果)

curl 192.168.221.20
Real Server1 IP is 192.168.221.20
curl 192.168.221.30
Real Server2 IP is 192.168.221.30
curl 192.168.1.50
Real Server2 IP is 192.168.221.30

在浏览器中访问dir外网
keepalive + LVS

LVS DR模式搭建

  • 调度器dir:192.168.221.10 lvs_dr.sh 安装ipvsadm
  • 真实服务器rs1:192.168.221.20 lvs_dr_rs.sh nginx
  • 真实服务器rs2:192.168.221.30 lvs_dr_rs.sh nginx
  • VIP:192.168.221.100

调度器dir代码如下:

vim /usr/local/sbin/lvs_dr.sh
#!/bin/bash

echo 1 > /proc/sys/net/ipv4/ip_forward
ipv="/usr/sbin/ipvsadm"
vip=192.168.221.100
rs1=192.168.221.20
rs2=192.168.221.30
ifconfig ens33:2 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev ens33:2
$ipv -C
$ipv -A -t $vip:80 -s rr
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1
bash /usr/local/sbin/lvs_dr.sh

rs1代码如下:

vim /usr/local/sbin/lvs_dr_rs.sh
#!/bin/bash

vip="192.168.221.100"
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0

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
bash /usr/local/sbin/lvs_dr_rs.sh

rs2代码如下:

vim /usr/local/sbin/lvs_dr_rs.sh
#!/bin/bash

vip="192.168.221.100"
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0

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
bash /usr/local/sbin/lvs_dr_rs.sh

在浏览器中访问
keepalive + LVS

keepalived LVS

LVS架构中,不管是NAT模式还是DR模式,当后端的RS宕掉时,调度器依然会把请求转发到宕掉的RS上,这样的结果并不是我们想要的。其实,keepalived就可以解决该问题,它不仅仅有高可用的功能,还有负载均衡的功能。在调度器上只要安装了keepalived,就不用再安装ivpsadm了,也不用去编写lvs相关的脚本了,也就是说keepalived已经嵌入了lvs功能了。完整的keepalived+lvs架构需要有两台调度器实现高可用,提供调度器服务的只需要一台,另外一台作为备用。

  • 调度器dir1:192.168.221.10 keepalived 开启路由转发功能
  • 调度器dir2:192.168.221.50 keepalived 开启路由转发功能
  • 真实服务器rs1:192.168.221.20 nginx
  • 真实服务器rs2:192.168.221.30 nginx
  • VIP:192.168.221.100

调度器dir1的代码如下(dir1与dir2代码一样):

yum install keepalived -y
 vim /etc/keepalived/keepalived.conf  //以下是文件内容 
 vrrp_instance VI_1 {
    state MASTER       //dir2上为"BACKUP"
    interface ens33
    virtual_router_id 51
    priority 100         //dir2上改为“90”
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.221.100
    }
}

virtual_server 192.168.221.100 80 {
    delay_loop 6
    lb_algo wlc
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 192.168.221.20 80 {
        weight 100
        TCP_CHECK {
                connection_timeout 10
                nb_get_retry 3
                delay_before_retry 3
                connect_port 80
        }
    }
    real_server 192.168.221.30 80 {
        weight 100
        TCP_CHECK {
                connection_timeout 10
                nb_get_retry 3
                delay_before_retry 3
                connect_port 80
        }
    }
}

rs1,rs2上分别执行

bash /usr/local/sbin/lvs_dr_rs.sh   //内容与上面定义的一样

测试

在浏览器中访问192.168.221.100
关闭rs1中的nginx进行测试
关闭dir1中的keepalived进行测试