Keepalived+LVS高可用负载均衡实例

//LVS软件调度的优势:软件成本低、硬件技术支持不够迅速、软件的可控性比较强、软件都是基于配置文件。
//调度算法一共有十种(这里介绍8种):
//1、rr round-robin 轮循:均等地对待每台真实服务器。
//2、wrr weighted round-robin 加权轮循:根据真实服务器的不同处理能力来调度访问请求,并可以动态地调整权值。
//3、lc least-connection 最少连接:根据连接数来分配,连接数少的服务器会多分配。
//4、wlc weighted least-connection 加权最少连接:同时考量服务器的处理能力和连接数来进行分配。
//5、lblc 基于局部性的最少连接:主要用于cache集群。
//6、lblcwr 带复制的基于局部性的最少连接:主要用于cache集群。
//7、dh destionation hashing 目标地址散列
//8、sh source hashing 源地址散列
//关于加权和 quiesce
//例如:假设在真实服务器池中有三个服务器,服务器A和B为加权1和3,服务器C为加权2。如果服务器C由于某种原因宕机,服务器A和B就会平级分配被丢弃的负载。但服务器C重新上线后,LVS路由器会视其为没有连接的服务器,并且将所有进入请求都一股脑发送到这台服务器中,直到和服务器A和B持平。要防止此现象出现,管理员可将虚拟服务器设为quiesce服务器—无论何时当有新的服务器节点上线时,都将最小连接表重新设为0,且LVS路由器象所有真实服务器都是刚刚添加到群集中一样路由请求。
//三种负载均衡技术:
//NAT:通过网络地址转换,调度器重定请求报文的目标地址。将请求分发给下端的真实服务器,真实服务器响应,再通过调度器返回给客户端。这种架构,调度器容易成为整个架构的瓶颈,一般处理 10 台以下。
//TUNNEL:调度器直接把请求通过 IP 隧道转发给后端的真实服务器,而真实服务器返回时,直接返回给客户端,而不经过调度器。所以效率比 NAT 高,一般处理 50 台以内。
//DR DIRECTING Routing :类似tunnel技术这种方式没有隧道的开锁,对于后台真实服务器也没有必须支持IP隧道协议的要求;但是要求调度器必须有一块网卡和真实服务器在同一物理网段。一般处理 100 台以内。

//系统
# cat /etc/redhat-release 
CentOS release 6.8 (Final)
# uname -r
2.6.32-642.el6.x86_64
//SELinux关闭
//关闭SELinux,机器需要重启
# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
//验证
# grep SELINUX=disabled /etc/selinux/config
SELINUX=disabled
//关闭SELinux,不需要重启
# setenforce 0
setenforce: SELinux is disabled
//iptables关闭
# /etc/init.d/iptables stop
//服务器作用分配
//node1_lvs 172.16.30.84    keepalived1
//node2_lvs 172.16.30.83    keepalived2
//node3_web 172.16.30.82    nginx1
//node4_web 172.16.30.81    nginx2
//4个服务器均一致的操作,关闭selinux
# setenforce 0
# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
//安装Keepalived
//node1_lvs和node2_lvs的区别只在于配置文件不相同,安装keepalived、解决依赖等步骤均一致。
//ps:本示例中wget文件均在/root目录内
# yum -y install kernel-devel* make* gcc* openssl* libnl* popt* wget
# wget http://www.keepalived.org/software/keepalived-1.2.16.tar.gz 
# wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz 
# wget http://mirror.centos.org/centos/6/os/x86_64/Packages/popt-static-1.13-7.el6.x86_64.rpm
# rpm -ivh popt-static-1.13-7.el6.x86_64.rpm
# ln -s /usr/src/kernels/2.6.32-696.23.1.el6.x86_64/ /usr/src/linux
# tar zxvf ipvsadm-1.26.tar.gz -C /usr/src/ && cd /usr/src/ipvsadm-1.26/
# make && make install
//ipvsadm安装完毕以下ipvsadm命令可检查
# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
# cd && tar zxvf keepalived-1.2.16.tar.gz -C /usr/src/ &&cd /usr/src/keepalived-1.2.16/
# ./configure --with-kernel-dir=/usr/src/kernels/2.6.32-696.23.1.el6.x86_64/ && make && make install
# cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
# cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
# mkdir /etc/keepalived
# cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
# cp /usr/local/sbin/keepalived /usr/sbin/
//keepalived安装完毕,keepalived -versiion可以检查
# keepalived -versiion
Keepalived v1.2.16 (04/27,2018)
//以下cat /etc/keepalived/keepalived.conf为配置文件内容node1_lvs和node2_lvs略有差异,会在文件中注明
# cat /etc/keepalived/keepalived.conf
! 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  //邮件服务器IP
   smtp_connect_timeout 30  //邮件服务器链接超时时间
   router_id LVS_MASTER //主配置LVS_MASTER,备配置LVS_BACKUP
}

vrrp_instance VI_1 {
    state MASTER  //主配置MASTER,备配置BACKUP
    interface eth0  //服务器试用的网卡
    virtual_router_id 51  //主从需要一致
    priority 100  //优先级,备服务器的值要低于主服务器
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.16.30.155  //VIP,配置的虚拟IP
    }
}

