Linux之高可用集群实战(二)
一、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 BACKUPno_premmpt ## 不抢占interface ens33treck_interface{ens33}virtual_route_id 50 ## 虚拟路由id标识priority 100 ## 优先级preempt_delay ## 抢占延迟authenication{auth_type PASSauth_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||BACKUPinterface ens33lvs_sync_daemon_inteface ens33virtual_router_id 151 ## 虚拟路由IDpriority 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||BACKUPinterface ens33lvs_sync_daemon_inteface ens33virtual_router_id 152 ## 虚拟路由IDpriority 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||BACKUPinterface ens33lvs_sync_daemon_inteface ens33virtual_router_id 151 ## 虚拟路由IDpriority 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||BACKUPinterface ens33lvs_sync_daemon_inteface ens33virtual_router_id 152 ## 虚拟路由IDpriority 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:0echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "1" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/all/arp_announcesysctl -p >/dev/null 2>&1echo "RealServer Start OK"exit 0
;;
stop)ifconfig lo:0 downroute del $VIP >/dev/null 2>&1echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "0" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/all/arp_announceecho "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 3delay_before_retry 3connect_port 80}}real_server 192.168.33.13 80 {weight 100TCP_CHECK {connect_timeout 10nb_get_retry 3delay_before_retry 3connect_port 80}}
基于HTTP状态码校验
real_server 192.168.1.4 80 { weight 100HTTP_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地址进行解密,如果在同一个网段,将直接返回给用户,不在同一个网段则通过路由器网关返回给用户