DR类型
directer只响应请求报文,然后调度某一个RS,而响应报文由RS直接返回给请求者
RS和directer都需要配置VIP,(在同一网络中有可能冲突)
本地局域网通告(通告自己的IP),ARP广播通告,ARP广播请求的响应
RS配置VIP仅用于构建响应报文的源地址,不是用来真正通信的
为了实现请求报文直接发送给director,而不是RS,有三种方式
1、在路由器出口处做静态绑定,最不靠谱(因为director要做冗余的,需要重新绑定,二是不能阻断RS的ARP响应)
2、在RS上安装arptables,阻断RS的ARP通告和响应
3、利用给内核传递参数来阻断通告和响应

客户端的请求报文如何传递到director
客户端的请求报文-->路由器(解封装二层,然后封装新的二层给director)-->director
director怎么转发报文给RS
director发现是集群服务,重新封装二层mac,转发给RS

RS的网卡有物理接口和环回接口,RIP配置在物理接口,VIP配置在lo接口的别名上

视频中的课件:
负载均衡集群设计时要注意的问题:
(1)是否需要会话保持;
(2)是否需要共享存储;
共享存储:NAS,SAN,DS(分布式存储)
数据同步:
课外作业:rsync+inorify实现数据同步

lvs-nat:
设计要点:
(1)RIP与DIP在同一IP网络,RIP的网关要指向DIP;
(2)支持端口映射;
(3)Director要打开核心转发功能;

实践作业(博客):负载均衡两个PHP应用(wordpress,discuzx);
测试:(1)是否需要会话保持;(2)是否需要共享存储;

lvs-dr:
dr模型中,各主机上均需要配置VIP,解决地址冲突的方式有三种:
(1)在前端网关做静态绑定;
(2)在各RS使用arptables;
(3)在各RS修改内核参数,来限制arp响应和通告的级别;---对于linux来讲,IP属于内核而不是网卡,linux有三个网卡及IP,那么开机就会向各个网络通告自己所有的三个网卡MAC和IP(就是向每一个接口通告自己所有的网络地址和mac);如果连接这台服务器网卡的其他主机不在同一个网段,服务器仍然会响应,虽然接收请求的网卡不在同一网段
限制响应级别:arp_ignore---定义自己的应答方式,默认为0,还有其他的级别0~8
0:默认值,表示可使用本地任意接口上配置的任意地址进行响应;
1:仅在请求的目标IP配置在本地主机的接收到请求报文接口上时,才给予响应;
限制通告级别:arp_announce(响应)---定义自己的通告方式,默认为0
0:默认值,把本机上的所有接口的所有信息向每个接口上的网络进行通告;
1:尽量避免向非直接连接网络进行通告;
2:必须避免向非本网络通告;
实践作业(博客):负载均衡两个PHP应用(wordpress,discuzx);
测试:(1)是否需要会话保持(2)是否需要共享存储

RS的预配置脚本:
    #!/bin/bash
    #
    vip=10.1.0.5
    mask=255.0.0.0

    case $1 in
    start)
        echo 1> /proc/sys/net/ipv4/conf/all/arp_ignore---一般配置all就可以
        echo 1> /proc/sys/net/ipv4/conf/lo/arp_ignore---为了保险起见,才配置这个
        echo 2> /proc/sys/net/ipv4/conf/all/arp_announce
        echo 2> /proc/sys/net/ipv4/conf/lo/arp_announce

        ifconfig lo:0 $vip netmask $mask broadcast $vip up
        route add-host $vip dev lo:0
        ;;
    stop)
        ifconfig lo:0 down

        echo 0> /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 0> /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 0> /proc/sys/net/ipv4/conf/all/arp_announce
        echo 0> /proc/sys/net/ipv4/conf/lo/arp_announce
        ;;
    *)
        echo "Usage:$(basename $0) start|stop"
        exit 1
        ;;
    esac

VS的配置脚本:
    #!/bin/bash
    #
    vip='10.1.0.5'
    iface='eno16777736:0'
    mask='255.255.255.255'
    port='80'
    rs1='10.1.0.7'
    rs2='10.1.0.8'
    scheduler=='wrr'
    type='-g'

    case $1 in
    start)
        ifconfig $iface $vip netmask $mask broadcast $vip up
        iptables -F

        ipvsadm -A-t ${vip}:${port} -s $scheduler
        ipvsadm -a -t ${port} -r ${rs1} $type -w 1
        ipvsadm -a -t ${port} -r ${rs2} $type -w 1
        ;;
    stop)
        ipvsadm -C
        ifconfig $iface down
        ;;
    *)
        echo "Usage $(basename $0) start|stop"
        exit 1
        ;;
    esac

    课外扩展作业:vip与dip/rip不在同一网段的实验环境设计及配置实现;
    博客作业:lvs的详细应用
        讲清楚类型、调度方法;并且给出nat和dr类型的设计拓扑及具体实现;

