LVS 负载均衡

最近在研究服务器负载均衡,阅读了网上的一些资料,发现主要的软件负载均衡方案有nginx(针对HTTP服务的负载均衡),LVS(针对IP层,MAC层的负载均衡)。LVS模式工作在网络层,且由内核实现负载转发,效率要比nginx高。 
    LVS负载均衡包含三种模式: 
1. NAT模式(类似路由器,实现外网内网地址映射,负载均衡服务器修改请求包的源以及目的MAC地址和IP地址,发送给实际服务器;负载均衡服务器,修改响应包的源以及目的MAC地址和IP地址,发送给客户端。请求和响应报文都需要经过负载均衡服务器) 
2. TUN模式(IP隧道,负载均衡服务器将外网传来的数据包封装在IP隧道中,传给实际服务器。实际服务器的响应直接发给客户端,而不需要经过负载均衡服务器。) 
3. DR模式(负载均衡服务器和后端的实际服务器拥有相同的虚拟IP地址,负载均衡服务器收到响应包后,修改目的MAC地址发给实际服务器,实际服务器将响应包直接发给客户端,不需要经过负载均衡服务器)

搭建 LVS DR模式负载均衡服务

连接示意图如下:

其中,负载均衡服务器的IP地址为 10.10.10.30/24 和 10.10.10.22/32(该IP地址是用户访问的IP地址), Real Server 1的IP地址为10.10.10.31/24, Real Server 2的IP地址为10.10.10.32/24,三者连接在同一个局域网中,且 RS1和 RS2的虚拟IP地址(可以在lo或者lo:0上设置该IP地址,即本地环回,这样该虚拟IP只对该机器本身可见,不会暴露在外部造成IP冲突)都设为负载均衡服务器的IP地址 dev-1. 
    这样外部访问10.10.10.22时,会访问到负载均衡服务器,而负载均衡服务器选择某个实际服务器,比如RS1,然后将包的目的MAC地址修改为RS1的MAC地址,在将包送到局域网上。此时对于请求数据包来说,目的MAC地址为RS1的MAC地址,因此RS1会收到,RS1发现包的目的MAC为自身,且目的IP地址为10.10.10.22,也是自身的一个IP,于是就认为数据包是发到自己的,就开始进行处理。

一、安装http服务 
1. 在RS1和RS2上分别安装httpd服务 
2. 修改/etc/httpd/conf/httpd.conf 文件,进行相应的配置。 
3. 启动httpd服务,并设置防火墙开放80端口

二、在负载均衡服务器上安装并配置ipvsadm 
1. yum -y install ipvsadm 
2. 设置实际ip和虚拟IP

    ifconfig eth0 10.10.10.30/24
ifconfig eth0:0 10.10.10.22 netmask 255.255.255.255 #虚拟IP,暴露给外部

3. 设置负载转发

方式一,通过ipvsadm

    systemctl start ipvsadm
ipvsadm -C
ipvsadm --set 30 5 60
#vip on load balancer
ipvsadm -A -t 10.10.10.22:80 -s wrr -p 20 #接受转发协议
ipvsadm -a -t 10.10.10.22:80 -r 10.10.10.31:80 -g -w 1 #增加转发目的地
ipvsadm -a -t 10.10.10.22:80 -r 10.10.10.32:80 -g -w 1 #增加转发目的地
ipvsadm -L -n
 