virtual_server 172.16.30.155 80 { //配置VIP要指向的端口
    delay_loop 6
    lb_algo rr  //使用的算法
    lb_kind DR  //使用的负载均衡技术
    nat_mask 255.255.255.0
    persistence_timeout 50  //链接超时时间
    protocol TCP  //使用的通信方式

    real_server 172.16.30.82 80 { //真实服务器IP和端口
      weight 1  //该服务器所占权值
      HTTP_GET {  //使用HTTP方式验证真实服务器有效性
            connect_timeout 10  //链接超时时间
            nb_get_retry 3  //每次链接次数
            delay_before_retry 3  //每次重试前相隔时间
            connect_port 80 //链接的端口
        }
    }

    real_server 172.16.30.81 80 { //真实服务器IP和端口
        weight 1  //该服务器所占权值
        HTTP_GET {  //使用HTTP方式验证真实服务器有效性
            connect_timeout 10  //链接超时时间
            nb_get_retry 3  //每次链接次数
            delay_before_retry 3  //每次重试前相隔时间
            connect_port 80 //链接的端口
        }
    }
}
//启动Keepalived服务
# /etc/init.d/keepalived start
//node1_lvs和node2_lvs分别使用ip a命令验证,查看VIP绑定情况
//node1_lvs
# ip a
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:0f:a3:b2 brd ff:ff:ff:ff:ff:ff
    inet 172.16.30.84/24 brd 172.16.30.255 scope global eth0
    inet 172.16.30.155/32 scope global eth0
    inet6 fe80::20c:29ff:fe0f:a3b2/64 scope link tentative dadfailed 
       valid_lft forever preferred_lft forever
//node2_lvs
# ip a
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:36:e4:9e brd ff:ff:ff:ff:ff:ff
    inet 172.16.30.83/24 brd 172.16.30.255 scope global eth0
    inet6 fe80::20c:29ff:fe36:e49e/64 scope link tentative dadfailed 
       valid_lft forever preferred_lft forever
//验证服务正常,停止node1_lvs的Keepalived服务,node2_lvs接过VIP,访问web服务,正常。node1_lvs的Keepalived服务上线,node2_lvs的VIP自动转移回node1_lvs服务器
//后端web服务器配置
//node3_web和node4_web的区别只在于页面文件index.html略有不同(为了方便区别不同的webserver),安装Nginx、解决依赖等步骤均一致。
//ps:本示例中wget文件均在/root目录内
# yum -y install openssl* wget gcc gcc-c++ cmake pcre* curl*
# wget http://nginx.org/download/nginx-1.11.3.tar.gz
# tar zxvf nginx-1.11.3.tar.gz && cd nginx-1.11.3
# ./configure --prefix=/usr/local/nginx && make && make install
//检查Nginx语法
# /usr/local/nginx/sbin/nginx -t
//启动Nginx
# /usr/local/nginx/sbin/nginx
//Nginx安装完毕,可在浏览器输入该web的IP地址进行尝试访问
//本示例不进行Nginx配置以及修改默认访问页面index.html的说明,要详细进行配置请自行百度
//在本示例中使用LVS-DR模式,在该模式中,后端真实服务器(RealServer)无需安装相关软件,只需要对VIP进行绑定和路由设置等一系列操作,这里整理为一个脚本:lvs_realserver.sh,详细解释如下:
# cat lvs_realserver.sh 
#!/bin/bash

#description:Config realserver
//VIP需要与Keepalived配置的VIP一致
LVS_VIP=172.16.30.155
/etc/rc.d/init.d/functions
case "$1" in
start)
  /sbin/ifconfig lo:0 $LVS_VIP netmask 255.255.255.255 broadcast $LVS_VIP
  /sbin/route add-host $LVS_VIP dev 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
  sysctl -p >/dev/null 2>&1
  echo "LVS-RealServer Start OK"
  ;;
stop)
  /sbin/ifconfig lo:0 down
  /sbin/route del $LVS_VIP >/dev/null 2>&1
  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 "LVS-RealServer Stoped"
  ;;
  *)
  echo "Usage: $0 {start|stop}"
  exit 1
esac
exit 0
//functions需要手动添加执行权限
# chmod +x /etc/rc.d/init.d/functions
//运行脚本
# sh lvs_realserver.sh start
//node3_web和node4_web验证,lo均绑定VIP
# ip a
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
    inet 172.16.30.155/32 brd 172.16.30.155 scope global lo:0
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
//到此,示例结束
//浏览器输入VIP访问web服务。正常
//验证:停止一个Keepalived,浏览器输入VIP访问web服务。正常
# ip a
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:36:e4:9e brd ff:ff:ff:ff:ff:ff
    inet 172.16.30.84/24 brd 172.16.30.255 scope global eth0
    inet 172.16.30.155/32 scope global eth0
    inet6 fe80::20c:29ff:fe36:e49e/64 scope link tentative dadfailed 
       valid_lft forever preferred_lft forever
//Keepalived服务器ipvsadm验证
# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.30.155:http rr persistent 50
  -> 172.16.30.81:http            Route   1      0          0         
  -> 172.16.30.82:http            Route   1      0          0

猜你喜欢

转载自blog.csdn.net/qq_35590198/article/details/80163952
今日推荐