Linux集群 Keepalived—Nginx高可用集群架构搭建、负载均衡集群、LVS算法、搭建NAT模式LVS架构

1、Linux集群介绍

  • linux集群功能可以分为:HA高可用、负载均衡。
  • 高可用是:有两台机器,一台作为主用工作,一台作为冗余备份。当主用机器宕机后,冗余机器将接替,继续提供服务。
开源的高可用软件有:heartbeat、keepalived,其中heartbeat已无人维护,现在基本上都使用keepalived。
  • 负载均衡集群,需要有一台服务器作为分发器,它负责把用户的请求分发给后端的服务器处理,在这个集群里,除了分发器外,就是给用户提供服务的服务器了,这些服务器数量至少为2台;
实现负载均衡的开源软件有LVS、keepalived、haproxy、nginx,商业的负载均衡有:F5、Netscaler,优点是稳定,支持高并发,但是价格昂贵。

2、keepalived介绍

  • 高可用我们重点学习keepalived。heartbeat由于在Centos6上会有一些问题,偶尔会切换不及时,已经比较少使用。
  • keepalived通过VRRP(Virtual Router Redundancy Protocl 中文为:虚拟路由冗余协议)来实现高可用。
  • HA高可用:类似是多台功能相同的路由器组成的一个小组,小组中有一台master角色,N>=1个backup角色。
  • master会组播vrrp数据包给backup,当backup收不到master发送的数据包时,就认为master宕机了,使用backup来充当新的master(通过backup的优先级来判断哪个backup成功新的master)
  • Keepalived要有三个模块,分别是core、check和vrrp。其中core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析,check模块负责健康检查,vrrp模块是来实现VRRP协议的。

3、keepalived配置高可用集群

  1. 首先准备两台机器,都安装keepalived: yum install -y keepalived ;keepalived,实际是包含一个服务的,也就是说这个服务用来实现高可用;
A机器:ip:110
[root@aminglinux ~]# yum install -y keepalived
B机器:ip:112
[root@localhost ~]# yum install -y keepalived
VIP :IP:115
  1. 这里使用 nginx ,把它作为一个高可用的对象——>使用nginx作为演示对象的原因,因为nginx在工作中,在生产环境中,很多企业把nginx做一个负载均衡器 ,假设nginx一旦挂掉,那么后端所有的web,即使说是正常的,那也无法访问到;
  • 若是A、B机器没有装nginx服务,可以直接 yum安装
  • 若是lnmp安装过nginx,则不需要安装了(源码包安装的nginx)
A机器:yum安装
[root@aminglinux ~]# yum install -y nginx
[root@aminglinux ~]# systemctl start nginx
[root@aminglinux ~]# ps aux |grep nginx
root      2064  0.0  0.2 120812  2092 ?        Ss   22:41   0:00 nginx: master process /usr/sbin/nginx
nginx     2065  0.0  0.3 121276  3128 ?        S    22:41   0:00 nginx: worker process
nginx     2066  0.0  0.3 121276  3128 ?        S    22:41   0:00 nginx: worker process
root      2068  0.0  0.0 112720   984 pts/0    S+   22:41   0:00 grep --color=auto nginx
B机器:因之前安装过lnmp,不需安装
[root@localhost ~]# ps aux |grep nginx
root      1057  0.0  0.1  46040  1264 ?        Ss   21:05   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody    1058  0.0  0.3  48528  3904 ?        S    21:05   0:00 nginx: worker process
nobody    1059  0.0  0.3  48528  3904 ?        S    21:05   0:00 nginx: worker process
root      1667  0.0  0.0 112724   984 pts/0    S+   22:35   0:00 grep --color=auto nginx

**3. master上修改keepalived的配置文件;**配置文件内容地址:https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/master_keepalived.conf

  • 默认的配置文件路径在/etc/keepalived/keepalived.conf
  • 清空文件的快捷键方法 > !$
