• 目录
  • 1.集群介绍
  • 2.keepalived介绍
  • 3.用keepalived配置高可用集群
  • 4.负载均衡集群介绍
  • 5.LVS介绍
  • 6.LVS调度算法
  • 7.LVS NAT模式搭建

 

 

 

1.集群介绍

由多台机器组成的大机器。

根据功能划分为两大类:高可用和负载均衡。

高可用集群通常为两台服务器,一台工作,另外一台作为冗余,当提供服务的机器宕机,冗余将接替继续提供服务(切换时间很短);实现高可用的开源软件有:heartbeat(centos6中有很多bug,不推荐使用)、keepalived (有高可用功能,还有负载均衡的功效,配置简单)。

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

 

2.keepalived介绍

keepalived通过VRRP(Virtual Router Redundancy Protocl虚拟路由冗余协议)来实现高可用。

在这个协议里会将多台功能相同的路由器组成一个小组,这个小组里会有1个master角色和N(N>=1)个backup角色。

master会通过组播的形式向各个backup发送VRRP协议的数据包,当backup收不到master发来的VRRP数据包时,就会认为master宕机了。此时就需要根据各个backup的优先级来决定谁成为新的mater。

Keepalived要有三个模块,分别是core、check和vrrp。其中core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析,check模块负责健康检查,vrrp模块是来实现VRRP协议的。

 

3.用keepalived配置高可用集群

准备两台机器78和79,78作为master ,79作为backup

两台机器都需要安装keepalived

[root@xiaoqi ~]# yum install keepalived.x86_64 -y

两台机器都需要安装nginx。

清空keepalived.conf的原始配置文件 配置文件内容

[root@xiaoqi ~]# vim /etc/keepalived/keepalived.conf 

global_defs {
   notification_email {
     aming@aminglinux.com
   }
   notification_email_from root@aminglinux.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 {                           定义master
    state MASTER                               角色
    interface ens33                            定义网卡
    virtual_router_id 51                       定义路由器id
    priority 100                               权重
    advert_int 1   
    authentication {                           认证
        auth_type PASS 
        auth_pass aminglinux>com               密码
    }
    virtual_ipaddress {                        vip定义
        192.168.188.100                        随时定义ip
    }

    track_script {
        chk_nginx
    }

}

定义脚本 脚本地址

#!/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

修改脚本权限

[root@xiaoqi ~]# chmod 755 !$
chmod 755 /usr/local/sbin/check_ng.sh
开启服务

[root@xiaoqi ~]# systemctl start keepalived.service 

[root@xiaoqi ~]# ps aux|grep keepalived
root      29203  0.0  0.0 118652  1392 ?        Ss   14:44   0:00 /usr/sbin/keepalived -D
root      29204  0.0  0.1 127516  3292 ?        S    14:44   0:00 /usr/sbin/keepalived -D
root      29205  0.0  0.1 127456  2840 ?        S    14:44   0:00 /usr/sbin/keepalived -D
root      29260  0.0  0.0 112720   984 pts/0    R+   14:44   0:00 grep --color=auto keepalived

[root@xiaoqi ~]# ps aux|grep keepalived
root      29203  0.0  0.0 118652  1392 ?        Ss   14:44   0:00 /usr/sbin/keepalived -D
root      29204  0.0  0.1 127516  3292 ?        S    14:44   0:00 /usr/sbin/keepalived -D
root      29205  0.0  0.1 127456  2840 ?        S    14:44   0:00 /usr/sbin/keepalived -D
root      29260  0.0  0.0 112720   984 pts/0    R+   14:44   0:00 grep --color=auto keepalived

手动停止nginx,nginx还会自动加载

[root@xiaoqi ~]# /etc/init.d/nginx stop
Stopping nginx (via systemctl):                            [  确定  ]
[root@xiaoqi ~]# !ps
ps aux|grep nginx
root      29418  0.0  0.0  24876   764 ?        Ss   14:45   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody    29420  0.0  0.0  25300  1220 ?        S    14:45   0:00 nginx: worker process
root      29424  0.0  0.0 112720   984 pts/0    R+   14:45   0:00 grep --color=auto nginx

查看SELinux是否关闭

在从上编辑配置文件从配置文件

}

vrrp_script chk_nginx {
    script "/usr/local/sbin/check_ng.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 aminglinux>com
    }
    virtual_ipaddress {
        192.168.1.197
    }

    track_script {
        chk_nginx
    }

}

写检测脚本

[root@xiaoqi1 ~]# vim /usr/local/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

修改权限

[root@xiaoqi1 ~]# chmod 755 !$
chmod 755 /usr/local/check_ng.sh

启动服务

[root@xiaoqi1 ~]# systemctl start keepalived
[root@xiaoqi1 ~]# ps aux |grep keepalived
root       5897  0.0  0.0 118608  1388 ?        Ss   14:55   0:00 /usr/sbin/keepalived -D
root       5898  0.0  0.1 127468  3276 ?        S    14:55   0:00 /usr/sbin/keepalived -D
root       5899  0.0  0.1 127408  2648 ?        S    14:55   0:00 /usr/sbin/keepalived -D
root       5932  0.0  0.0 112676   984 pts/0    R+   14:55   0:00 grep --color=auto keepalived

