一.lvs的简介
lvs是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。该项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。它的官方站点是www.linuxvirtualserver.org。现在lvs已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用lvs时必须要重新编译内核以支持lvs功能模块,但是从Linux2.4内核以后,已经完全内置了lvs的各个功能模块,无需给内核打任何补丁,可以直接使用lvs提供的各种功能。
lvs自从1998年开始,发展到现在已经是一个比较成熟的技术项目了。可以利用lvs技术实现高可伸缩的、高可用的网络服务,例如WWW服务、Cache服务、DNS服务、FTP服务、MAIL服务、视频/音频点播服务等等,有许多比较著名网站和组织都在使用lvs架设的集群系统,例如:Linux的门户网站(www.linux.com)、向RealPlayer提供音频视频服务而闻名的Real公司(www.real.com)、全球最大的开源网站(sourceforge.net)等。
二.lvs的特点
优点:
1.高并发连接:LVS基于内核网络层面工作,有超强的承载能力和并发处理能力。单台LVS负载均衡器,可支持上万并发连接。稳定性强:是工作在网络4层之上仅作分发之用,这个特点也决定了它在负载均衡软件里的性能最强,稳定性最好,对内存和cpu资源消耗极低。
2.成本低廉:硬件负载均衡器少则十几万,多则几十万上百万,LVS只需一台服务器和就能免费部署使用,性价比极高。
3.配置简单:LVS配置非常简单,仅需几行命令即可完成配置,也可写成脚本进行管理。
4.支持多种算法:支持多种论调算法,可根据业务场景灵活调配进行使用
5.支持多种工作模型:可根据业务场景,使用不同的工作模式来解决生产环境请求处理问题。
6.应用范围广:因为LVS工作在4层,所以它几乎可以对所有应用做负载均衡,包括http、数据库、DNS、ftp服务等等
缺点:
工作在4层,不支持7层规则修改,机制过于庞大,不适合小规模应用。
三.lvs的几种模式及图解
1.DR(Direct Routing)模式
用直接路由技术实现虚拟服务器。当参与集群的计算机和作为控制管理的计算机在同一个VLAN时可以用此方法,这种模式的数据包转发是直接在数据链路层(二层)进行的
工作原理:
DR和REAL SERVER都使用同一个IP对外服务。但只有DR对ARP请求进行响应,所有REAL SERVER对本身这个IP的ARP请求保持静默。也就是说,网关会把对这个服务IP的请求全部定向给DR,而DR收到数据包后根据调度算法,找出对应的 REAL SERVER,把目的MAC地址改为REAL SERVER的MAC并发给这台REAL SERVER。这时REAL SERVER收到这个数据包,则等于直接从客户端收到这个数据包无异,处理后直接返回给客户端。由于DR要对二层包头进行改换,所以DR和REAL SERVER之间必须在一个广播域,也可以简单的理解为在同一台交换机上。
流程图解:
(1)当用户请求到达DirectorServer,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
(2) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
(3) IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址
(4) 由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。
(5)client的请求被Director转发并经过链路层寻址到达Realserver后,由于Realserver的lo接口配置了VIP(请求中的目标IP正是VIP),所以接收请求并处理。处理完成之后,将响应报文通过lo接口传送给eth0网卡(这个网卡一般指和调度器在一个网段的网卡)然后向外发出。此时的源IP地址为VIP,目标IP为CIP
(6) 响应报文最终送达至客户端
DR模式的特性:
1、保证前端路由将目标地址为VIP报文统统发给Director Server,而不是RS
2、RS可以使用私有地址;也可以是公网地址,如果使用公网地址,此时可以通过互联网对RIP进行直接访问
3、RS跟Director Server必须在同一个物理网络中
4、所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
5、不支持地址转换,也不支持端口映射
6、RS可以是大多数常见的操作系统
7、RS的网关绝不允许指向DIP
8、RS上的lo接口配置VIP的IP地址
2.NAT(Network Address Translation)模式
工作原理:
用地址翻译实现虚拟服务器。地址转换器有能被外界访问到的合法IP地址,它修改来自专有网络的流出包的地址。
外界看起来包是来自地址转换器本身,当外界包送到转换器时,它能判断出应该将包送到内部网的哪个节点。
优点是节省IP 地址,能对内部进行伪装;缺点是效率低,因为返回给请求方的流量经过转换器。
流程图解:
(1)当用户请求到达DirectorServer,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP 。
(2) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链。
(3) IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP ,在这个过程完成了目标IP的转换。
(4) POSTROUTING链通过选路,将数据包发送给Real Server。
(5) Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP 。
(6) Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP。
3.TUN模式
流程图解:
1.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
2.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS。
3.RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理次请求报文,并将响应报文通过lo接口送给eth0网卡(这个网卡一般指和调度器在一个网段的网卡)直接发送给客户端。注意:需要设置lo接口的VIP不能在共网上出现。
四.应用实现
1.DR模式
(1)安装软件
yum install -y ipvsadm
(2).写入策略
ipvsadm -A -t 172.25.27.100:80 -s rr # -A:添加一个virtual server,-t是表示指定虚拟服务为tcp服务,格式为+<:监听端口>, -s指定使用的调度算法 rr表示轮询
ipvsadm -a -t 172.25.27.100:80 -r 172.25.27.2:80 -g # -a是添加一个real server
ipvsadm -ln #查看策略
(3).保存策略
/etc/init.d/ipvsadm save
(4).在调度器上添加VIP
ip addr add 172.25.85.100/24 dev eth0
测试:
在另外两台real server上开启apache,编写发布页面
/etc/init.d/httpd start
vim /var/www/html/index.html
写入
hello world
和
hello china
并且添加上VIP
ip addr add 172.25.85.100/24 dev eth0
在物理主机上测试:
查看访问的100的mac地址
arp -e 172.85.27.100
通过对比mac 地址,可知访问的是server1
清除APR缓存
arp -d 172.25.85.100
再curl 172.25.85.100
发现此时访问的直接是real_server 主机,没有经过lvs调度器
因此,必须在real_server上增加策略,使其只能通过lvs调度器访问real_server ip
安装arp防火墙并写入策略:
yum install arptables -y
arptables -A IN -d 172.25.85.100 -j DROP #将所有访问172.25.85.100 的请求都丢弃掉
arptables -A OUT -s 172.25.85.100 -j mangle --mangle-ip-s 172.25.85.3 #所有源地址为172.25.85.100的数据包在发出去时全部地址转换为真实地址
/etc/init.d/arptables_jf save #保存规则
测试:
此时,再清除ARP缓存后,重新访问real_server ip ,发现现在是通过lvs调度器来获取的
当其中一台real_server 主机关掉后,测试
发现此时的lvs调度器没有健康检查,仍然在轮询访问,使有的访问被拒绝,在实际的网站访问时,会造成一定的损失,并使用户的体验变差。
(5).Ldirectord 实现lvs健康检查
ldirectord用来实现LVS负载均衡资源在主、备节点间的故障转移。在首次启动时,ldirectord可以自动创建IPVS表。此外,它还可以监控各RealServer的运行状态,一旦发现某RealServer运行异常时,还可以将其从IPVS表中移除。
ldirectord 进程通过向RealServer的RIP发送资源访问请求并通过由RealServer返回的响应信息来确定RealServer的运行状态。在 Director上,每一个VIP需要一个单独的ldirectord进程。如果RealServer不能正常响应Director上 ldirectord的请求,ldirectord进程将通过ipvsadm命令将此RealServer从IPVS表中移除。而一旦 RealServer再次上线,ldirectord会将其重新添加至IPVS表中
yum install -y ldirectord-3.9.5-3.1.x86_64.rpm
rpm -ql ldirectord
复制模板配置文件到主配置文件目录下
cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/
vim /etc/ha.d/ldirectord.cf
编辑内容:
virtual=172.25.85.100:80 # 此项用来定义LVS服务及其使用的VIP和PORT
real=172.25.85.2:80 gate # 定义RealServer,语法:real=RIP:port gate|masq|ipip [weight]
real=172.25.85.3:80 gate
fallback=127.0.0.1:80 gate # 定义RealServer,语法:real=RIP:port gate|masq|ipip [weight]
service=http # 定义基于什么服务来测试RealServer;
scheduler=rr # 调度算法为rr
#persistent=600 # 持久连接超时时间;
#netmask=255.255.255.255
protocol=tcp # 定义此虚拟服务用到的协议;
checktype=negotiate # ldirectord进程用于监控RealServer的方法;{negotiate|connect|A number|off}
checkport=80 # 指健康检查使用的端口;
request="index.html" # 检查RealServer用到的页面
receive="Test Page" # 检查RealServer用到的页面内容
virtualhost=www.x.y.z
把ipvsadm关掉
/etc/init.d/ipvsadm stop
开启ldirectord
/etc/init.d/ldirectord start
当server3上的apache 关掉后
ipvsadm -L
此时调度器已经检测到了,此时再访问不会再出现以前那种拒绝被连接的状况
当两台real_server 的apache主机都宕机后
提供当后端RS全部宕掉后,返回的fallback页面,为本机httpd服务
echo "此页面正在维护" > /var/www/html/index.html
/etc/init.d/httpd start
由于只有一个调度器,当调度器主机宕机后,所有服务都不能正常访问,为了实际中造成损失,我们必须准备台备用的调度器,来应对这种危机
(6).Keepalived 高可用集群管理
由于ldirectord 与Keepalived 冲突,必须将ldirectord停掉
tar zxf keepalived-1.3.6.tar.gz
cd keepalived-1.3.6
./configure --prefix=/usr/local/keepalived --with-init=SYSV
make
make install
cd /usr/local/keepalived/etc/rc.d/init.d/
ln -s /usr/local/keepalived/etc/keepalived/ /etc/ #做软连接
cd /etc/keepalived/
ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/
ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cd /usr/local/keepalived/etc/rc.d/init.d/
chmod +x keepalived #加可执行权限
cd /etc/keepalived
vim keepalived.conf
编辑内容:
global_defs {
notification_email {
root@localhost ##发送邮件者为本机root用户
}
notification_email_from keepalived@localhost ##从本机keepalived用户接收邮件
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
#vrrp_strict ##如果不注释掉会自动开启iptables并在所有表中加入动作DROP ALL
vrrp_garp_interval 0
vrrp_gna_interval 0
}
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 {
172.25.85.100
}
}
virtual_server 172.25.85.100 80 { ##虚拟主机
delay_loop 6
lb_algo rr
lb_kind DR ##是使用的DR模型
# persistence_timeout 50 ##先将此注释掉,可以更加直观的感受到两台rs使用的DR进行的轮转
protocol TCP
real_server 172.25.85.2 80 { ##real_server主机地址和端口两台rs均是使用的80端口
weight 1 ##权重是可以自己进行修改的,在实际使用中,权重使用的不一样是因为,权重较重一方的服务器性能更加好
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.25.85.3 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
/etc/init.d/keepalived start
ipvsadm -l
Keeplived 高可用
找台新的主机按照前面步骤布置keeplived ,可直接将server1的keeplived 配置文件复制过来,进行稍作修改
[root@server4 keepalived]# vim keepalived.conf #修改state 和 priority
vrrp_instance VI_1 {
state BACKUP #将状态由原来的master 改为备用
interface eth0
virtual_router_id 51
priority 50 #更改优先级,使其和server1上的优先级不同,避免若一台主机挂掉以后,若优先级是一致的,等原来的主机恢复后,会因为优先级是一致的而导致争抢,同时操作电脑上的同一台文件,而导致脑裂。
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
[root@server4 keepalived]# /etc/init.d/keepalived start
查看ip 可知此时ip 在server1上,即现在访问的是server1
[root@server1~]#echo c > /proc/sysrq-trigger #故意让系统崩溃,实现宕机的目的
测试并查看IP 和mac 地址,发现此时服务已经完全有server4接管,从而实现了lvs集群高可用。
2.NAT模式
在Director上
(1)开启路由机制
(2)写入ipvsadm规则 ,在此之前先关闭iptables
在RS上
(1)配置ip和网关,网关设为Director的IP地址
3.TUN模式
在Director上
(1)开启路由机制
vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
(2)写入ipvsadm策略
ipvsadm -C #清除以.前的 rules
ipvsadm-A -t 172.25.85.100:80 -s rr
-ipvsadma -t 172.25.85.100:80 -r 172.25.85.2:80 -i
-ipvsadma -t 172.25.85.100:80 -r 172.25.85.3:80 -i
(3)保存 rule
/etc.init.d/ipvsadm save
在RealServer上
(1)设置网关为Director的IP地址
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
sysctl -p
ifconfig tunl0 192.168.0.200 netmask 255.255.255.255 up
route add -host 192.168.0.200 dev tunl0
echo `hostname` > /var/www/html/index.html
service httpd start
测试
选择一台主机访问 http:// 192.168.0.100 反复刷新网页,每次出现的网页不同则表示成功。