[root@aminglinux ~]# ls /etc/keepalived/keepalived.conf 
/etc/keepalived/keepalived.conf
[root@aminglinux ~]# > !$    //直接清空文件内容了
> /etc/keepalived/keepalived.conf
[root@aminglinux ~]# cat /etc/keepalived/keepalived.conf
[root@aminglinux ~]# vim /etc/keepalived/keepalived.conf   //去文件地址去下载内容
将拷贝的内容复制进去
只需要改网卡名字和IP192.168.222.115
####################### #  全局配置 #######################
global_defs {                            //global_defs 全局配置标识
   notification_email {               //notification_email用于设置报警邮件地址
   [email protected]           //可以设置多个,每行一个
   }
   notification_email_from [email protected]    //设置邮件发送地址  
   smtp_server 127.0.0.1                //设置邮件的smtp server地址
   smtp_connect_timeout 30            //设置连接smtp sever超时时间
   router_id LVS_DEVEL
}

###################### #  VRRP配置 ######################
vrrp_script chk_nginx {               
    script "/usr/local/sbin/check_ng.sh"   //检查服务是否正常,通过写脚本实现,脚本检查服务健康状态
    interval 3                      //检查的时间间断是3秒
}
vrrp_instance VI_1 {                        //VRRP配置标识 VI_1是实例名称 
    state MASTER                           //定义master相关
    interface ens33                 //通过vrrp协议去通信、去发广播。配置时,需注意自己的网卡名称
    virtual_router_id 51                   //定义路由器ID ,配置的时候和从机器一致
    priority 100                              //权重,主角色和从角色的权重是不同的
    advert_int 1                            //设定MASTER与BACKUP主机质检同步检查的时间间隔,单位为秒
    authentication {                       //认证相关信息
        auth_type PASS                   //这里认证的类型是PASS
        auth_pass aminglinux>com   //密码的形式是一个字符串
    }
    virtual_ipaddress {                  //设置虚拟IP地址 (VIP),又叫做漂移IP地址
        192.168.222.115   //更改为192.168.222.115
    }
    track_script {               //加载脚本 
        chk_nginx            
    }
}
  • virtual_ipaddress:简称VIP,这个vip,两台机器,一个主,一个从,正常的情况是主在服务,主宕掉了,从起来了,从启动服务,从启动nginx以后,,启动以后,访问那个IP呢?把域名解析到那个IP上呢?假如解析到主上,主宕掉了,所以这个,需要定义一个公有IP(主上用的IP,从上也用的IP);这个IP是随时可以夏掉,去配置的
  1. 定义监控脚本,脚本内容地址:http://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/master_check_ng.sh
  • 脚本路径在keepalived配置文件中有定义,路径为/usr/local/sbin/check_ng.sh
[root@aminglinux ~]# vim /usr/local/sbin/check_ng.sh
[root@aminglinux ~]# cat /usr/local/sbin/check_ng.sh
#!/bin/bash
#时间变量,用于记录日志
d=`date --date today +%Y%m%d_%H:%M:%S`
#计算nginx进程数量
n=`ps -C nginx --no-heading|wc -l`
#如果进程为0,则启动nginx,并且再次检测nginx进程数量,
#如果还为0,说明nginx无法启动,此时需要关闭keepalived
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_ng.log
                systemctl stop keepalived
        fi
fi
  • “脑裂”,在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体、动作协调的HA系统,就分裂成为2个独立的个体。由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像“裂脑人”一样,争抢“共享资源”、争起“应用服务”,就会发生严重后果——或者共享资源被瓜分、2边“服务”都起不来了;或者2边“服务”都起来了,但同时读写“共享存储”,导致数据损坏
  • 如何判断脑裂?
    • 分别在两台机查看当前服务器是否拥有虚拟IP,如果两台服务器都拥有,则说明发生了脑裂,证明目前双机通信出现问题,产生此问题的原有在于 两台服务器都探测不到组内其他服务器的状态(心跳请求无法正常响应),私自判定另一台服务器挂起,则抢占虚拟IP,脑裂的出现是不被允许的,解决此问题的方法为检查防火墙设置(关闭防火墙)或者使用串口通信。
  1. 脚本创建完之后,还需要改变脚本的权限(不更改权限,就无法自动加载脚本,那就无法启动keepalived服务)
