环境搭建:

客户端:172.20.23.20
路由器:
172.20.23.30/16
192.168.23.30/24
10.0.0.1/16
LVS:
VIP --10.0.0.100/16
DIP --192.168.23.100/24

后端服务器:
RS1 --192.168.23.36
RS2 --192.168.23.37

网络环境搭建:
客户端路由设置:
[root@www19:36:15~]#route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.20.23.30    0.0.0.0         UG    100    0        0 eth0
172.20.0.0      0.0.0.0         255.255.0.0     U     100    0        0 eth0

LVS服务器路由设置:
[root@www19:38:19network-scripts]#route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.0.0.1        0.0.0.0         UG    0      0        0 eth0
10.0.0.0        0.0.0.0         255.255.0.0     U     100    0        0 eth0
192.168.23.0    0.0.0.0         255.255.255.0   U     101    0        0 eth1

后端服务器路由设置:
[root@apache119:29:53~]#route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.23.30   0.0.0.0         UG    100    0        0 eth0
192.168.23.0    0.0.0.0         255.255.255.0   U     100    0        0 eth0

后端服务器因为都需要绑定VIP,所以我们不得不进行防止arp广播处理!
处理方式:调整内核参数
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

也可以写入配置文件/etc/sysctl.conf
net.ipv4.conf.all.apr_ignore = 1
net.ipv4.conf.all.arp_announce = 2

处理完成之后我们开始绑定VIP,为了使用稳定我们要选择lo网卡作为绑定对象!
绑定方式:
ip a a 10.0.0.100/32 dev lo
ifconfig lo 10.0.0.100/32

想要永久有效需要自行编辑配置文件:
例如:利用网卡别名
[root@apache119:49:07network-scripts]#cat ifcfg-lo:1
DEVICE=lo:1
IPADDR=10.0.0.100
NETMASK=255.255.255.255
NETWORK=127.0.0.0
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback

LVS调度器规则设定:
[root@www19:39:48network-scripts]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.100:80 rr
  -> 192.168.23.36:80             Route   1      0          3         
  -> 192.168.23.37:80             Route   1      0          2 
 https使用时,必须使用同一私钥和证书:

快速生成测试证书:
/etc/pki/tls/certs目录下
Makefile文件中修改加密选项
#/usr/bin/openssl genrsa -aes128 $(KEYLEN) > $@
/usr/bin/openssl genrsa $(KEYLEN) > $@  

执行make httpd.crt --直接生成私钥和证书

生成的证书拷贝到/etc/httpd/conf.d/ssl/
然后配置ssl.conf文件

然后复制设个RS主机的所有配置文件到所有RS主机之上!

然后重新生成ipvsadm规则!

测试访问:
curl -k https://10.0.0.100
注意:
要使用相同的秘钥和证书

利用iptables规则实现标签会话:

有标签的就认为是同一服务
-f:firewall MARK 标记 一个

利用防火墙打标签:
iptables -t mangle -A PREROUTING -d VIP -p tcp -m multiport --dports 80,443 -j MARK --set-mark [n]
具体使用:
iptables -t mangle -A PREROUTING -d 10.0.0.100 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 5
防火墙生成策略:
[root@www22:01:50~]#iptables -t mangle -nvL
Chain PREROUTING (policy ACCEPT 54 packets, 3564 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MARK       tcp  --  *      *       0.0.0.0/0            10.0.0.100           multiport dports 80,443 MARK set 0x5

在lvs服务器中打标:
ipvsadm -A -f [n] 
实际应用:
ipvsadm -A -f 5 -s rr

ipvsadm -a -f 5 -r 192.168.23.33 -g
ipvsadm -a -f 5 -r 192.168.23.34 -g
持久连接实现方式
每端口持久(PPC):每个端口对应定义为一个集群服务,每集群服务单独调度
每防火墙标记持久(PFWMC):基于防火墙标记定义集群服务;可实现将多个端口上的应用统一调度,即所谓的port Affinity
每客户端持久(PCC):基于0端口(表示所有服务)定义集群服务,即将客户端对所有应用的请求都调度至后端主机,必须定义为持久模式

持久连接:默认360秒
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]

-p:后面设置时间

[root@www20:11:11network-scripts]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
FWM  5 rr persistent 360
  -> 192.168.23.36:0              Route   1      0          2         
  -> 192.168.23.37:0              Route   1      0          6

 客户端测试:
 [root@www20:10:57~]#for i in {1..1000};do curl -k https://10.0.0.100; sleep 1 ;done
hello world
hello world
hello world

自制后端服务器自制脚本:

[root@www22:28:25~]#cat lvs.sh 
#!/bin/bash

while true; do
    if curl 192.168.23.33 &> /dev/null; then
        true
        sleep 1
    else
        ipvsadm -d -f 5 -r 192.168.23.33
        exit 2
    fi
    if curl 192.168.23.34 &> /dev/null; then
        true
        sleep 1
    else
        ipvsadm -d -f 5 -r 192.168.23.34
        exit 3
    fi
done

LVS健康性检测工具:

ldirectord工具:

检测方式:  
(a) 网络层检测,icmp  
(b) 传输层检测,端口探测  
(c) 应用层检测,请求某关键资源  

RS全不用时:backup server, sorry server

包名:
ldirectord-3.9.6-0rc1.1.1.x86_64.rpm

文件: 
/etc/ha.d/ldirectord.cf 主配置文件 
/usr/share/doc/ldirectord-3.9.6/ldirectord.cf 配置模版 
/usr/lib/systemd/system/ldirectord.service  服务 
/usr/sbin/ldirectord 主程序 
/var/log/ldirectord.log 日志 
/var/run/ldirectord.ldirectord.pid   pid文件

主配置文件初始为空需要cp模板文件!

配置文件详解:
checktimeout=3  
--后端RS主机3秒之内没有反应就踢出
fallback=127.0.0.1:80
--所有后端主机全部宕机后启用
autoreload=yes
--自动加载-更改配置无须重启
logfile="/var/log/ldirectord.log"
--日志文件
quiescent=no
--后端主机宕机时的处理办法yes--调整权重为0--no为删除

配置ipvsadm规则:
virtual=10.0.0.100:80  --VIP
    real=192.168.23.33:80 gate 1 --RIP
    real=192.168.23.34:80 gate 2 --RIP
    service=http  --服务
    scheduler=wrr --算法
    #persistent=600 --持久连接
    #netmask=255.255.255.255
    protocol=tcp  --协议
    checktype=negotiate 
    checkport=80 --检查端口
    request="index.html" --检测方式-看页面
    receive="hello" --出现字样
    virtualhost=www.x.y.z --虚拟主机

启动服务:
systemctl start ldirectord

如何实现标签功能:
1 防火墙标记:
iptables -t mangle -A PREROUTING -d 10.0.0.100 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 10

2 配置文件更改:
virtual=10
    real=192.168.23.36 gate
    real=192.168.23.37 gate
#   real=192.168.6.6:80 gate
    fallback=127.0.0.1 gate
    service=http
    scheduler=rr
    #persistent=600
    #netmask=255.255.255.255
    #protocol=tcp
    checktype=negotiate
    checkport=80
    request="index.html"
    receive="hello"
    virtualhost=www.x.y.z