下边是演示如何创建DR模型,三台服务器都只需要一块网卡,并且都是桥接模型。
Director:172.16.0.6/16
ifconfig---查看网卡接口172.16.0.6/16
route -n---查看路由信息,IP,网关
nmtui---修改ip地址,出现命令行窗口
systemctl restart network---重启下网络服务
ntpdate 172.16.0.1---同步一下时间

curl http://172.16.0.7
curl http://172.16.0.7/test1.html---这里请求RIP是没有问题的,但是请求VIP不会应答

下边是把VIP配置到Directory上。
ifconfig---查看一下有几个网卡
ifconfig eno16777736:0 172.16.0.99 netmask 255.255.255.255 broadcast 172.16.0.99 up---在物理网卡上配置VIP,一样可以使用4个255,broadcast这里的广播地址和4个255是不一样的,只是为了统一风格,在这个网络中,受限广播这个地址

yum install -y ipvsadm
ipvsadm -A -t 172.16.0.99:80 -s rr---添加一条规则,并且使用轮调机制,去往这个地址这个端口是一个集群服务
ipvsadm -ln---查看ipvs
ipvsadm -a -t 172.16.0.99:80 -r 172.16.0.7 -g---g表示dr类型
ipvsadm -a -t 172.16.0.99:80 -r 172.16.0.8 -g
for i in {1..20};do curl http://172.16.0.99/test1.html;done---循环20次访问这个url,有可能有保持连接的缘故,所以有可能不是轮掉
也可以使用arp-a看哪个ip在哪个mac上
此时去ping,会有应答,并且是directory响应的,两个realserver不会应答

rs1:172.16.0.7/16
hostnamectl set-hostname rs1.ilinux.io---重新修改主机名
yum repolist---列出仓库
yum clean all---清空仓库缓存
scp /etc/yum.repos.d/epel.repo 172.16.0.8:/etc/yum.repos.d/
yum install -y httpd php php-mysql---安装动态内容站点程序包
vim /var/www/html/phpinfo.php

RS1


phpinfo();
?>
vim /var/www/html/test1.html

RS1,172.16.0.7


scp /var/www/html/* 172.16.0.8:/var/www/html

先配置内核参数(不让其通告并响应),再配置IP地址
ls /proc/sys/net/ipv4/conf/网卡名称/arp_ignore---网卡名称有4个all,default,网卡,lo---一般配置all就可以了,为了保险网卡或lo需要再配置一下

为了配置方便,写一个配置脚本
vim setparameter.sh
#!/bin/bash
#
vip=‘172.16.0.99’
mask=255.255.255.255---为了限制广播域,因为广播地址就是自己,表明自己在一个网络
iface=‘lo:0’

    case $1 in
    start)
        echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore---一般配置all就可以
        echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore---为了保险起见,才配置这个
        echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

        ifconfig $iface $vip netmask $mask broadcast $vip up
        route add -host $vip dev $iface
        ;;

    stop)
        ifconfig $iface down---停止的时候路由会自动删除

        echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
        ;;
    *)
        echo "Usage:$(basename $0) start|stop"
        exit 1
        ;;
    esac

bash -n setparameter.sh---测试语法有没有问题
bash -x setparameter.sh start---直接执行,加start是查看过程
cat /proc/sys/net/ipv4/conf/all/arp_announce---查看一下是不是改成2了
cat /proc/sys/net/ipv4/conf/all/arp_ignore---查看一下是不是改成1了
scp setparameter.sh 172.16.0.8:/root/---复制一下

ifconfig lo:0 172.16.0.99 netmask 255.255.255.255 broadcast 172.16.0.99 up---配置环回接口的IP,掩码,广播地址,并且启用up
使用ifconfig命令可以查看,并且从外部主机ping一下,不会应答
route add -host 172.16.0.99 dev lo:0---添加一条路由,如果目标地址是172,那么到达VIP的时候,要经由lo这个接口进来,并且经由这个接口出去---这里很重要,为了让信息到达网卡并转发给lo接口
systemctl start httpd---启动web服务
ss -tnl---查看80端口是否已经启动起来

rs2:172.16.0.8/16
nmtui---修改ip地址,出现命令行窗口172.16.0.8/16
systemctl restart network---重启下网络服务
ntpdate 172.16.0.1---同步一下时间
ifconifg---查看下修改后的ip对不对
hostnamectl set-hostname rs2.ilinux.io---重新修改主机名
hostname---查看下主机名
cd /var/www/html/
vim phpinfo.php---rs1创建的并复制过来的。

RS2


phpinfo();
?>
vim test1.html

RS2,172.16.0.8


上边rs1复制过来了修改内核参数的脚本,直接执行
bash -x setparameter.sh start---直接执行,加start是查看过程
ifconfig lo:0 172.16.0.99 netmask 255.255.255.255 broadcast 172.16.0.99 up---配置环回接口的IP,掩码,广播地址,并且启用up
使用ifconfig命令可以查看,并且从外部主机ping一下,不会应答
route add -host 172.16.0.99 dev lo:0---添加一条路由,如果目标地址是172,那么经由lo这个接口进来,并且经由这个接口出去
systemctl start httpd---启动web服务
ss -tnl---查看80端口是否已经启动起来