[root@aminglinux ~]# chmod 755 /usr/local/sbin/check_ng.sh
  1. 启动keepalived服务,并查看是否启动成功(PS:启动不成功,有可能是防火墙未关闭或者规则限制导致的)
  • systemctl stop firewalld 关闭firewalld
  • iptables -nvL
  • setenforce 0 临时关闭selinux
  • getenforce命令查看是否为Permissive
  • 这时再来启动keepalived,就会看到keepalived进程服务了
[root@aminglinux ~]# systemctl start keepalived
[root@aminglinux ~]#  ps aux |grep keep
root      2121  0.1  0.1 118652  1396 ?        Ss   23:16   0:00 /usr/sbin/keepalived -D
root      2122  0.0  0.3 127516  3296 ?        S    23:16   0:00 /usr/sbin/keepalived -D
root      2124  0.3  0.2 127456  2836 ?        S    23:16   0:00 /usr/sbin/keepalived -D
root      2142  0.0  0.0 112720   980 pts/0    S+   23:16   0:00 grep --color=auto keep
  1. 查看nginx服务进程;
[root@aminglinux ~]# ps aux |grep nginx
root      2064  0.0  0.2 120812  2092 ?        Ss   22:41   0:00 nginx: master process /usr/sbin/nginx
nginx     2065  0.0  0.3 121276  3128 ?        S    22:41   0:00 nginx: worker process
nginx     2066  0.0  0.3 121276  3128 ?        S    22:41   0:00 nginx: worker process
root      2457  0.0  0.0 112720   984 pts/0    S+   23:18   0:00 grep --color=auto nginx
  1. 关闭nginx,查看是否会自动重新启动nginx服务:因为keepalived会3秒执行检查脚本,如果nginx没进程就会自动启动。
[root@aminglinux ~]# /etc/init.d/nginx stop
-bash: /etc/init.d/nginx: 没有那个文件或目录

如出现以上提示,则是没有nginx没有配置;添加启动脚本和配置文件 及更改权限即可;参考:https://blog.csdn.net/xou6363/article/details/80875824 nginx安装

[root@aminglinux ~]# /etc/init.d/nginx stop
Stopping nginx (via systemctl):                            [  确定  ]
[root@aminglinux ~]# ps aux |grep nginx
root      3694  0.0  0.2 120812  2092 ?        Ss   23:28   0:00 nginx: master process /usr/sbin/nginx
nginx     3695  0.0  0.3 121276  3128 ?        S    23:28   0:00 nginx: worker process
nginx     3696  0.0  0.3 121276  3128 ?        S    23:28   0:00 nginx: worker process
root      3821  0.0  0.0 112720   980 pts/0    S+   23:29   0:00 grep --color=auto nginx
  1. keepalived日志文件路径:/var/log/messages
  2. 查看ip地址,使用 ip add 命令,而不能使用ifconfig命令,因为 ifconfig命令 是无法查看到vip192.168.222.110这个IP的
