2018-07-20笔记(keeplived高用,lvs负载 均衡)

18.1 集群介绍

集群(cluster)就是一组计算机,它们作为一个整体向用户提供一组网络资源。这些单个的计算机系统就是集群的节点(node)。一个理想的集群是,用户从来不会意识到集群系统底层的节点,在他们看来,集群是一个系统,而非多个计算机系统。并且集群系统的管理员可以随意增加和删改集群系统的节点
集群根据功能划分为两大类:高可用和负载均衡。
高可用集群

高可用集群通常为2台服务器,一台工作,另一台作为冗余,当提供服务的机器宕机时,冗余将接替继续提供服务。
实现高可用的开源软件有:heartbeat、Keepalived,其中heartbeat已无人维护,所以今后使用Keepalived来搭建高可用集群。
负载均衡集群

负载均衡集群,需要有1台服务器作为分发器,它负责把用户的请求分发给后端的服务器处理,在这个集群里,除了分发器外就是给用户提供服务的服务器了,这些服务器数量至少为2台,所以负载均衡集群至少要3台服务器。
实现负载均衡的开源软件有:LVS、Keepalived、haproxy、nginx;商业软件有:F5、Netscaler。

18.2 keepalived介绍

1.keepalived通过VRRP协议来实现高可用

2.在VRRP协议里,将多台功能相同的集齐组成一个小组,这个小组会又一个master角色和backup角色(N>=1)这个角色可以多个。

3.master会通过组播的形式向各个backup发现VRRP协议的数据包,当backup收不到master发来的VPPR数据包时,就会认为master宕机了,这时backup就会启动服务来替换新的master,如果有多台backup就要看优先级来决定。

4.keepalived要有三个模块:

core :核心,负责主进程的启动、维护以及全局配置文件的加载和解析

check:负责模块的健康检查

vrrp:提供VPPR协议

18.3/18.4/18.5 用keepalived配置高可用集群

这里用keppalived实现nginx服务的高可用,因为nginx在生产环境中,很多企业把nginx做一个负载均衡器 ,假设nginx一旦挂掉,那么后端所有的web,即使说是正常的,那也无法访问到
1、首先准备两台机器,都安装keepalived
master:192.168.66.128
backup:192.168.66.129

[root@master ~]# yum install -y keepalived
[root@backup ~]# yum install -y keepalived

2、两台机分别安装nginx,可以源码安装,也可以直接yum安装,安装nginx需要epel扩展源

yum install -y epel-release
yum install -y nginx
[root@master ~]# nginx -v
nginx version: nginx/1.10.2
[root@backup ~]# nginx -v
nginx version: nginx/1.10.2

3、master192.168.66.128配置
(1)修改keppalived默认配置文件/etc/keepalived/keepalived.conf

[root@master ~]# > /etc/keepalived/keepalived.conf            #清空默认配置文件
[root@master ~]# vi /etc/keepalived/keepalived.conf           #添加下面的内容,记得把注释去掉
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
}
#######################  check模块配置  ######################
vrrp_script chk_nginx {               
    script "/usr/local/sbin/check_ng.sh"   //检查服务是否正常,通过写脚本实现,脚本检查服务健康状态
    interval 3                             //检查的时间间断是3秒
}
#######################  vrrp模块配置  ######################
vrrp_instance VI_1 {                      //VRRP配置标识 VI_1是实例名称 
    state MASTER                          //定义master相关
    interface eth0                       //网卡名称,这里我的为eth0,通过vrrp协议去通信、去发广播
    virtual_router_id 51                  //定义路由器ID ,配置的时候和从机器一致
    priority 100                          //权重,主角色和从角色的权重是不同的
    advert_int 1                          //设定MASTER与BACKUP主机质检同步检查的时间间隔,单位为秒
    authentication {                      //认证相关信息
        auth_type PASS                    //这里认证的类型是PASS
        auth_pass 123456                  //密码的形式是一个字符串
    }
    virtual_ipaddress {                   //设置虚拟IP地址 (VIP),又叫做漂移IP地址
        192.168.66.100                    //更改为192.168.66.100
    }
    track_script {                        //加载脚本 
        chk_nginx            
    }
}