方式二,通过keepalived
vim /etc/keepalived/keepalived.conf 修改配置文件如下
global_defs {
notification_email {
skc361@163.com
}
notification_email_from sns-lvs@gmail.com
smtp_server 192.168.80.1
smtp_connection_timeout 30
router_id LVS_DEVEL # 设置lvs的id,在一个网络内应该是唯一的
}
vrrp_instance VI_1 {
state MASTER #指定Keepalived的角色,MASTER为主,BACKUP为备
interface eth0 #指定Keepalived的角色,MASTER为主,BACKUP为备
virtual_router_id 51 #虚拟路由编号,主备要一致
priority 100 #定义优先级,数字越大,优先级越高,主DR必须大于备用DR
advert_int 1 #检查间隔,默认为1s
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.10.10.22 #定义虚拟IP(VIP)为10.10.10.22,可多设,每行一个
}
}
# 定义对外提供服务的LVS的VIP以及port
virtual_server 10.10.10.22 80 {
delay_loop 6 # 设置健康检查时间,单位是秒
lb_algo wrr # 设置负载调度的算法为wlc
lb_kind DR # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式
nat_mask 255.255.255.0
persistence_timeout 0
protocol TCP
real_server 10.10.10.31 80 { # 指定real server1的IP地址
weight 3 # 配置节点权值,数字越大权重越高
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 10.10.10.32 80 { # 指定real server2的IP地址
weight 3 # 配置节点权值,数字越大权重越高
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
} 启动keepalived服务
systemctl start keepalived

三、设置实际服务器的网卡

ifconfig lo:0 10.10.10.22 netmask 255.255.255.255 #即设置虚拟IP地址,该IP地址绑定在环回网卡上,不会对外暴露

四、设置实际服务器的内核参数

    [root@dev-2 lvs]#vim /etc/sysctl.conf
[root@dev-2 lvs]# sysctl -p
net.ipv4.ip_forward = 1 #打开路由转发
net.ipv4.conf.all.arp_ignore = 1 #只回答目的IP为本网口IP地址的arp包的请求
net.ipv4.conf.all.arp_announce = 2 #对查询目标使用最适当的本机地址
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2

上面的 arp_ignore 和 arp_announce 参见 lvs arp设置

五、使用客户端进行访问 
    此时使用客户端访问 http://10.10.10.22, 请求会被转发到RS1或者RS2上。

问题排查

在搭建的时候,可能出现 http://10.10.10.22 无法访问,即HTTP请求没有被转发的情况。这种情况可以从以下情况中进行排查: 
1. 负载均衡服务器 防火墙是否关闭,或者是否允许80端口的tcp连接 
2. RS1 和 RS2 的http配置中是否设置 Listen 80(监听本机上的所有地址,如果只监听机器的网卡地址,而虚拟ip包就会被忽略) 
3. 如果在负载均衡服务器上没有设置VIP,只有一个IP地址 10.10.10.22/24,这样也可以配置出来。但是此时,当负载均衡服务器要向 10.10.10.31和10.10.10.32转发时,它需要知道它们的MAC地址,于是会发送ARP请求报文,当RS1或RS2收到ARP,它进行回复的时候发现请求报文的源IP为10.10.10.22 于是直接发到本机了,就不会回复给负载均衡服务器。于是负载均衡服务器就没法动态获知RS1和RS2的MAC地址。 
    此时,只能手动在负载均衡服务器上设置arp。 arp -s... 
而且这样做也会导致从负载均衡服务器上不能直接访问RS1/RS2,同样RS1/RS2也不能直接访问负载均衡服务器。所以,还是需要在负载均衡服务器上配置一个eth0和一个虚拟IP eth0:0.

LVS DR模式 负载均衡服务搭建的更多相关文章

  1. CentOS下LVS DR模式负载均衡配置详解

    一安装LVS准备: 1.准备4台Centos 6.2 x86_64 注:本实验关闭 SELinux和IPtables防火墙. 管理IP地址 角色 备注 192.168.1.101 LVS主调度器(Ma ...

  2. LVS+Keepalived-DR模式负载均衡高可用集群

    LVS+Keepalived DR模式负载均衡+高可用集群架构图 工作原理: Keepalived采用VRRP热备份协议实现Linux服务器的多机热备功能. VRRP,虚拟路由冗余协议,是针对路由器的 ...

  3. LVS的DR模式负载均衡

    参考项目:http://www.cnblogs.com/along21/p/7833261.html#auto_id_3 LVS的DR模式实现负载均衡 1.环境 lvs-server :192.168 ...

  4. lvs 中DR模式负载均衡及keepalived

    lvs DR配置 LVS负载均衡:三种负载均衡模式:DR,TUN(ip隧道),NAT,这里我们介绍DR模式 server1: 首先,配置server机yum源 方便后期实验流畅vim /etc/yum ...

  5. Docker笔记三:基于LVS DR模式构建WEB服务集群

    安装ipvsadm 1. 先在宿主机上安装并以root来启动ipvsadm,每次要在容器中运行ipvs都需要先在宿主机上启动ipvs.如果直接进行2步操作将报出如下错误: Can't initiali ...

  6. lvs负载均衡的搭建

       lvs负载均衡的搭建 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.         在部署环境前,我们需要了解一下一些协议 一.什么是arp 地址解析协议,即ARP(Addr ...

  7. Linux centosVMware Linux集群架构LVS DR模式搭建、keepalived + LVS

    一.LVS DR模式搭建 三台机器 分发器,也叫调度器(简写为dir) davery :1.101 rs1 davery01:1.106 rs2 davery02:11.107 vip 133.200 ...

  8. Linux中keepalived+LVS负载均衡的搭建测试

    1.1 LVS简介       LVS(Linux Virtual Server),也就是Linux虚拟服务器, 是一个自由软件项目.使用LVS技术要达到的目标是:通过LVS提供的负载均衡技术和Lin ...

  9. LVS DR模式搭建 keepalived lvs

    LVS DR模式搭建• 三台机器 • 分发器,也叫调度器(简写为dir)172.16.161.130 • rs1 172.16.161.131 • rs2 172.16.161.132 • vip 1 ...

随机推荐

  1. Cassandra 配制 cassandra.yaml

    一.设置用户名和密码 修改cassandra.yaml配置文件 把默认的 authenticator: AllowAllAuthenticator 改成 authenticator: Password ...

  2. WSF脚本详解:组合JS和VBS代码

    1.概述 Windows Script Host除了提供一个对象模型之外,还提供了一种脚本框架,这就是WSF脚本.通过WSF约定的标记元素,可以将多种脚本语言写的代码块组合起来,完成任务.除此之外,还 ...

  3. rqt工具的使用

    安装rqt工具sudo apt-get install ros-indigo-rqtsudo apt-get install ros-indigo-rqt-common-plugins或者rosdep ...

  4. 【转】移动前端不得不了解的html5 head 头标签

    来源:http://blog.csdn.net/huang100qi/article/details/42596799 本文主要内容来自一丝的常用的 HTML 头部标签和百度FEX的HTML head ...

  5. 获得本app的版本号

    话不多说,直接贴代码 PackageManager manager; PackageInfo info = null; manager = this.getPackageManager(); try ...

  6. Redmine性能测试

    Redmine部署使用有一个月了,反馈有时很慢. 1.查看log发现,事务更新后要发送Email,如果连接邮件服务器有问题,会等待超时,导致很慢. 2.解决发送邮件问题后,仍然有时慢,ActiveRe ...

  7. python3.4学习笔记(十七) 网络爬虫使用Beautifulsoup4抓取内容

    python3.4学习笔记(十七) 网络爬虫使用Beautifulsoup4抓取内容 Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖 ...

  8. 制作QQ空间的一些想法

    新的项目开始了,这一次是做一个网站类似于QQ空间那样的,基本功能比如说写日志,说说之类的都要有(说说是要有楼中楼嵌套的,应该能够上传图片),还要可以修改个人信息.登录注册之类的更不用说了,还要有一定的 ...

  9. IOS 创建渐变图层

    代码如下 typedef enum { GradientLayerKindLeftRight = , GradientLayerKindUpDown, GradientLayerKindLBRT,// ...

  10. java udp与tcp

    一:基础  NET基本对象java.net.InetAddress类的使用 IP地址是IP使用的32位(IPv4)或者128位(IPv6)位无符号数字,它是传输层协议TCP,UDP的基础.InetAd ...