//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: 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: 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: 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: 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: 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: 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