当前位置: 首页 > news >正文

高可用并发集群lvs的几种模式及应用

一.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服务,格式为<VIP>+<:监听端口>, -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
写入
<h1>hello world</h1>

<h1>hello china</h1>

并且添加上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地址
这里写图片描述
这里写图片描述

(2)开启apache,并编写测试页面
这里写图片描述
这里写图片描述

测试:
这里写图片描述
这时ipvsadm上的连接数会发生变化
这里写图片描述

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 反复刷新网页,每次出现的网页不同则表示成功。 

转载于:https://www.cnblogs.com/ChairmanYSL/p/9718357.html

相关文章:

  • springboot实体类的级联说明
  • 你安装的是SUN/Oracle JDK还是OpenJDK?
  • CTC loss 理解
  • Virtual Box 新建一个虚拟机安装系统(补充:WIN7 64 bit 系统虚拟机无法安装 64 bit 系统问题)...
  • 如何正确的把 Java 数组 Array 转为列表 List
  • ASP.NET Core Identity 配置 - ASP.NET Core 基础教程 - 简单教程,简单编程
  • (转)Sublime Text3配置Lua运行环境
  • 十三种基于直方图的图像全局二值化算法原理、实现、代码及效果(转)
  • SQL 查看SQL语句的执行时间 直接有效的方法
  • 使用js实现简单的注册验证
  • C3算法 和 super
  • There are stopped jobs
  • RabbitMQ 运转流程
  • 通俗易懂系列 | 设计模式(三):适配器模式
  • 信用评分卡 (part 4 of 7)
  • Google 是如何开发 Web 框架的
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • Android交互
  • Angular4 模板式表单用法以及验证
  • Git 使用集
  • Golang-长连接-状态推送
  • happypack两次报错的问题
  • js算法-归并排序(merge_sort)
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • vagrant 添加本地 box 安装 laravel homestead
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 分享一份非常强势的Android面试题
  • 诡异!React stopPropagation失灵
  • 猴子数据域名防封接口降低小说被封的风险
  • 力扣(LeetCode)21
  • 前端路由实现-history
  • 前端知识点整理(待续)
  • 如何在 Tornado 中实现 Middleware
  • 我与Jetbrains的这些年
  • 携程小程序初体验
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 字符串匹配基础上
  • ​Java并发新构件之Exchanger
  • ​香农与信息论三大定律
  • #162 (Div. 2)
  • (16)Reactor的测试——响应式Spring的道法术器
  • (6)添加vue-cookie
  • (libusb) usb口自动刷新
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转) Face-Resources
  • (转) RFS+AutoItLibrary测试web对话框
  • .Net 8.0 新的变化
  • .net core 6 redis操作类
  • .net FrameWork简介,数组,枚举
  • .NET Framework杂记
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .net6Api后台+uniapp导出Excel