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端口是否已经启动起来