lvs手册网址:http://zh.linuxvirtualserver.org/node/28(DR工作模式)
本次实验适合DR模式,因为所有虚拟机都在一个网段里
实验环境:
server1 调度器
server2 后台web服务器
server3 后台web服务器
步骤:
安装ipvsadm软件包:
列出软件
安装,此工具是用户端专门写lvs策略用的
[root@server1 ~]# yum install ipvsadm -y
server2 和server3安装apache做测试
[root@server2 ~]# yum install httpd 安装
[root@server2 ~]# systemctl start httpd 启动服务
[root@server2 ~]# cd /var/www/html/
[root@server2 html]# ls
[root@server2 html]# echo server2 > index.html 创建首页
[root@server2 html]# curl localhost 检测一下
server2
[root@server3 ~]# yum install httpd -y 安装
[root@server3 ~]# systemctl start httpd 启动服务
[root@server3 ~]# cd /var/www/html/
[root@server3 html]# ls
[root@server3 html]# echo server3 > index.html 创建首页
[root@server3 html]# curl localhost
server3
可以用dns做负载均衡,但是缺点很多
创建一个虚拟ip,用户可以通过访问虚拟ip,然后通过虚拟服务器把外部请求调度到各个web服务器
[root@server1 ~]# ipvsadm -A -t 172.25.50.100:80 -s rr
-A 表示添加 -t 表示tcp协议 -s调度 ,rr表示轮较,最均衡的
[root@server1 ~]#ipvsadm -a -t 172.25.50.100:80 -r 172.25.50.2:80 -g 往虚拟服务器上添加web服务器ip -g表示直连
[root@server1 ~]# ipvsadm -a -t 172.25.50.100:80 -r 172.25.50.3:80 -g
[root@server1 ~]# ipvsadm -ln 列出
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.50.100:80 rr 虚拟服务可以创建多个可以调度不同主机
-> 172.25.50.2:80 Route 1 0 0
-> 172.25.50.3:80 Route 1 0 0
[root@server1 ~]# ip addr add 172.25.50.100/24 dev eth0 在调度器上手工添加虚拟ip
添加ip成功 ,172.25.50.100就是我们的虚拟vip
此时去调度时发现卡住了
但是请求已经到达server端,为何是卡住不动了??
因为客户端上的ip是不会变得,客户端由172.25.50.100通过调度器转成172.25.50.2 客户端ip还是100
但是现在server端没有100,所以也需要在server端添加100-
[root@server2 html]# ip addr add 172.25.50.100/32 dev eth0
[root@server3 html]# ip addr add 172.25.50.100/32 dev eth0
再次调度就成功了
三台虚拟机在一个网段同一ip,ip会有冲突,谁先响应就找谁,如下:
server3先响应,找server3,这样就达不到负载均衡的效果,该如何解决???
方法:
[root@server2 ~]# yum install arptables_jf -y 安装arotables防火墙
[root@server3 ~]# yum install arptables_jf -y 安装arotables防火墙
ot@server2 ~]# arptables -A INPUT -d 172.25.50.100 -j DROP 表示将目标地址丢弃掉, -A附加的意识 drop表示丢弃
[root@server2 ~]# arptables -A OUTPUT -s 172.25.50.100 -j mangle --mangle-ip-s 172.25.50.2 出去也不能从100出去,要转换成自己的合法ip地址[root@server2 ~]# arptables-save > /etc/sysconfig/arptables 保存策略,不然重启会失效
[root@server2 ~]# cat /etc/sysconfig/arptables
*filter
:INPUT ACCEPT
:OUTPUT ACCEPT
:FORWARD ACCEPT
-A INPUT -j DROP -d 172.25.50.100
-A OUTPUT -j mangle -s 172.25.50.100 --mangle-ip-s 172.25.0.2
[root@server2 ~]# arptables -F -F 表示刷掉策略
[root@server2 ~]# arptables -L
Chain INPUT (policy ACCEPT)
Chain OUTPUT (policy ACCEPT)
Chain FORWARD (policy ACCEPT)
[root@server2 ~]# systemctl restart arptables.service 重启服务
[root@server2 ~]# arptables -nL
Chain INPUT (policy ACCEPT)
-j DROP -d 172.25.50.100
Chain OUTPUT (policy ACCEPT)
-j mangle -s 172.25.50.100 --mangle-ip-s 172.25.0.2 策略又回来了
Chain FORWARD (policy ACCEPT)
[root@server2 ~]# scp /etc/sysconfig/arptables server3:/etc/sysconfig/ 将策略文件拷贝到server3上
[root@server3 sysconfig]# vim /etc/sysconfig/arptables 将ip地址转换成server3的ip合法地址
[root@server2 ~]# systemctl restart arptables.service 重启服务
[root@server3 sysconfig]# systemctl restart arptables.service 重启服务
原理图解
客户端发送数据包到调度器 原ip地址 访问 目标地址vip,ip地址是不会变的,经过DR调度器后,他会将原mac地址转换成Rs上的mac地址,通过二层链路把数据包转发到RS,然后在2层往上解包,就可以看到vip了,然后RS上也设定了vip,因此认为这个数据包就是访问客户端的,然后rs通过原地址响应客户端,后续再回来也需要经过调度器
iptables 和 ipvs谁的优先级高??
iptables先把包放行进来,然后策略匹配才能转换到ipvs上工作
[root@server2 ~]# systemctl stop httpd.service server2出问题,停掉了
可以看出调度器依然正常工作,但是他不关心后端是否正常运行,因此lvs对后端没有健康检查,如何让lvs进行后端健康检查??
可以安装keepalived 软件,实现健康检查,他用的是vrr协议
vrrp 协议工作机制:一台MASTER会发出心跳包,多台backup主机负责接收心跳包,当backup收不到心跳包的时后,就认为MASTER出现了问题,接着backup之间会进行选举,谁的优先级高,谁就会成为master,当之前MASTER又恢复了,再次会把master状态接管回来
[root@server1 ~]# yum install -y keepalived 下载keepalived软件,用keepalived实现高可用
[root@server1 ~]# cd /etc/keepalived/
[root@server1 keepalived]# ls
keepalived.conf 主配置文件
[root@server1 keepalived]# vim keepalived.conf 编辑配置文件
global_defs {
notification_email { 通知邮件
root@localhost 通知本地
}
notification_email_from keepalived@localhost 邮件从那发过来
smtp_server 127.0.0.1 邮件服务器,没有服务器,可用本机邮件profix
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
#vrrp_strict 禁掉此参数,不然会给iptables加上一个drop all的策略,会导致所有策略失效
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 { 高可用阶段
state MASTER
interface eth0 心跳包发送接口。可以eth0,或者eth1
virtual_router_id 51 虚拟路由id ,确认那些主机是一组的
priority 100 优先级 ,vrp里通过优先级来确认谁是master,数字越高优先级越高
advert_int 1 心跳的频率 ,表示每隔1秒发一次
authentication {
auth_type PASS 心跳认证
auth_pass 1111
}
virtual_ipaddress { vip地址
172.25.50.100
}
}
virtual_server 172.25.50.100 80{ 虚拟服务
delay_loop 3 表示3秒对后端进行一次健康检查
lb_algo rr rr表示调度算法
lb_kind DR 工作模式,我们是DR工作模式
# persistence_timeout 50 持续调度到一个后端的时间,50秒后连接另一个后端,80端口不需要注释掉
protocol TCP
real_server 172.25.50.2 80 { 后端 可以定义多组后端服务
weight 1 权重为1
TCP_CHECK { tcp检查
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.25.50.3 80 { 后端
weight 1 权重为1
TCP_CHECK { tcp检查
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
后面的全部删除
[root@server1 keepalived]# ip addr del 172.25.50.100/32 dev eth0 删除vip,因为在keepalived已经设定好了
[root@server1 keepalived]# ipvsadm -C -C表示刷掉全部策略
[root@server1 keepalived]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@server1 keepalived]# systemctl start keepalived.service 启动keepalived
启动keepalived之后策略已经全部自动加上了
[root@server3 ~]# systemctl stop httpd.service 如果现在停掉server3
当serve3挂掉后,server3就会从调度列表里自动取掉不会在去调度,从而实现对后台的健康检查,
还会有一份邮件
[root@server1 keepalived]# yun install mailx -y 安装邮件包
[root@server1 keepalived]# mail 查看邮件
做高可用:
实验环境再加一台虚拟机vm4
[root@server4 ~]# yum install -y ipvsadm keepalived 在server4上安装keepalived高可用套件
[root@server1 ~]# cd /etc/keepalived/ 进入server1的keepalived配置文件
[root@server1 keepalived]# ls
keepalived.conf
[root@server1 keepalived]# scp keepalived.conf server4:/etc/keepalived/ 将keepalived配置文件拷贝到server4上
[root@server4 ~]# cd /etc/keepalived/
[root@server4 keepalived]# ls
keepalived.conf
[root@server4 keepalived]# vim keepalived.conf 编辑配置文件
[root@server1 keepalived]# systemctl restart keepalived.service 重启服务
[root@server4 keepalived]# systemctl restart keepalived.service 重启服务
[root@server4 keepalived]# cat /var/log/messages 可以产看日志,是否启动有报错
[root@server1 keepalived]# systemctl stop keepalived.service 将server1上keepalived停掉
[root@server4 keepalived]# cat /var/log/messages 查看日志
[root@server1 keepalived]# systemctl start keepalived.service sever1重新启动,
[root@server1 keepalived]# cat /var/log/messages 查看日志发现,server1又回重新接管,变成master
其他模式介绍:
NAT模式:NAT模式到达后端后,是原路返回到客户端的,而不是之间到达客户端
隧道模式:到达后端后直接返回客户端,不需要原路返回
内核模块:ip_vs
[root@server1 keepalived]# lsmod
自动添加上lvs内核模块,实现了负载均衡
keepalived 架构图:
watchDog 可以监控两个子进程,一旦那个进程挂了,可以重新启动,确保正常运行
虚拟服务可以添加多个,如下操作??
[root@server2 ~]# yum install -y vsftpd server2 安装vsftpd
[root@server2 ~]# systemctl start vsftpd 启动
[root@server3 ~]# systemctl start vsftpd server3 安装vsftpd
[root@server3 ~]# systemctl start vsftpd 启动
[root@server1 keepalived]# ipvsadm -A -t 172.25.50.100:21 -s rr
[root@server1 keepalived]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.50.100:21 rr
TCP 172.25.50.100:80 rr
-> 172.25.50.2:80 Route 1 0 0
-> 172.25.50.3:80 Route 1 0 0
[root@server1 keepalived]# ipvsadm -a -t 172.25.50.100:21 -r 172.25.50.2 -g
[root@server1 keepalived]# ipvsadm -a -t 172.25.50.100:21 -r 172.25.50.3 -g
[root@server1 keepalived]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.50.100:21 rr
-> 172.25.50.2:21 Route 1 0 0
-> 172.25.50.3:21 Route 1 0 0
TCP 172.25.50.100:80 rr
-> 172.25.50.2:80 Route 1 0 0
-> 172.25.50.3:80 Route 1 0 0
[root@server1 keepalived]# vim keepalived.conf 编辑配置文件,添加虚拟服务
vsftpd服务端口为21
[root@server1 keepalived]# systemctl reload keepalived.service
[root@server1 keepalived]# systemctl restart keepalived.service 重启服务
[root@server1 keepalived]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.50.100:21 rr persistent 50 参数生效
-> 172.25.50.2:21 Route 1 0 0
-> 172.25.50.3:21 Route 1 0 0
TCP 172.25.50.100:80 rr
-> 172.25.50.2:80 Route 1 0 0
-> 172.25.50.3:80 Route 1 0 0
[root@server3 ~]# cd /var/ftp/pub/
[root@server3 pub]# touch server3 在server3 pub目录建立一个server3
[root@foundation50 ~]# lftp 172.25.50.100 客户端访问,始终调度在server3上,在50s内
lftp 172.25.50.100:~> ls
drwxr-xr-x 2 0 0 6 Jun 21 2018 pub
lftp 172.25.50.100:/> ls
drwxr-xr-x 2 0 0 6 Jun 21 2018 pub
lftp 172.25.50.100:/> cd pub/
lftp 172.25.50.100:/pub> ls
-rw-r--r-- 1 0 0 0 Dec 04 14:56 server3
FULLNAT模式:企业最常用模式