CentOS7.8 搭建LVS+keepalived
LVS 是 Linux virtual server 的简写
即Linux虚拟服务器,是一个虚拟的服务器集群系统,可以在unix/linux平台实现负载均衡集群功能。Windows只能装客户端, 在1998年5月由章文嵩博士组织成立,中国内最早自由软件之一
以下是LVS的官方中文资料
标题 地址 LVS项目介绍 http://www.linuxvirtualserver.org/zh/lvs1.html LVS集群的体系结构 http://www.linuxvirtualserver.org/zh/lvs2.html LVS集群中的IP负载均衡技术 http://www.linuxvirtualserver.org/zh/lvs3.html LVS集群的负载调度 http://www.linuxvirtualserver.org/zh/lvs4.html
ARP 缓存表是双刃剑
1、主机有了ARP缓存表,可以加快ARP解析速度,减少局域网的广播风暴。
2、正是有了ARP缓存表,给恶意黑客带来了攻击服务器的风险,这就是ARP欺骗攻击。
3、切换路由器,负载均衡等设备时,可能会导致短时网络中断。(案例,更换路由器的时候可能会出现,IP连接上了,就是上不了网,这个就是ARP缓存表出现的问题,需要重新缓存每台机器的ARP缓存表,平滑重启每台机器的网卡)
ARP广播而进行的新地址解析
linux 下的具体命令
/sbin/arping -I eth0 -c 3 -s 10.0.0.162 10.0.0.253
/sbin/arping -U -I eth0 10.0.0.162
NAME arping -send ARP REQUEST to a neighbour host
SYNOPSIS arping [ -c count] [ -w dead-line ] [ -s source ] -I interdace destination
LVS负载均衡调度技术是在Linux内核中实现的,因此被称之为Linux虚拟服务器
使用该软件配置LVS时,不能直接配置内核中的ipvs 而需要使用ipvs的管理工具ipvsadm进行管理,后面会使用Keepalived软件直接管理ipvs 并不通过ipvsadm来管理ipvs ipvs的管理工具 ipvsadm管理ipvs
名称 |
缩写 |
说明 |
虚拟IP地址(Virtual ip Address) VIP |
VIP |
VIP为Director用于向客户端计算机提供服务的IP地址(高可用keepalive) |
真实IP地址(Real Server IP Address) |
RIP |
在集群下面节点上使用的IP地址,物理IP地址。 |
Director的IP地址(Directir IP Address) |
DIP |
Director用于连接外网的IP,物理网卡的IP地址是负载均衡器上的IP。 |
客户端主机IP地址(Client IP Address) |
CIP |
客户端计算机请求集群服务器的IP地址,作用是发送给集群请求的源IP |
LVS集群内部的节点称为真实的服务器Real Server也叫RIP,也叫集群节点,请求集群服务的计算机称为客户端(CIP)
LVS的四中工作模式最常用的DR模式
DR(Director Route)路由模式
支持高并发,多达数万 客户端 <-----------<-----------<-----------------<-----------<----网关---<------------- | (Client) | | 客户端访问的是VIP的地址 绑定lo网卡VIP-32位,抑制ARP响应 | 外网 |---->------ Real Server ---------------------->| | |绑定lo网卡VIP-32位,抑制ARP响应 | | request DMacT |---->----- Real Server ----------------------->| |->--->--->----LVS(LB)------->-------- VLAN | 接收CIP,响应给网关 | Director (VIP) |---->----- Real Server------------------------>| 不更改源和目标地址,会更改目标MAC地址实现转发
DR模式的九大特点
1、通过在调度器上LB上修改数据包的目的的MAC地址实现转发,源IP仍然是客户端的IP,目的IP地址仍然是VIP 2、请求报文警告调度器,而RS响应出来后的报文无需警告调度器LB,因此并发访问量大使用效率很高(和NAT模式比) 3、DR模式是通过MAC地址的改写机制实现转发,因此所有RS节点和调度器LB只能在一个局域网中(小缺点)。 4、需要注意RS节点的VIP绑定(lo:vip/32,lo1:vip/32)和ARP抑制问题,抑制没有接网线的那个网卡响应ARP广播。 5、RS节点的默认网关不需要是调度器LB的DIP,而直接是IDC机房分配的上级路由器的IP(RS带有外网IP地址的情况),理讲,只要RS可以出外网即可,不是必须配置外网IP。 6、由于DR模式的调度器仅进行了目的MAC地址的改写,因此调度器LB无法改变请求报文目的端口(和NAT要区别)。 7、当前调度器LB支持几乎所有的UNIX/LINUX系统,但目前不支持Windows系统,真实服务器RS节点可以是Windows系统 8、总的来说DR模式效率很高,但是配置也比较麻烦,因此访问量不是特别大的公司可以用haproxy/nginx取代,符合运维原则:简单、易用、高效,日1000-2000万PV或请求1万以下都可以考虑aproxy/nginx(LVS NAT模式)。 9、直接对外的访问业务,例如:web服务器做RS节点,RS最好用公网IP地址,不直接对外的业务,如数据库、存储系统节点最后用内部IP地址。
机器IP规划及需要安装的软件
机器名称 |
IP地址 |
需要安装的软件 |
角色 |
K-l1 |
192.168.10.181 |
Ipvsadm,keepalived |
Keepalived的master |
K-l2 |
192.168.10.182 |
Ipvsadm,keepalived |
Keepalived的 slave |
RS1 |
192.168.10.183 |
nginx |
|
RS2 |
192.168.10.184 |
nginx |
|
VIP |
192.168.10.188 |
一:基础优化(所有机器)
1、时间同步 echo "#time sync by fage at 2017-7-22" >>/var/spool/cron/root && echo "*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1" >>/var/spool/cron/root && systemctl restart crond.service 2、关闭防火墙和selinux systemctl stop firewalld && systemctl disable firewalld && setenforce 0 && sed -i s#SELINUX=enforcing#SELINUX=disable#g /etc/selinux/config 3、更改主机名 hostname K-l1 echo "K-l1" >/etc/hostname hostname K-l2 echo "K-l2" >/etc/hostname hostname RS1 echo "RS1" >/etc/hostname hostname RS2 echo "RS2" >/etc/hostname 4、更改hosts文件 cat >/etc/hosts <二:安装软件
1、RS1,RS2 安装 nginx
yum install -y nginx2、K-L1,K-L2安装
yum install -y ipvsadm keepalived3、配置抑制lo回环响应,RS1,RS2上执行
cat lvs-rs.sh
#!/bin/bash vip=192.168.10.188 ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up 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#执行脚本bash lvs-rs.sh
查看ip a
#复制到另外一台
scp lvs-rs.sh root@192.168.10.184:~#执行脚本bash lvs-rs.sh
查看ip a
三:keepalived节点配置
主节点master配置
cat /etc/keepalived/keepalived.conf
global_defs{ router_id LVS_DEVEL } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.10.188 } } virtual_server 192.168.10.188 80 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 0 protocol TCP real_server 192.168.10.183 80 { weight 1 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.10.184 80 { weight 1 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }2、keepalived从节点配置文件
cat /etc/keepalived/keepalived.conf
global_defs{ router_id LVS_DEVEL } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.10.188 } } virtual_server 192.168.10.188 80 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 0 protocol TCP real_server 192.168.10.183 80 { weight 1 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.10.184 80 { weight 1 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }3、Keepalived 2个节点开启流量转发
echo 1 > /proc/sys/net/ipv4/ip_forward4、启动RS两个节点的nginx
systemctl start nginx5、启动keepalived,注意先启动主后启动从
systemctl start keepalived.service && systemctl enable keepalived.service6、测试漂移切换,在keepalived主节点停止keepalived查看
systemctl stop keepalived.service
[root@K-l1 ~]# systemctl start keepalived.service && systemctl enable keepalived.service [root@K-l1 ~]# ip a | grep global inet 192.168.10.182/24 brd 192.168.10.255 scope global noprefixroute eth0 inet 192.168.10.188/32 scope global eth0 [root@K-l1 ~]# systemctl stop keepalived.service [root@K-l1 ~]# ip a | grep global在keepalived从节点查看IP是否能看到VIP
[root@K-l2 ~]# ip a | grep global inet 192.168.10.182/24 brd 192.168.10.255 scope global noprefixroute eth0 inet 192.168.10.188/32 scope global eth0 [root@K-l2 ~]#四:记录keepalived日志
1、修改/etc/sysconfig/keepalived日志保存路径
sed -i s/KEEPALIVED_OPTIONS=\"-D"/KEEPALIVED_OPTIONS=\"-D -d -S 0"/gp /etc/sysconfig/keepalived2、添加rsyslog记录日志存放位置
echo "local0.* /var/log/keepalived.log" >>/etc/rsyslog.conf3、重启rsyslog日志服务和keepalived服务
systemctl restart rsyslog && systemctl restart keepalived.service4、检查日志文件是否存在和记录日志
ls /var/log/keepalive.log tail -3 /var/log/keepalive.log验证LVS是否部署否成功
在本地或者浏览器测试访问查看是否能查看流量状态
[root@K-l1 ~]# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.10.188:80 rr -> 192.168.10.183:80 Route 1 3 0 -> 192.168.10.184:80 Route 1 3 0 [root@K-l1 ~]# ipvsadm -ln --stats IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes -> RemoteAddress:Port TCP 192.168.10.188:80 2 18 0 2371 0 -> 192.168.10.183:80 1 6 0 254 0 -> 192.168.10.184:80 1 12 0 2117 0 [root@K-l1 ~]# ipvsadm -lnc IPVS connection entries pro expire state source virtual destination TCP 07:03 ESTABLISHED 192.168.10.1:63628 192.168.10.188:80 192.168.10.183:80 TCP 01:08 FIN_WAIT 192.168.10.1:63695 192.168.10.188:80 192.168.10.184:80 TCP 09:59 ESTABLISHED 192.168.10.1:63669 192.168.10.188:80 192.168.10.184:80 TCP 07:03 ESTABLISHED 192.168.10.1:63627 192.168.10.188:80 192.168.10.184:80 TCP 01:08 FIN_WAIT 192.168.10.1:63696 192.168.10.188:80 192.168.10.183:80 TCP 09:59 ESTABLISHED 192.168.10.1:63670 192.168.10.188:80 192.168.10.183:80 [root@K-l1 ~]#至此部署完成