注意:需要把注释去掉后保存退出,虚拟IP地址是一个共有地址,当主机宕机后,备机Nginx启动,如果备机Nginx解析地址依然为源主机IP,则依旧无法正常访问(源主机宕机,IP地址失效)。为解决上述问题,主机和备机都解析到一个公共IP地址,在主机宕机后备机Nginx服务启动即可解析到正常可以访问的IP地址
(2)编辑上面keppalived配置中定义的检查nginx的脚本,路径也是在上面定义的

[root@master ~]# vi /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

如果不停止keepalived服务,则容易使服务器发生脑裂,在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体、动作协调的HA系统,就分裂成为2个独立的个体。由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像“裂脑人”一样,争抢“共享资源”、争起“应用服务”,就会发生严重后果——或者共享资源被瓜分、2边“服务”都起不来了;或者2边“服务”都起来了,但同时读写“共享存储”,导致数据损坏。

如何判断脑裂?

分别在两台机查看当前服务器是否拥有虚拟IP,如果两台服务器都拥有,则说明发生了脑裂,证明目前双机通信出现问题,产生此问题的原有在于 两台服务器都探测不到组内其他服务器的状态(心跳请求无法正常响应),私自判定另一台服务器挂起,则抢占虚拟IP,脑裂的出现是不被允许的,解决此问题的方法为检查防火墙设置(关闭防火墙)或者使用串口通信。
注:需要注意脚本中nginx的启动方式,如果是自定义脚本启动的用上面的方式,yum 安装使用service 或者systemctl启动
keepalived的停止方式,因为是centos7所以用 systemctl stop
(3)给脚本加上执行权限

[root@master ~]# chmod 755 /usr/local/sbin/check_ng.sh

(4)启动keepalived
主机和备机启动keepalived服务前都要先检查selinux以及防火墙是否关闭,防止两边检测不到对方的状态

[root@master ~]# systemctl start keepalived
[root@master ~]# ps aux |grep keepalived
root      3386  0.0  0.1  17224  1100 ?        Ss   16:41   0:00 /usr/sbin/keepalived -D
root      3388  0.0  0.2  17308  2660 ?        S    16:41   0:00 /usr/sbin/keepalived -D
root      3389  0.1  0.1  17308  1920 ?        S    16:41   0:00 /usr/sbin/keepalived -D
root      3678  0.0  0.0   6044   812 pts/0    S+   16:43   0:00 grep keepalived

(5)测试监控脚本可用性
因为在keepalived配置中定义了nginx检查脚本,并加载,所以启动keepalived会去检查nginx的进程,没有会自动启动nginx,这里已经把nginx也带起来,说明脚本正常

[root@master ~]# ps aux |grep nginx
root      3417  0.0  0.1  15776  1560 ?        Ss   16:41   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx     3420  0.0  0.2  15940  2388 ?        S    16:41   0:00 nginx: worker process                   
root      4366  0.0  0.0   6044   808 pts/0    S+   16:49   0:00 grep nginx

(6)keepalived相关的日志会记录在/var/log/messages下,可以看到vip已经添加

[root@master ~]# cat /var/log/messages
Jul 16 16:41:41 localhost Keepalived_healthcheckers[3388]: Opening file '/etc/keepalived/keepalived.conf'.
Jul 16 16:41:41 localhost Keepalived_healthcheckers[3388]: Configuration is using : 6710 Bytes
Jul 16 16:41:41 localhost Keepalived_healthcheckers[3388]: Using LinkWatch kernel netlink reflector...
Jul 16 16:41:41 localhost Keepalived_healthcheckers[3388]: Netlink reflector reports IP 192.168.66.100 added
Jul 16 16:41:45 localhost Keepalived_vrrp[3389]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.66.100

(7)查看vip地址