区分主从nginx

keepalived为何要使用LVS keepalived和lvs_keepalived为何要使用LVS

keepalived为何要使用LVS keepalived和lvs_keepalived为何要使用LVS_02

测试关闭master上的keepalived服务

[root@xiaoqi ~]# systemctl stop keepalived.service

自动跳转,设置成功。

keepalived为何要使用LVS keepalived和lvs_负载均衡_03

 

4.负载均衡集群介绍

主流开源软件LVS、keepalived、haproxy、nginx等;其中LVS属于4层,也可以当做7层使用。

keepalived的负载均衡功能其实就是lvs;lvs这4层的负载均衡是可以分发除80外的端口通信的,比如MySQL的,而nginx仅仅支持http、https、mail、haproxy也支持MySQL这种。

相比较来说,LVS这种4层的更加稳定,能承受更多的请求,而nginx这种7层更加灵活,能实现更多的个性化的需求。

 

5.LVS介绍

LVS是由国人章文嵩开发;流行度不亚于apache的httpd。基于TCP/IP做的路由和转发,稳定性和效率很高。

LVS最新版基于Linux内核2.6 ,有好多年不更新;LVS有三种常见的模式:NAT、DR、IP Tunnel

LVS架构中有一个核心角色叫做分发器(Load Balancer),它用来分发用户的请求,还有诸多处理用户请求的服务(Real Server ,简称rs)

keepalived为何要使用LVS keepalived和lvs_nginx_04

这种模式借助iptables的nat表来实现,用户的请求到分发器后,通过预设的iptables规则,把请求的数据包发到后端的rs上去。rs需要设定网关为分发器的内网ip;用户请求的数据包和返回给用户的数据包全部经过分发器,所以分发器为瓶颈。在nat模式中,只要峰发起有公网ip即可,所以比较节省公网ip资源。

keepalived为何要使用LVS keepalived和lvs_nginx_05

这种模式,需要一个公共的ip配置在分发器和所有rs上,我们把它叫做vip;客户端请求的目标IP为vip,分发器接受到请求数据包后,会对数据包做一个加工,会把目标IP改为rs的IP,这样数据包就到了rs上;rs接受数据包后,会还原原始数据包,这样目标IP为vip,因为所有rs上配置了这个vip,所以他会认为他是自己。

keepalived为何要使用LVS keepalived和lvs_keepalived为何要使用LVS_06

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

 

6.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

 

7.LVS NAT模式搭建

三台机器

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

内网:192.168.7.77,外网:192.168.92.144(vmware仅主机模式)

keepalived为何要使用LVS keepalived和lvs_IP_07

keepalived为何要使用LVS keepalived和lvs_IP_08

rs1

内网:7.7 ;网关是7.2

rs2

内网:7.99 ;‘ 网关是7.2’

关闭防火墙

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld

启动iptables,并清空规则

[root@localhost ~]# systemctl start iptables
[root@localhost ~]# systemctl enable iptables
清空规则
[root@localhost ~]# iptables -F

[root@localhost ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  确定  ]
[root@localhost ~]# iptables -nvL
Chain INPUT (policy ACCEPT 124 packets, 15948 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 89 packets, 6980 bytes)
 pkts bytes target     prot opt in     out     source               destination

关闭selinux

实验失败。。等后续

在设置ip上一直出问题。。等待解决

重新搭建3台虚拟机

分发器:内网246.99 ;外网198.128

rs1 ip:246.100 rs2 ip:246.78

可以ping通

keepalived为何要使用LVS keepalived和lvs_负载均衡_09

三台机器都执行systemctl stop firewalld ;systemctl stop iptables ;

修改另外两台机器的网关

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=581a003b-e9cf-4bdc-802f-59925fe702de
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.246.78
NETMASK=255.255.255.0
GATEWAY=192.168.246.99
DNS1=114.114.114.114

检测网关

[root@xiaoqi ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.246.99  0.0.0.0         UG    100    0        0 ens33
192.168.246.0   0.0.0.0         255.255.255.0   U     100    0        0 ens33

在dir上安装ipvsadm

[root@localhost yum.repos.d]# yum install -y ipvsadm

编辑脚本

#! /bin/bash
# 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.246.0/24  -j MASQUERADE
# director设置ipvsadm
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 192.168.198.128:80 -s wlc -p 3
$IPVSADM -a -t 192.168.198.128:80 -r 192.168.246.100:80 -m -w 1
$IPVSADM -a -t 192.168.198.128:80 -r 192.168.246.78:80 -m -w 1

执行脚本

[root@localhost ~]# sh /usr/local/sbin/lvs_nat.sh

编辑主页

[root@localhost ~]# vi /usr/share/nginx/html/index.html

开始测试

keepalived为何要使用LVS keepalived和lvs_IP_10

 

[root@localhost ~]# 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.198.128:80 lc
  -> 192.168.246.78:80            Masq    1      1          2         
  -> 192.168.246.100:80           Masq    1      0          2

浏览器访问不均衡。。yum安装的nginx不显示。。使用curl测试;结果正常。。平均访问。

[root@localhost ~]# curl 192.168.198.128
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@localhost ~]# curl 192.168.198.128
klon