[root@aminglinux ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:97:24:0e brd ff:ff:ff:ff:ff:ff
    inet 192.168.222.110/24 brd 192.168.222.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.222.110/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::5206:ca54:f17f:91a3/64 scope link 
       valid_lft forever preferred_lft forever
    inet6 fe80::effe:fc70:7a68:994c/64 scope link tentative dadfailed 
       valid_lft forever preferred_lft forever
  1. 检查A、B 机器下防火墙和selinux是否关闭了,若没有关闭,可能会导致实验失败
  • systemctl stop firewalld 关闭firewalld
  • iptables -nvL
  • setenforce 0 临时关闭selinux
  • getenforce命令查看是否为Permissive

12. 配置backup机器的keepalived配置文件;更改虚拟IP和主一样的;配置文件内容地址:https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/backup_keepalived.conf

  • 首先关闭防火墙,清空B机器keepalived里面自带的配置文件
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce
Permissive
[root@localhost ~]# iptables -F
[root@localhost ~]# ls /etc/keepalived/keepalived.conf
/etc/keepalived/keepalived.conf
[root@localhost ~]# > !$
> /etc/keepalived/keepalived.conf
[root@localhost ~]# cat /etc/keepalived/keepalived.conf
[root@localhost ~]# vim /etc/keepalived/keepalived.conf
[root@localhost ~]# cat /etc/keepalived/keepalived.conf
global_defs {
   notification_email {
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_script chk_nginx {
    script "/usr/local/sbin/check_ng.sh"  //监控nginx服务的脚本
    interval 3
}

vrrp_instance VI_1 {
    state BACKUP      //这里 和master不一样的名字
    interface ens33  //网卡和当前机器一致,否则无法启动keepalived服务
    virtual_router_id 51  //和主机器 保持一致
    priority 90  //权重,要比主机器小的数值
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass aminglinux>com
    }
    virtual_ipaddress {
        192.168.222.115  //虚拟ip
    }

    track_script {
        chk_nginx
    }

}
[root@localhost ~]# vim /usr/local/sbin/check_ng.sh
#时间变量,用于记录日志
d=`date --date today +%Y%m%d_%H:%M:%S`
#计算nginx进程数量
n=`ps -C nginx --no-heading|wc -l`
#如果进程为0,则启动nginx,并且再次检测nginx进程数量,
#如果还为0,说明nginx无法启动,此时需要关闭keepalived
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_ng.log
                systemctl stop keepalived
        fi
fi
  • 改动脚本的权限,设置为755权限
[root@localhost ~]# chmod 755 /usr/local/sbin/check_ng.sh
  • B机器启动keepalived服务 systemctl start keepalived
[root@localhost ~]# systemctl start keepalived
[root@localhost ~]# ps aux |grep keepalived
root      1784  0.1  0.1 118652  1396 ?        Ss   00:13   0:00 /usr/sbin/keepalived -D
root      1785  0.1  0.3 120776  3112 ?        S    00:13   0:00 /usr/sbin/keepalived -D
root      1786  0.6  0.2 120776  2564 ?        S    00:13   0:00 /usr/sbin/keepalived -D
root      1825  0.0  0.0 112720   984 pts/0    S+   00:13   0:00 grep --color=auto keepalived

如何区分主和从上的nginx?

  • A机器是yum安装的nginx;默认的索引页在 /usr/share/nginx/html/index.html
[root@aminglinux ~]# mv /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.bak
[root@aminglinux ~]# vim /usr/share/nginx/html/index.html

master
  • B机器,是源码包安装的nginx
[root@localhost ~]# ls /usr/local/nginx/html/
1.php  50x.html  index.html
[root@localhost ~]# mv /usr/local/nginx/html/index.html /usr/local/nginx/html/index.html.bak
[root@localhost ~]# vim /usr/local/nginx/html/index.html

backup

测试高可用

  1. 模拟线上生产环境,主机器宕机环境,最简单直接的方法,就是直接关闭keepalived服务
  2. 关闭master机器(即A机器)上的keepalived服务关闭
[root@aminglinux ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:97:24:0e brd ff:ff:ff:ff:ff:ff
    inet 192.168.222.110/24 brd 192.168.222.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::5206:ca54:f17f:91a3/64 scope link 
       valid_lft forever preferred_lft forever
    inet6 fe80::effe:fc70:7a68:994c/64 scope link tentative dadfailed 
       valid_lft forever preferred_lft forever
  • 查看backup机器(即B机器)在监听VIP
[root@localhost ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:6d:7e:bf brd ff:ff:ff:ff:ff:ff
    inet 192.168.222.112/24 brd 192.168.222.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.222.110/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::effe:fc70:7a68:994c/64 scope link 
       valid_lft forever preferred_lft forever
  • 查看B机器日志
[root@localhost ~]# tail /var/log/messages
Jul 22 00:42:58 localhost Keepalived_vrrp[1786]: Sending gratuitous ARP on ens33 for 192.168.222.110
Jul 22 00:43:03 localhost Keepalived_vrrp[1786]: Sending gratuitous ARP on ens33 for 192.168.222.110
Jul 22 00:43:03 localhost Keepalived_vrrp[1786]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.222.110
Jul 22 00:43:03 localhost Keepalived_vrrp[1786]: Sending gratuitous ARP on ens33 for 192.168.222.110
Jul 22 00:43:03 localhost Keepalived_vrrp[1786]: Sending gratuitous ARP on ens33 for 192.168.222.110
Jul 22 00:43:03 localhost Keepalived_vrrp[1786]: Sending gratuitous ARP on ens33 for 192.168.222.110
Jul 22 00:43:03 localhost Keepalived_vrrp[1786]: Sending gratuitous ARP on ens33 for 192.168.222.110
Jul 22 00:43:50 localhost systemd-logind: New session 6 of user root.
Jul 22 00:43:50 localhost systemd: Started Session 6 of user root.
Jul 22 00:43:50 localhost systemd: Starting Session 6 of user root.
  • 在A机器启动keepalived服务,会看到vip这个IP立刻回来了
[root@localhost ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:6d:7e:bf brd ff:ff:ff:ff:ff:ff
    inet 192.168.222.112/24 brd 192.168.222.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.222.110/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::effe:fc70:7a68:994c/64 scope link 
       valid_lft forever preferred_lft forever

1、负载均衡集群介绍

  • 负载均衡集群比较主流的开源软件有:LVS、keepalived、haproxy、nginx等,其中LVS属于4层(网络OSI 7层模型),nginx属于7层,haproxy既可以认为是4层,也可以当做7层使用。
  • LVS:4层的负载均衡是可以分发除80外的其他端口通信的,例如MySQL的3306端口,而nginx仅仅支持http,https,mail;
  • haproxy也支持MySQL,相比较LVS这种4层的更稳定,能承受更多的请求,keepalived的负载均衡功能其实就是lvs。
  • 而nginx这种7层的更加灵活,能实现更多的个性化需求。
  • 商业的负载均衡解决方案稳定性比较好,但是成本非常昂贵,所以以开源的LVS为主

LVS介绍

  • LVS是由国人章文嵩开发
  • 流行度不亚于apache的httpd,基于TCP/IP做的路由和转发,稳定性和效率很高
  • LVS最新版本基于Linux内核2.6,有好多年不更新了
  • LVS有三种常见的模式:NAT模式、IP Tunnel(IP隧道)模式、DR模式
  • LVS架构中有一个核心角色叫做分发器(Load balance),它用来分发用户的请求,还有诸多处理用户请求的服务器(Real Server,简称rs)

LVS NAT模式

 

  • LVS NAT模式,借助iptables的nat表来实现
  • 用户的请求到分发器后,通过预设的iptables规则,把请求的数据包转发到后端的rs上去
  • rs需要设定网关为分发器的内网ip
  • 用户请求的数据包和返回给用户的数据包全部经过分发器,所以分发器成为瓶颈
  • 在nat模式中,只需要分发器有公网ip即可,所以比较节省公网ip资源
  • Load Balancer,就是一个分发器;把用户的请求,分发给后端的Real Server ,Real Server这些服务器接收到请求以后,处理好用户请求以后,就重新丢回给Load Balancer;最后Load Balancer再返回给用户;
  • 这个模式的弊端,当访问量、请求量、反馈量大的时候,Load Balancer的压力很大
  • LVS规模,一般规模最多支持10来台服务器,超过10台的话就会有力不从心;
  • nat模式这个结构,只需要有一个公网IP,其他real server服务器全部在内网就可以实现。优点,节省很多的资源

LVS IP Tunnel模式

 

  • LVS IP Tunnel模式,需要有一个公共的IP配置在分发器和所有rs上,我们把它叫做vip
  • 客户端请求的目标IP为vip,分发器接收到请求数据包后,会对数据包做一个加工,会把目标IP改为rs的IP,这样数据包就到了rs上
  • rs接收数据包后,会还原原始数据包,这样目标IP为vip,因为所有rs上配置了这个vip,所以它会认为是它自己
  • 在load balancer与real server之间建立了虚拟通道,叫做 ip tunnel ;实际上是更改了数据包 目的IP;请求过来通过load balancer,通过在real server上配置的VIP;用户请求的时候,数据包里面包好的目的IP,当数据包到达load balancer的时候,load balancer会进行一个数据包目的IP的更改,然后发送到具体的real server上,通过lvs的自己的算法,进行实现到底传输到那个real server上;然后real server再解包处理,再通过一个VIP直接返回到用户,这就省略数据回到load balancer分发器的过程,这样就load balancer就没有瓶颈

LVS DR模式

  • LVS DR模式,也需要有一个公共的IP配置在分发器和所有rs上,也就是vip
  • 和IP Tunnel不同的是,它会把数据包的MAC地址修改为rs的MAC地址
  • rs接收数据包后,会还原原始数据包,这样目标IP为vip,因为所有rs上配置了这个vip,所以它会认为是它自己

 

2、LVS调度算法

  • 调度器把客户端发来的请求均衡地分发给后端的真实服务器,这是依靠预先设定好的调度算法实现的,在LVS中支持的调度算法主要有以下8种;
  •  
  • 1、 轮询调度(Round-Robin-rr)
    • 非常简单的一种调度算法,就是按顺序把请求一次发送给后端的服务器,它不管后端服务器的处理速度和相应时间怎样。但当后端服务器性能不一致时,用这种调度算法就不合适了;
  • 2、 加权轮询(Weight Round-Robin-wrr)
    • 比第一种算法多了一个权重的设置,权重越高的服务器被分配到的请求就越多,这样后端服务器性能不一致时,就可以给配置低的服务器较小的权重;
  • 3、 最小连接(Least-Connection-lc)
    • 这种算法会根据各真实服务器上的连接数来决定把新的请求分配给谁,连接数越少说明服务器是空闲的,这样把新的请求分配到空闲服务器上才更加合理;
  • 4、 加权最小连接(Weight Least-Connection-wlc)
    • 在最小连接调度的基础上再增加一个权重设置,这样就可以人为地去控制哪些服务器上多分配请求,哪些少分配请求;
  • 5、 基于局部性的最小连接(Locality-Based Least Connections-lblc)
    • 是针对请求报文的目标IP地址的负载均衡调度,目前主要用于Cache集群系统,因为在Cache集群中客户请求报文的目标IP地址使变化的。算法设计的穆鸟是在服务器的负载在基本平衡的情况下,将相同目标IP的请求调度到同一台服务器,来提高各台服务器的访问局部性和贮存Cache命中率;
  • 6、 带复制的基于局部性最小连接(Locality-Based Least Connections with Replication-lblcr)
    • 也是针对目标IP地址的负载均衡,它与LBLC算法的不同之处是:它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法是维护一个目标IP地址到一台服务器的映射。LBLCR算法先更换请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从该服务器组中选出一台服务器,若服务器没有超载,则将请求发送到该服务器;若服务器超载,则按“最小连接”原则从整个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度;
  • 7、 目标地址散列调度(Destination Hashing-dh)
    • 该算法也是针对目标IP地址的负载均衡的,但它是一种静态映射算法,通过一个散列(hash)函数讲一个目标IP地址映射到一台服务器。目标地址散列调度算法先根据请求的目标IP地址,作为散列建(hash key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
  • 8、源地址散列调度(Source Hashing-sh)
    • 该算法正好与目标地址散列调度算法相反,它根据请求的源IP地址,作为散列键从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。它的算法流程与目标地址散列调度算法基本类似,只不过请求的目标IP地址换成请求的源IP地址。

** 3、LVS NAT模式搭建**

  • NAT模式是通过iptables实现的,所以必须配置一些iptables规则
  • 准备三台机器,一台作为分发器,也叫做调度器,简称 dir,另外两台就是real server,用来处理用户请求的服务器,rs1、rs2

1、网段配置:

A设置两张网卡,ens33为内网:192.168.222.110、ens37为外网(虚拟机仅主机模式):192.168.209.130

B设置一张网卡,ens33为内网:192.168.222.111,网关必须是A的内网ip:192.168.222.110

C设置一张网卡,ens33为内网:192.168.222.112,网关必须是A的内网ip:192.168.222.110
  • 克隆的主机更改计算机名和IP;
  • A机器新增的网卡设置:
  • 新增网卡,设置仅主机模式;
  • 开启虚拟机,用ifconfig命令,查看是否已经加载了网卡;
  • 复制网卡配置文件到新的网卡里面,并更改配置文件中的IP,删除UUID,更改mac
[root@aminglinux ~]# cd /etc/sysconfig/network-scripts/
[root@aminglinux network-scripts]# cp ifcfg-ens33 ifcfg-ens37
[root@aminglinux network-scripts]# vim ifcfg-ens37
  • 更改mac,可以使用ip add命令查看,新的网卡的mac,并在配置文件中更改
  • 重启网卡:ifup ens37
  • 重启网络服务:systemctl restart network
  • 用物理机尝试新的网卡IP是否能通信
  • 三台机器设置完成后,关闭三台机器的防火墙
  • 机器B、机器C 下载安装iptables-services 包:yum install -y iptables-services
  • 机器B、机器C 启动iptables服务:systemctl start iptables
  • 机器B、机器C 设置开机启动:systemctl enable iptables;清空规则:iptables -F;service iptables save;
[root@aming2 ~]# systemctl start iptables
[root@aming2 ~]# systemctl enable iptables
Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.
[root@aming2 ~]# iptables -F
[root@aming2 ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  确定  ]
[root@aming2 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 11 packets, 784 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 13 packets, 1284 bytes)
 pkts bytes target     prot opt in     out     source               destination

2、A机器安装LVS的核心组件工具:ipvsadm

[root@aminglinux ~]# yum install -y ipvsadm
  • 编写脚本并执行:/usr/local/sbin/lvs_nat.sh
[root@aminglinux ~]# vim /usr/local/sbin/lvs_nat.sh

# director 服务器上开启路由转发功能
echo 1 /proc/sys/net/ipv4/ip_forward
# 关闭icmp的重定向
echo 0  /proc/sys/net/ipv4/conf/all/send_redirects
echo 0  /proc/sys/net/ipv4/conf/default/send_redirects
# 注意区分网卡名字,两个网卡分别为ens33和ens37
echo 0  /proc/sys/net/ipv4/conf/ens33/send_redirects   //内网
echo 0  /proc/sys/net/ipv4/conf/ens37/send_redirects    //外网
# director 设置nat防火墙
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 192.168.222.0/24  -j MASQUERADE
# director设置ipvsadm
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 192.168.209.130:80 -s rr
$IPVSADM -a -t 192.168.209.130:80 -r 192.168.222.111:80 -m -w 1
$IPVSADM -a -t 192.168.209.130:80 -r 192.168.222.112:80 -m -w 1
  • 执行脚本,若是没输出,表示脚本没有错误
[root@aminglinux ~]# sh /usr/local/sbin/lvs_nat.sh

测试:

  • 两台rs上都安装nginx
  • 设置两台rs的主页,做一个区分,也就是说直接curl两台rs的ip时,得到不同的结果
编辑B机器的索引页
[root@aming2 nginx]# vi /usr/local/nginx/html/index.html
[root@aming2 nginx]# curl localhost
aming2
编辑C机器的索引页
[root@aming3 ~]# vim /usr/local/nginx/html/index.html
[root@aming3 ~]# curl localhost
This is a test default site.
[root@aminglinux ~]# curl 192.168.209.130
This is a test default site.
[root@aminglinux ~]# curl 192.168.209.130
aming2
[root@aminglinux ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.209.130:80 wlc persistent 3
  -> 192.168.222.111:80           Masq    1      0          3         
  -> 192.168.222.112:80           Masq    1      0          9

猜你喜欢

转载自blog.csdn.net/xou6363/article/details/81159354