Centos7 搭建LVS DR模式 + Keepalive + NFS
一、环境准备
共7台虚拟机(Vmware) client:200.200.200.2 gateway:200.200.200.1 && 192.168.75.140 director1:192.168.75.131 director2:192.168.75.132 realserver1:192.168.75.138 realserver2:192.168.75.139 storage:192.168.75.143 VIP:192.168.75.100 VM网络连接模式: client:200.200.200.2和gateway:200.200.200.1使用自定义VMnet10 其他网卡使用Nat模式
除网关需要iptables外,其他主机全部关闭清空防火墙规则,停止firewalld,关闭selinx
iptables -F
systemctl stop firewalld.service
setenfore 0 (ip有点乱)
二、原理
外网客户端发送报文经过网关,网关为双网卡联通内外网。网关通过iptables的DNAT方式将目标地址为200.200.200.1端口为80的报文,映射为VIP地址,端口为80,转发至director(1或2)。
director开启保存VIP的子网卡,通过ipvsadm从内核监听VIP的80端口(netstat -antp |grep 80是看不到开启了80端口的),匹配后通过某种轮询方式分发至realserver。
同时director1,2开启keepalive,共用一个VIP地址,通过心跳检测,防止负载的一方宕机,如遇险情快速切换至另一个director。
realserver开启保存VIP的回环口的子网卡(realserver的VIP在回环口子网卡上,子网掩码32位,只能本地访问,避免与director的VIP冲突),将目标地址为VIP的报文交付给web容器。
web容器通过本地挂载的NFS网络存储找到所需要的页面。之后报文返回过程中,原地址(client的地址)作为目标地址通过网关将报文返回给client。
三、配置
1.网关配置
1.1 默认ens33网卡设置
默认网卡设置,只修改ONBOOT=yes,启动网卡 vim /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=dhcp DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 UUID=58d67b1d-7381-414b-9d7d-2a2aba240437 DEVICE=ens33 ONBOOT=yes
1.2 在vm添加一个网卡,重启系统,根据新识别的网卡设备名,添加一个网卡文件
在vm网卡选项高级中找到mac地址,添加HWADDR,之后重启网卡 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no #BOOTPROTO=dhcp DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens37 DEVICE=ens37 ONBOOT=yes IPADDR=200.200.200.1 NETMASK=255.255.255.0 HWADDR=00:0C:29:CD:E3:9B
1.4 开启路由转发
写入内核文件,并刷新启用文件参数 echo 'net.ipv4.ip_forward = 1' > /etc/sysctl.conf sysctf -p
1.5 iptables设置
centos7默认没有管理内核中的iptables的工具,需要安装
在nat表中的PREROUTING 链上,将目标地址为200.200.200.1,端口为80的报文,的目标地址和端口转换为192.168.75.100:80
yum install iptables-services
iptables -F iptables -t nat -I PREROUTING -d 200.200.200.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.75.100:80
iptables -t nat -nvL
2. 主备调度器设置
2.1 网卡设置
开启默认网卡,获取地址,开启子网卡
ifconfig ens33:0 192.168.75.100 mask 255.255.255.0 up
2.2 安装,配置ipvsadm
centos7默认内核中有iptables,
但没有安装ipvsadm管理工具 yum install -y ipvsadm 配置 /sbin/ipvsadm -A -t $VIP:80 -s rr /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g /sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g -A 表示添加一个LVS服务器 -t 指定VIP地址和监听端口 -s 指定轮询方式 -r 指定后端realserver的ip和端口 -g 指定为DR模式,-m为nat模式
ipvsadm -Ln
查看配置好的规则
ipvsadm -Lnc
查看链接纪录
在DS上 curl vip访问不会返回,不要这样测试。
具体原因在,有知道的请告诉我,不胜感谢。
2.3 脚本化ipvsadm安装配置
编辑lvsdr脚本,内容为配置启动子网卡,配置ipvsadm,之后加入开机启动 vim /etc/init.d/lvsdr #!/bin/sh VIP=192.168.75.100 RIP1=192.168.75.138 RIP2=192.168.75.139 . /etc/rc.d/init.d/functions case "$1" in start) echo " start LVS of DirectorServer" # set the Virtual IP Address ifconfig ens33:0 $VIP/24 #/sbin/route add -host $VIP dev eth3:0 #Clear IPVS table /sbin/ipvsadm -C #set LVS /sbin/ipvsadm -A -t $VIP:80 -s rr # (如果需要session保持添加-p 默认保持300秒) /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g /sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g #/sbin/ipvsadm -a -t $VIP:80 -r $RIP3:80 –g #Run LVS /sbin/ipvsadm #end ;; stop) echo "close LVS Directorserver" /sbin/ipvsadm -C ;; *) echo "Usage: $0 {start|stop}" exit 1 esac vim /etc/rc.local >> /etc/init.d/lvsdr
2.3 安装配置keepalive
! Configuration File for keepalived global_defs { router_id LVS_MASTER # 指定router_id 主备不能一致 } vrrp_instance VI_1 { state MASTER # 主指定为MASTER,备指定为BACKUP interface ens33 virtual_router_id 51 # LVS id 主备一致 priority 100 # 优先级,备需要比主低 advert_int 1 # 心跳检测间隔 authentication { auth_type PASS # 验证方式,PASS和AH auth_pass 1111 # 验证码,主备需一致 } virtual_ipaddress { 192.168.75.100 # VIP,可多个 } } virtual_server 192.168.75.100 80 { # 某一VIP的设置 delay_loop 6 # 健康检查间隔 lb_algo rr # 轮询方式 lb_kind DR # LVS 模式 persistence_timeout 50 # 会话保持时间,不间断的访问一直会用这个realserver protocol TCP # 转发协议,TCP,UDP real_server 192.168.75.138 80 { weight 1 # realserver的权重 TCP_CHECK { connect_timeout 3 # 连接超时时间 nb_get_retry 3 # 重连次数 delay_before_retry 3 # 重连间隔时间 } } real_server 192.168.75.139 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
3. realserver配置
3.1 修改内核
arp_announce = 2 只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
arp_ignore =1 尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 2 > /proc/sys/net/ipv4/conf/ens33/arp_announce echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/ens33/arp_ignore
3.2 网络配置
默认网卡配置需要,静态ip加网关 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no #BOOTPROTO=dhcp BOOTPROTO=static DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 UUID=894d5d55-7569-4217-b3f7-1a2cd2cdd10c DEVICE=ens33 ONBOOT=yes IPADDR=192.168.75.139 PREFIX=24 GATEWAY=192.168.75.140 开启回环口子网卡 ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP VIP路由指向lo:0 route add -host $VIP dev lo:0
3.3 脚本化realserver配置
#!/bin/sh VIP=192.168.75.100 . /etc/rc.d/init.d/functions case "$1" in start) echo " start LVS of RealServer" echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 2 > /proc/sys/net/ipv4/conf/ens33/arp_announce echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/ens33/arp_ignore service network restart ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP route add -host $VIP dev lo:0 #end ;; stop) echo "close LVS Realserver" service network restart ;; *) echo "Usage: $0 {start|stop}" exit 1 esac
3.4 httpd安装使用
yum install -y httpd
直接使用默认访问目录
3.5 网络存储设置
该操作应该在搭建网NFS服务器之后操作
安装NFS及相关组件,rpcbind管理nfs使用随机端口通信 yum -y install nfs-utils ,rpcbind systemctl start rpcbind.service systemctl start nfs.service systemctl enable rpcbind.service systemctl enable nfs.service 查看是否可连接,NFS服务器 showmount -e 192.168.75.143 挂载NFS目录 mount -t nfs 192.168.75.143:/data/www /var/www/html
4 搭建NFS服务器
安装NFS及相关服务,rcpbind管理nfs使用随机端口传输,设置网路目录全向,创建存储目录,创建目录用户,并将目录属主设置为该用户,添加网络文件
yum -y install nfs-utils ,rpcbind
systemctl start rpcbind.service
systemctl start nfs.service
systemctl enable rpcbind.service
systemctl enable nfs.service
vim /etc/exports
/data 192.168.75.0/24(rw,sync)
mkdir -p /data/www
cd /data
chown apache:apache www
vim /data/www/index.html
五、测试
使用client:200.200.200.2 curl -s 200.200.200.2 如果没有搭建keepalive,没有搭建NFS存储服务器,单独测试LVS RS使用httpd,在默认访问目录/var/www/html/中, 写入文件,内容不一致。访问两次的结果也不一致。 即为成功 如果搭建了keepalive,没有搭建NFS存储服务器。测试LVS和keepalive httpd配置同上,访问结果应该只有一种,因keepalive默认开启了, 50秒内不间断访问,一直会分发到一台RS上 如果LVS,keepalive,NFS都搭建 测试访问结果应该为NFS服务器中NFS目录中的内容。