[root@master ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:95:62:81 brd ff:ff:ff:ff:ff:ff
    inet 192.168.66.128/24 brd 192.168.66.255 scope global eth0
    inet 192.168.66.100/32 scope global eth0
    inet6 fe80::20c:29ff:fe95:6281/64 scope link 
       valid_lft forever preferred_lft forever

可以看到eth0已经有两个地址192.168.66.128和192.168.66.100
(8)检查防火墙

[root@master ~]# iptables -nvL
Chain INPUT (policy ACCEPT 35856 packets, 38M 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 13895 packets, 2078K bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@master ~]# getenforce 
Disabled

4、backup192.168.66.129配置
(1)修改keppalived默认配置文件/etc/keepalived/keepalived.conf

[root@backup ~]# > /etc/keepalived/keepalived.conf 
[root@backup ~]# vi /etc/keepalived/keepalived.conf                    #添加下面的内容
global_defs {
   notification_email {
     [email protected]                          
   }                                              
   notification_email_from luo.com
   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"       
    interval 3                                  
}
vrrp_instance VI_1 {                               
    state BACKUP                                      #这里需要注意设置成大写BACKUP                                
    interface eth0                                        #注意网卡的名字
    virtual_router_id 51                              #设置成和MASTER相同的,才会认为是一组
    priority 90                                             #权重设置的比MASTER低                                 
    advert_int 1                                   
    authentication {                           
        auth_type PASS                        
        auth_pass 123456                       
    }
    virtual_ipaddress {                        
        192.168.66.100
    }
    track_script {                              
        chk_nginx                                 
    }
}

把注释去掉后保存退出,注意注释的内容
说明: 如果是多台服务器,权重决定了master宕机后,backup接管master角色的顺序
(2)编辑上面keppalived配置中定义的检查nginx的脚本,路径也是在上面定义的

[root@backup ~]# vi /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

(3)给脚本加上执行权限

[root@backup ~]# chmod 755 /usr/local/sbin/check_ng.sh

(4)检查selinux和防火墙相关的配置

[root@backup ~]# iptables -nvL
Chain INPUT (policy ACCEPT 35856 packets, 38M 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 13895 packets, 2078K bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@master ~]# getenforce 
Disabled

(5)启动keepalived,并查看

[root@backup ~]# systemctl start keepalived
[root@backup ~]# ps aux |grep keepalived
root      3697  0.0  0.1  17532  1084 ?        Ss   01:23   0:00 /usr/sbin/keepalived -D
root      3699  0.0  0.2  17616  2628 ?        S    01:23   0:00 /usr/sbin/keepalived -D
root      3700  0.0  0.1  17616  1884 ?        S    01:23   0:00 /usr/sbin/keepalived -D
root      3705  0.0  0.0   5980   776 pts/2    S+   01:26   0:00 grep keepalived

(6)查看脚本是否有效,看nginx有没自动启动

[root@backup ~]# ps aux |grep nginx
root      3746  0.0  0.1  16072  1548 ?        Ss   01:27   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx     3749  0.0  0.1  16236  1972 ?        S    01:27   0:00 nginx: worker process                   
root      4241  0.0  0.0   5980   776 pts/2    S+   01:31   0:00 grep nginx

测试
(1)在master和backup上创建一个nginx默认索引页,用来区分主和从的nginx服务

[root@master ~]# vi /usr/share/nginx/html/index.html
[root@master ~]# cat /usr/share/nginx/html/index.html 
Master Master
[root@backup ~]# vi /usr/share/nginx/html/index.html 
[root@backup ~]# cat /usr/share/nginx/html/index.html 
backup backup

(2)用浏览器访问VIP
2018-07-20笔记(keeplived高用,lvs负载 均衡)
因为VIP是在主上,所以访问到主的nginx默认索引页
(3)模拟主宕机,把主上的keepalived服务停掉,再访问VIP,看有没漂移到backup上

[root@master ~]# systemctl stop keepalived

2018-07-20笔记(keeplived高用,lvs负载 均衡)
可以看到访问是backup的nginx的默认索引页,说明VIP已经漂移到backup上
(4)模拟主已经恢复好,把主上的keepalived服务启动,看vip会不会自动漂移到master上

[root@master ~]# systemctl start keepalived

访问vip
2018-07-20笔记(keeplived高用,lvs负载 均衡)
说明测试是成功的
注意事项:
1、keepalived配置文件中的角色master和backup,网卡名字,权重和virtual_router_id
2、vip要用ip add命令查看
3、注意selinux和防火墙设置
4、keepalived服务日志记录在/var/log/message上

18.6 负载均衡集群介绍

主流开源软件LVS、keepalived、haproxy、nginx等
①其中LVS属于4层(网络OSI 7层模型),nginx属于7层,haproxy既可以认为是4层,也可以当做7层使用
②keepalived的负载均衡功能其实就是lvs,lvs是keepalived内置的
③lvs这种4层的负载均衡是可以分发TCP协议,web服务是80端口,除了分发80端口,还有其他的端口通信的,比如MySQL的负载均衡,就可以用LVS实现,而nginx仅仅支持http,https,mail,haproxy;haproxy也支持MySQL这种TCP负载均衡的
④7层有限制,不过有些更高级的功能,nginx可以通过站点目录,去区分网站服务器之前,LVS4层的就不支持
⑤相比较来说,LVS这种4层的更稳定,能承受更多的请求,承载的并发量更高,而nginx这种7层的更加灵活,能实现更多的个性化需求

18.7 LVS介绍

•LVS是由国人章文嵩开发

• 流行度不亚于apache的httpd,基于TCP/IP做的路由和转发,稳定性和效率很高

• LVS最新版本基于Linux内核2.6,有好多年不更新了

• LVS有三种常见的模式:NAT、DR、IP Tunnel

• LVS架构中有一个核心角色叫做分发器(Load balance),它用来分发用户的请求,还有诸多处理用户请求的服务器(Real Server,简称rs)
2018-07-20笔记(keeplived高用,lvs负载 均衡)
• 这种模式借助iptables的nat表来实现

• 用户的请求到分发器后,通过预设的iptables规则,把请求的数据包转发到后端的rs上去

• rs需要设定网关为分发器的内网ip

• 用户请求的数据包和返回给用户的数据包全部经过分发器,所以分发器成为瓶颈

• 在nat模式中,只需要分发器有公网ip即可,所以比较节省公网ip资源

LVS NAT模式的特点

1、LVS NAT模式是通过一个分发器(Load Balancer);把用户的请求,分发给后端的Real Server ,Real Server这些服务器接收到请求以后,处理好用户请求以后,就重新丢回给分发器;最后分发器再返回给用户;

2、LVS NAT模式的弊端是分发器会成为整个网络的瓶颈,当访问量、请求量、反馈量大的时候,分发器的压力会很大

3、LVS NAT模式的规模,一般最多支持10来台服务器,超过10台的话就会有力不从心;

4、LVS NAT模式这个结构,只需要有一个公网IP,其他real server服务器全部在内网就可以实现。可以节省很多的公网IP资源
2018-07-20笔记(keeplived高用,lvs负载 均衡)
• 这种模式,需要有一个公共的IP配置在分发器和所有rs上,我们把它叫做vip

• 客户端请求的目标IP为vip,分发器接收到请求数据包后,会对数据包做一个加工,会把目标IP改为rs的IP,这样数据包就到了rs上

• rs接收数据包后,会还原原始数据包,这样目标IP为vip,因为所有rs上配置了这个vip,所以它会认为是它自己

LVS IP Tunnel模式的特点

在分发器(load balancer)与真实服务器(real server)之间建立了虚拟通道,叫做 ip tunnel ;实际上是更改了数据包目的IP;请求过来通过分发器,通过在真实服务器上配置的VIP;用户请求的时候,数据包里面包好的目的IP,当数据包到达分发器的时候,分发器会进行一个数据包目的IP的更改,然后发送到具体的真实服务器上,通过lvs的自己的算法,进行实现到底传输到哪台真实服务器上;然后真实服务器再解包处理,再通过一个VIP直接通过公网返回到用户,这样省略数据回到分发器的过程,减小了分发器的压力,解决了分发器的瓶颈。
2018-07-20笔记(keeplived高用,lvs负载 均衡)
• 这种模式,也需要有一个公共的IP配置在分发器和所有rs上,也就是vip

• 和IP Tunnel不同的是,它会把数据包的MAC地址修改为rs的MAC地址

• rs接收数据包后,会还原原始数据包,这样目标IP为vip,因为所有rs上配置了这个vip,所以它会认为是它自己

LVS DR模式的特点

与IP Tunnel模式整体过程相同,不同的是,它会把数据包的MAC地址修改为rs的MAC地址进行分发。

18.8 LVS调度算法

• 轮询 Round-Robin rr

• 加权轮询 Weight Round-Robin wrr

• 最小连接 Least-Connection lc

• 加权最小连接 Weight Least-Connection wlc

• 基于局部性的最小连接 Locality-Based Least Connections lblc

• 带复制的基于局部性最小连接 Locality-Based Least Connections with Replication lblcr

• 目标地址散列调度 Destination Hashing dh

• 源地址散列调度 Source Hashing sh

注:前4种为常用的调度算法

18.9/18.10 LVS NAT模式搭建

lvs的nat模式,其实就是iptables端口转发,把请求转发到后端的的主机上
准备三台机器

• 分发器,也叫调度器(简写为dir)

内网 192.168.66.130,外网:192.168.100.100(vmware仅主机模式)

• rs1

内网:192.168.66.131,设置网关为192.168.66.130也就是分发器的IP

• rs2

内网:192.168.66.132,设置网关为192.168.66.130

增加网卡时需要注意:

在虚拟机增加一个新的网卡之后,并设置为仅主机模式

开启虚拟机,用ifconfig命令,查看是否已经加载了网卡——>安装ifconfig包:yum install -y net-tools

复制网卡配置文件到新的网卡里面,并更改配置文件中的IP,删除UUID,更改mac

[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens37
[root@localhost network-scripts]# vim ifcfg-ens37

更改mac,可以使用ip add命令查看,新的网卡的mac,并在配置文件中更改

重启网卡

ifup ens37

重启网络服务

systemctl restart network

用物理机尝试新的网卡IP是否能通信

三台机器上都执行执行

systemctl stop firewalld
systemc disable firewalld
systemctl start iptables
iptables -F 
service iptables save

在分发器192.168.66.130上安装ipvsadm

[root@localhost network-scripts]# yum install -y ipvsadm

在分发器192.168.66.130上编写脚本

vim /usr/local/sbin/lvs_nat.sh  
内容如下
#! /bin/bash
# director 服务器上开启路由转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward  //对内核参数修改,打开路由转发
# 关闭icmp的重定向
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects //伪装操作,不然不能转发rs的数据
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects //伪装操作,不然不能转发rs的数据
# 注意区分网卡名字,两个网卡分别为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.66.0/24  -j MASQUERADE
//MASQUERADE实现同网段的机器去上网,路由器使用的就是这个功能
# director设置ipvsadm
IPVSADM='/usr/sbin/ipvsadm'  //定义一个变量,方便下面命令引用
$IPVSADM -C    //清空规则
$IPVSADM -A -t 192.168.100.100:80 -s wlc -p 3  //用来定义lvs的模式;wlc为算法,可以按需求选择lvs里面适合的算法
$IPVSADM -a -t 192.168.100.100:80 -r 192.168.66.131:80 -m -w 1  //详细规则,-r 指定rs机器IP,-m 指定nat模式,-w指定rs权重
$IPVSADM -a -t 192.168.100.100:80 -r 192.168.66.132:80 -m -w 1  //详细规则,-r 指定rs机器IP,-m 指定nat模式,-w指定rs权重

-A增加一个规则,-t 制定lvs 模式,之后IP 就是分发器的IP,-s 指定算法;-p 指定超时时间(数据包转发超时时间),例如用户1访问的是a机器,-p 的意思就是在同一个时间,一直在同一台机器上进行请求

测试脚本

[root@localhost network-scripts]# sh /usr/local/sbin/lvs_nat.sh

执行脚本,若是没输出,表示脚本没有错误

效果测试

使用curl模拟公网IP进行访问

[root@localhost ~]# curl 192.168.100.100
master master
[root@localhost ~]# curl 192.168.100.100
backup backup
[root@localhost ~]# curl 192.168.100.100
master master
[root@localhost ~]# curl 192.168.100.100
backup backup
[root@localhost ~]# curl 192.168.100.100
master master

通过上述结果,说明lvs已经部署成功了

猜你喜欢

转载自blog.51cto.com/13736286/2148430