一、规划
角色 | IP | 安装软件 | VIP |
master | 192.168.42.135 | keepalived+lvs | 192.168.42.136 |
backup | 192.168.42.129 | keepalived+lvs |
|
web1 | 192.168.42.130 | nginx-web1 |
|
web2 | 192.168.42.133 | nginx-web2 |
|
二、部署
1、部署后端webserver
在web1、web2上部署nginx,并且因为环境冲突,Nginx监听端口都用8080,创建不同的index.html,以便后续验证。
[root@node2 ~]# yum install nginx -y
[root@node2 ~]# echo "web-server1" > /usr/share/nginx/html/index.html
[root@node1 ~]# yum install nginx -y
[root@node1 ~]# echo "web-server2" > /usr/share/nginx/html/index.html
配置realserver lo网卡和arp抑制
[root@node1 ~]# vim realserver
VIP=192.168.42.136case "$1" in
start)
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
/sbin/route add -host $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 "RealServer Start OK"
;;
stop)
ifconfig lo:0 down
route del $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 "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
[root@node1 ~]# chmod +x realserver
[root@node1 ~]# ./realserver start
2、部署keepalived
在master和backup上部署keepalived,安装ipvs管理工具
[root@master ~]# yum install -y keepalived
[root@master ~]# lsmod |grep ip_vs #查看ip_vs是否加载
[root@master ~]# modprobe ip_vs #加载ip_vs模块
[root@master ~]# cat /proc/net/ip_vs #查看ip_vs信息
[root@master ~]# yum -y install ipvsadm
修改keepalived配置文件
[root@master ~]# vim /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
smtp_connect_timeout 30
router_id LVS_MASTER
vrrp_skip_check_adv_addr
#vrrp_strict #记得注释,不然VIP绑定了网卡,也无法被ping通
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER #指定实例初始状态,实际的MASTER和BACKUP是选举决定的。backup此处应配置为BACKUP
interface ens33 #指定实例绑定的网卡
virtual_router_id 91 #设置VRID标记,多个集群不能重复(0..255)
priority 100 #设置优先级,优先级高的会被竞选为Master,backup此处应配置小于100
advert_int 1 #检查的时间间隔,默认1s
nopreempt #禁止抢占服务。默认情况,当MASTER服务挂掉之后,BACKUP自动升级为MASTER并接替它的任务,当MASTER服务恢复后,升级为MASTER的BACKUP服务又自动降为BACKUP,把工作权交给原MASTER。当配置了 #nopreempt,MASTER从挂掉到恢复,不再将服务抢占过来。
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.42.136
}
}
virtual_server 192.168.42.136 8080 {
delay_loop 6 #健康检查时间间隔
lb_algo rr #lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh等
lb_kind DR #lvs工作模式
persistence_timeout 0 #会话保持时间,设置为0方便后面测试
protocol TCP
real_server 192.168.42.130 8080 {
weight 1
HTTP_GET { //检测方法除HTTP_GET外还支持TCP_CHECK,脚本,SSL_GET等。
url {
path /index.html
status_code 200
}
connect_timeout 3 #连接超时时间
nb_get_retry 3 #重试次数
delay_before_retry 3 #重连间隔时间
}
}
real_server 192.168.42.133 8080 {
weight 1
HTTP_GET {
url {
path /index.html
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
#主从启动keepalived
[root@node3 ~]# systemctl restart keepalived
查看master的ens33网卡上是否有VIP
查看lvs后端情况:
[root@node3 ~]# ipvsadm -ln
[root@node3 ~]# ipvsadm -lnc
测试负载均衡轮询:
[root@master ~]# curl http://192.168.42.136:8080/
测试高可用,停用master上的keepalived,观察VIP是否漂移到backup上。
三、问题整理
问题1:keepalived.conf中vip配置好后,通过ip addr可以看到vip已经顺利挂载,但是无法ping通,并且防火墙都已关闭,原因是keepalived.conf配置中默认vrrp_strict打开了,需要把它注释掉。重启keepalived即可ping通。
问题2:使用curl测试负载均衡时,能够轮询调度到不同的后端主机,但是使用浏览器时却不行,总是访问到同一个后端。原因是,curl命令请求时,每次请求都从不同的端口发请求,所以每次lvs都当做一个新的客户端来处理,而且curl请求完后,就关闭了tcp连接;而浏览器则不然,每次刷新很可能还是以同一个端口发出请求,而且tcp连接也会保持,所以lvs就会认为是同一个客户端,每次刷新就会指向同一rs。
如果要想浏览器测试也能达到轮询效果,则需要将lvs的连接处于空闲状态的超时时间设置的很短。
[root@node3 ~]# ipvsadm --list --timeout (默认过期时间分别是900 120 300)
[root@node3 ~]# ipvsadm --set 1 1 1
四、补充
1、Linux修改内核参数
方法1:
echo value > /proc/sys/path 例: echo 0 > /proc/sys/net/ipv4/ip_nonlocal_bind
方法2:
sysctl -w kernel.name=value 修改值
sysctl -a 查看
方法3:
vim /etc/sysctl.conf #将内容写入sysctl.conf文件
sysctl -p #使文件内容的修改立即生效
2、内核模块的操作
查看内核模块:lsmod
移除模块: modprob -r 模块名 或者 rmmod 模块名
装载模块: modprob 模块名 或者 insmod 模块名
查看模块详细信息:modinfo 模块名
3、ipvsadm命令行选项
-A 添加一个虚拟服务,使用ip地址、端口号、协议来唯一定义一个虚拟服务
-E 编辑一个虚拟服务
-D 删除一个虚拟服务
-C 清空虚拟服务列表
-R 从标准输入中还原虚拟服务列表
-S 保存虚拟服务规则至标准输出,输出规则可使用-R选项还原
-L 显示虚拟服务列表
-Z 虚拟服务器列表计数器清零(清空当前连接数)
-a 添加一台真实服务器
-e 编辑一台真实服务器
-d 减少一台真实服务器
-t 使用TCP服务,该参数后需加主机与端口信息
-u 使用UDP服务,该参数后需加主机与端口信息
-s 指定lvs的调度算法
-r 设置真实服务器IP与端口
-g 设置lvs工作模式为DR直连路由
-i 设置lvs工作模式为TUN隧道
-m 设置lvs工作模式为NAT地址转换模式
-w 指定真实服务器权重
-c 连接状态,配和-L使用
-n 数字格式显示
--stats 显示统计信息
--rate 显示速率信息
--sort 对虚拟服务器和真实服务器排序输出
--set tcp tcpfin udp
设置ipvs连接超时值,三个参数分别代表tcp会话超时时间、收到FIN包后tcp会话超时时间、udp超时时间
--timeout
显示tcp tcpfin udp的timeout值
--start-daemon
启动同步守护进程
--stop-daemon
停止同步守护进程
4、lvs持久性连接介绍
(1)把同一个client的请求信息记录到lvs的hash表里,保存时间使用persistence_timeout控制,单位为秒。 persistence_granularity 参数是配合persistence_timeout的,在某些情况特别有用,他的值是子网掩码,表示持久连接的粒度,默认是 255.255.255.255,也就是单独的client ip,如果改成,255.255.255.0就是client ip一个网段的都会被分配到同一个real server。
设置方式:
persistence_timeout 可以通过"ipvsadm -p timeout" 来设置,默认360秒
# ipvsadm -A -t 192.168.20.154:80 -s rr -p 60
注意:上面命令中红色标记的80端口,表示同一客户端访问服务器的80端口,会被定义到同一个real server,如果把80端口改为0,那么同一客户端访问服务器的任何服务都会被转发到同一real server。
修改keepalived配置文件,在虚拟服务器配置下面加入persistence_timeout 60
(2)一个连接创建后空闲时的超时时间,这个时间为3种
① tcp的空闲超时时间
② lvs收到客户端tcp fin的超时时间
③ udp的超时时间
设置方式:
# tcp tcpfin udp 可以通过"ipvsadm --set 对应超时时间"来设置
ipvsadm --set tcp tcpfin udp
建议:tcpfin的值最好小于persistence_timeout的值,这样比较方便计算,也有利于tcpfin回收