一、keepalive问题之脑裂现象
导致这种现象主要原因是由于两台服务器是否存在网络隔离(防火墙、网卡等问题),为了解决keepalive启动无法正常完成高可用集群的搭建,我们通常引入zabbix通过shell脚本监控两台服务主机的keepalive中VIP使用情况,最终通过其状态情况来进一步判断其高可用性。
二、keepalive配置文件详解
## 监控 软件服务进程
vrrp_sripts 脚本实例 {
scripts "脚本路径"
interval (指定时间间隔/s)
}
## vrrp实例定义块
vrrp_sync_group VG_1{ ## 监控网段
group{
V1_1
}
}
## 当切换到master执行脚本
notify_master /data/sh/nginx.sh
## 当切换到backup执行脚本
notify_backup /data/sh/nginx.sh
## vrrp实例创建
vrrp_instance JFEDU_1 {
state BACKUP
no_premmpt ## 不抢占
interface ens33
treck_interface{
ens33
}
virtual_route_id 50 ## 虚拟路由id标识
priority 100 ## 优先级
preempt_delay ## 抢占延迟
authenication{
auth_type PASS
auth_pass 111
}
}
三、配置多实例keepalive节点
确保两台机器配置两次keepalive配置,确保其keepalive可以主从备份(实现DNS负载均衡工作)
.5机器配置情况
! Configuration File for keepalived
global_defs {
notification_email {
support@666
}
## 结合zabbix监控keepalive报警信息
notification_email_from wgkgood@163.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx { ## vrrp脚本模块
script "/data/sh/check_nginx.sh"
interval 2 ## 计时
weight 2 ## 权重
}
# VIP1
vrrp_instance VI_1 { ## 开启vip模块
state MASTER ## 状态Master||BACKUP
interface ens33
lvs_sync_daemon_inteface ens33
virtual_router_id 151 ## 虚拟路由ID
priority 100 ## 优先级
advert_int 5 ## 每隔5s发生组播请求
nopreempt ## 防止抢占keepalive(只在backup机器上生效,针对优先级无效)
authentication {
auth_type PASS ## 发送密码认证进行通信
auth_pass 1111
}
virtual_ipaddress {
10.0.0.188 ## VIP地址信息
}
track_script {
chk_nginx ## 调用脚本模块
}
}
vrrp_instance VI_2 { ## 开启vip模块
state BACKUP ## 状态Master||BACKUP
interface ens33
lvs_sync_daemon_inteface ens33
virtual_router_id 152 ## 虚拟路由ID
priority 90 ## 优先级
advert_int 5 ## 每隔5s发生组播请求
nopreempt ## 防止抢占keepalive(只在backup机器上生效,针对优先级无效)
authentication {
auth_type PASS ## 发送密码认证进行通信
auth_pass 2222
}
virtual_ipaddress {
10.0.0.189 ## VIP地址信息
}
track_script {
chk_nginx ## 调用脚本模块
}
}
.6机器配置情况
[root@localhost ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
support@666
}
## 结合zabbix监控keepalive报警信息
notification_email_from wgkgood@163.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx { ## vrrp脚本模块
script "/data/sh/check_nginx.sh"
interval 2 ## 计时
weight 2 ## 权重
}
# VIP1
vrrp_instance VI_1 { ## 开启vip模块
state BACKUP ## 状态Master||BACKUP
interface ens33
lvs_sync_daemon_inteface ens33
virtual_router_id 151 ## 虚拟路由ID
priority 90 ## 优先级
advert_int 5 ## 每隔5s发生组播请求
nopreempt ## 防止抢占keepalive(只在backup机器上生效,针对优先级无效)
authentication {
auth_type PASS ## 发送密码认证进行通信
auth_pass 1111
}
virtual_ipaddress {
10.0.0.188 ## VIP地址信息
}
track_script {
chk_nginx ## 调用脚本模块
}
}
vrrp_instance VI_2 { ## 开启vip模块
state MASTER ## 状态Master||BACKUP
interface ens33
lvs_sync_daemon_inteface ens33
virtual_router_id 152 ## 虚拟路由ID
priority 100 ## 优先级
advert_int 5 ## 每隔5s发生组播请求
nopreempt ## 防止抢占keepalive(只在backup机器上生效,针对优先级无效)
authentication {
auth_type PASS ## 发送密码认证进行通信
auth_pass 2222
}
virtual_ipaddress {
10.0.0.189 ## VIP地址信息
}
track_script {
chk_nginx ## 调用脚本模块
}
}
四、LVS负载均衡策略
LVS(虚拟服务器)作为主流的网络可伸缩结构,通常它们都需要一个前端调度器,实现虚拟网络负载均衡,在IP负载均衡技术中可以分为三类(NET模式、TUN隧道模式、DR模式),主要包含均衡算法包括RR(轮询)、LC(最少连接数)、WRR、WLC
NET模式原理
用户通过IP地址访问目标IP的VIP地址,而实际最终是VIP内部目标机房的设备情况,然后lvs会将报文转发至后端IP地址,同时将目标端口也转换成后端选定的端口,最后后端处理完请求后会将报文请求转发到LVS ,最终LVS会将请求转发给用户
配置实操:
- 准备两块网卡(设置一块内网卡为仅主机模式)
- 配置仅主机模式的IP地址
TYPE=Ethernet BOOTPROTO=static NAME=ens36 DEVICE=ens36 IPADDR=172.17.0.2 NETMASK=255.255.255.0 GATEWAY=172.17.0.1 DNS1=114.114.114.114
安装lvs软件
yum -y install ipvsadm
## 查看lvs版本及均衡列表
[root@10.0.0.5 /etc/sysconfig/network-scripts]#ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
## 添加均衡列表信息(-m使用nat模式)
ipvsadm -A -t 10.0.0.5:80 -s wrr
ipvsadm -a -t 10.0.0.5:80 -r 172.17.0.2 -m -w 100
ipvsadm -a -t 10.0.0.5:80 -r 172.17.0.3 -m -w 100
## 再次查看均衡列表(Masq为加权轮询)
root@10.0.0.5 /etc/sysconfig/network-scripts]#ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.5:80 wrr
-> 172.17.0.2:80 Masq 100 0 0
-> 172.17.0.3:80 Masq 100 0 0
TCP 10.0.0.6:80 wrr
-> 172.17.0.2:80 Masq 100 0 0
## 将lvs当做路由器使用进行ip转发
[root@10.0.0.5 /etc/sysconfig/network-scripts]#cat /proc/sys/net/ipv4/ip_forward
0
[root@10.0.0.5 /etc/sysconfig/network-scripts]#echo 1 > /proc/sys/net/ipv4/ip_forward
[root@10.0.0.5 /etc/sysconfig/network-scripts]#cat /proc/sys/net/ipv4/ip_forward
1
配置net模式有哪些注意事项
1)LVS服务器至少2块网卡,一块作为公网,另外内网(网关);
2)后端RS机器的网关必须设置为LVS内网网卡的IP地址;
3)后端RS服务器上80端口服务启动了,防火墙关闭;
4)LVS服务器必须开启路由转发功能内核ip_forward参数设置为1;
echo 1 > /proc/sys/net/ipv4/ip_forward
5)LVS NAT模式后端最好不要超过30台RS(realserver)服务器;
DR模式原理
用户访问Lvs机器地址,请求到达lvs机器之后会将请求报文的目标MAC地址发送给后端机器(在同一个物理网段情况下),如果用户和RS不在同一个网段,则通过网关返回用户(VIP同时配置在RS上,同时也在LVS机器上,防止VIP机器冲突)
ipvsadm管理ip_vs内核模块查看
[root@10.0.0.7 ~]#modprobe ip_vs
[root@10.0.0.7 ~]#lsmod | grep -aiE ip_vs
ip_vs 192512 0
nf_conntrack 180224 1 ip_vs
nf_defrag_ipv6 24576 2 nf_conntrack,ip_vs
libcrc32c 16384 2 nf_conntrack,ip_vs
配置DR模式有哪些注意事项
1)LVS服务器1块网卡,DR和RS在同一个物理网段;
2)LVS服务器上配置VIP地址101.188,配置在物理网卡上,负责响应ARP广播;
3)后端RS机器的配置VIP地址101.188,配置在lo网卡上,避免冲突;
4)后端RS服务器要抑制VIP 101.188的ARP广播响应;
5)后端RS服务器上80端口服务启动了,防火墙关闭;
6)只有LVS的VIP能够响应用户的请求,抑制RS的VIP ARP响应。
7)后端RS服务器处理完成之后,直接返给用户,无需发送给LVS机器。
我这里准备配置一个vip机器
VIP=10.0.0.188
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
## 使用arp命令查看mac地址与其他机器进行比对,查看是否阻止了arp传播
arp -a
## 设置抑制arp广播(只抑制非真实网卡请求,不抑制非真实网卡请求)
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
## 使用arp命令清除刷新广播
arp -d 地址
arp -d *
## 在lvs机器上放置一个vip地址
VIP=10.0.0.188
ifconfig ens33:1 $VIP netmask 255.255.255.255 broadcast $VIP
## arp_announce忽略源ip所在的网卡,使用本机能跟外网通信的网卡将数据发出去
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
创建RS后端脚本(要求前端物理网卡配置vip)
#!/bin/sh
#LVS Client Server
VIP=10.0.0.188
case $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"
exit 0
;;
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 OK"
exit 1
;;
*)
echo "Usage: $0 {start|stop}"
;;
esac
压测请求(需要安装httpd-tools工具)
## 压测文件
ab -c 1000 -n 10000 http://10.0.0.188
## 每次访问最大文件数
ulimit -SHn 65535
压力测试多连接运行方式
配置LVS配置(一旦重启lvs都会影响到lvs配置其他文件的使用)
## 备份lvs配置
ipvsadm-save -n
## 备份配置到指定文件中
ipvsadm-save -n > lvs_config.txt
## 将lvs配置导入到lvs中
ipvsadm-restore < lvs_config.txt
LVS结合keepalive工具
若机器异常则自动移出均衡池,正常启动后机器数据会返回均衡池
virtual_server 192.168.101.188 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
persistence_timeout 60
protocol TCP
real_server 192.168.33.12 80 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.33.13 80 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
基于HTTP状态码校验
real_server 192.168.1.4 80 {
weight 100
HTTP_GET {
url {
path /monitor/warn.jsp
status_code 200
}
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
}
}
基于md5情况校验
TUN模式原理
用户请求到达Director之后,lvs通TUN管道加密技术将把报文的目标MAC地址换成后端MAC地址,然后后端基于报文MAC地址进行解密,如果在同一个网段,将直接返回给用户,不在同一个网段则通过路由器网关返回给用户