LVS的部署、案例、以及常见问题
LVS的部署、案例、以及常见问题
原创chenhuyang 最后发布于2018-06-03 16:18:25 阅读数 1560 收藏
展开
一、LVS的部署
LVS现在已经集成在linux内核模块中,但整个LVS环境又分为内核层和用户层,内核层负责核心算法的实现,用户层需要安装ipvsadm工具,通过命令行将管理员需要的工作模式与实现算法传递给内核来实现。LVS的内核名称为ip_vs,命令行工具在Centos6.3(以及以上的版本)光盘中已经自带,我们可以使用YUM方式安装ipvsadm,也可以自行到官网下载使用源码安装。
1.源码安装
源码安装软件前需要使用YUM安装相关的依赖软件包。ipvsadm源码软件可以从官方网站下载,下载后使用的标准的make、make install,编译、安装即可。
[root@server0 ~]# yum -y install gcc popt-devel popt-static libnl libnl-devel
[root@server0 ~]# wget http://www.linuxvirtualsever.org/software/kernel-2.6/ipvsadm-1.26.tar.gz
[root@server0 ~]# tar -zxvf ipvsadm-1.26.tar.gz -C /usr/src/
[root@server0 ~]# cd /usr/src/ipvsadm-1.26
[root@server0 ~]# make
[root@server0 ~]# make install
2.YUM安装
YUM安装需要确保本机可以连接YUM源,可以从YUM源中下载RPM格式软件包。
[root@server0 ~]# yum - y install ipvsadm
无论使用哪种方式安装ipvsadm软件,安装完成后都会生成一个同名的命令工具,我们需要是应该命令来管理配置LVS虚拟服务器组和相应的调度算法。
二、ipvsadm 命令的描述和用法
描述:Linux虚拟服务器管理工具。
用法:ipvsadm 选项 服务器地址 -s 算法
ipvsadm 选项 服务器地址 -r 真实服务器地址 [工作模式] [权重] ...
| 选项 | 说明 |
|---|---|
| -A | 添加一个虚拟服务,使用IP地址、端口号、协议来唯一定义一个虚拟服务 |
| -E | 编辑一个虚拟服务 |
| -D | 删除一个虚拟服务 |
| -C | 清空虚拟服务列表 |
| -R | 从标准输入中还原虚拟服务规则 |
| -S | 保存虚拟服务规则至标准输出,输出的规则可以使用-R导入还原 |
| -a | 在虚拟服务中添加一台真实服务器 |
| -e | 在虚拟服务中编辑一台真实服务器 |
| -d | 在虚拟服务中减少一台真实服务器 |
| -L | 显示虚拟服务列表 |
| -t | 使用TCP服务,该参数后需要跟主机与端口信息 |
| -u | 使用UDP服务,该参数后需要跟主机与端口信息 |
| -s | 指定LVS采用的调度算法 |
| -r | 设置真实服务器IP地址与端口信息 |
| -g | 设置LVS工作模式为DR直连路由模式 |
| -i | 设置LVS工作模式为TUN隧道模式 |
| -m | 设置LVS工作模式为NAT地址转换模式 |
| -w | 设置指定服务器的权重 |
| -c | 连接状态,需要配合-L使用 |
| -n | 数字格式输出 |
三、LVS负载均衡应用案例
案例1:基于NAT工作模式的负载均衡
服务器IP地址设置见表1 。所有访问lvs.example.com 这台主机的VIP地址的80端口的请求数据包都将被均衡地调度到三台真实的服务器上。
| server | network | ip |
|---|---|---|
| lvs | eth1 | 124.126.147.168 |
| lvs | eth0 | 192.168.0.254 |
| web1 | eth0 | 192.168.0.1 |
| web2 | eth0 | 192.168.0.2 |
| web3 | eth0 | 192.168.0.3 |
LVS负载均衡调度器的设置
LVS负载均衡调度器的设置。首先,需要为整个拓扑环境设置网络参数,案例中使用静态IP地址的方式配置网络,由于LVS调度器使用了两块网卡,这里需要修改ifcfg-eth0以及ifcfg-eth1两块网卡配置文件。
[root@lvs ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
TYPE=Ethernet
IPADDR=192.168.0.254
NETMASK=255.255.255.0
DNS1=202.106.0.20
[root@lvs ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=static
ONBOOT=yes
TYPE=Ethernet
IPADDR=124.126.147.168
NETMASK=255.255.255.240
GATEWAY=124.126.147.169
DNS1=202.106.0.20
[root@lvs ~]# service network restart #重启网络服务
[root@lvs ~]# yum -y install ipvsadm #安装ipvsadm命令工具
使用ipvsadm命令工具添加一个虚拟服务,并为该虚拟服务设置一组具体的后端服务器主机和虚拟服务的调度算法。
[root@lvs ~]# ipvsadm -A -t 124.126.147.168:80 -s rr
[root@lvs ~]# ipvsadm -a -t 124.126.147.168:80 -r 192.168.0.1:80 -m
[root@lvs ~]# ipvsadm -a -t 124.126.147.168:80 -r 192.168.0.2:80 -m
[root@lvs ~]# ipvsadm -a -t 124.126.147.168:80 -r 192.168.0.3:80 -m
[root@lvs ~]# service ipvsadm save #保存调度规则
[root@lvs ~]# sed -l /ip_forward/s/0/1 /etc/sysctl.conf #开启路由转发功能
[root@lvs ~]# sysctl -p #重新加载sysctl.conf
[root@lvs ~]# iptables -F
[root@lvs ~]# iptables -X
[root@lvs ~]# service iptables save
后端真实服务器设置
后端真实服务器设置(这里为了可以验证调度器每次选取的是不同的服务器,我们将每个真实web服务器的页面内容设置为不同内容,而真实生产环境中所有的Web服务器都应该提供相同的页面内容)。与LVS调度器主机一样,首先要根据实际的网络环境为真实服务器设置网络参数,通过修改ifcfg-eth0即可实现。
[root@web1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
TYPE=Ethernet
IPADDR=192.168.0.1
NETMASK=255.255.255.0
GATEWAY=192.168.0.254
由于LVS调度器会将请求转发给后端真实服务器,所以所有的后端服务器都需要配置Web服务。为了使得内容结构简单、突出实验目的,本次案例仅生成一个测试用页面文件index.html 。
[root@web1 ~]# yum -y install httpd
[root@web1 ~]# service httpd start
[root@web1 ~]# service network restart
[root@web1 ~]# echo "192.168.0.1" > /var/www/html/index.html
[root@web1 ~]# iptables -F
[root@web1 ~]# iptables -X
[root@web1 ~]# service iptables save
下面web2 与 web3服务器主机的具体操作步骤。因为都承担着后端真实服务器的角色,所以操作步骤与web1 主机基本一致,IP地址等细致问题需要根据环境的实际情况进行修改。
[root@web2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
TYPE=Ethernet
IPADDR=192.168.0.2
NETMASK=255.255.255.0
GATEWAY=192.168.0.254
[root@web2 ~]# yum -y install httpd
[root@web2 ~]# service httpd start
[root@web2 ~]# service network restart
[root@web2 ~]# echo "192.168.0.2" > /var/www/html/index.html
[root@web2 ~]# iptables -F
[root@web2 ~]# iptables -X
[root@web2 ~]# service iptables save
[root@web3 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
TYPE=Ethernet
IPADDR=192.168.0.3
NETMASK=255.255.255.0
GATEWAY=192.168.0.254
[root@web3 ~]# yum -y install httpd
[root@web3 ~]# service httpd start
[root@web3 ~]# service network restart
[root@web3 ~]# echo "192.168.0.3" > /var/www/html/index.html
[root@web3 ~]# iptables -F
[root@web3 ~]# iptables -X
[root@web3 ~]# service iptables save
验证:
客户端可是使用浏览器访问http://124.126.147.168,最终可以访问到真实服务器所提供的页面内容,由于LVS采用RR(轮询)调度算法,所以不同的连接请求将被平均分配到不同的后端服务器上。本例中由于采用所有的页面都不相同,所以不同的客户端访问http://124.126.147.168 后将得到不同的页面内容。
案例2:基于DR工作模式的负载均衡
服务器IP地址设置见表2.所有访问lvs.example.com这台主机的VIP地址(124.126.147.168)的80端口都将被均衡地调度到三台真实的服务器上。真实的服务器在收到调度器转发过来的请求后直接通过Router路由器发送响应数据给客户端,这里要求所有真实服务器的网关地址指向Router的内网IP地址,由于调度器有真实服务器都设置了VIP地址,所以要求真实服务器在Non-ARP设置上配置VIP地址。本次案例使用的所有服务器均为Linux操作系统,我们使用Linux来承担软路由的功能。
| server | network | ip |
|---|---|---|
| lvs | eth1 | 124.126.147.168 |
| lvs | eth0 | 192.168.0.254 |
| web1 | eth0 | 192.168.0.1 |
| web2 | eth0 | 192.168.0.2 |
| web3 | eth0 | 192.168.0.3 |
| router | eth0 | 192.168.0.253 |
| router | eth1 | 124.126.147.168 |
LVS负载均衡调度器设置
LVS负载均衡调度器设置,首先部署网络拓扑环境,修改网卡配置文件。
[root@lvs ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
TYPE=Ethernet
IPADDR=124.126.147.168
NETMASK=255.0.0.0
DNS1=202.106.0.20
[root@lvs ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=static
ONBOOT=yes
TYPE=Ethernet
IPADDR=192.168.0.254
NETMASK=255.255.255.0
DNS1=202.106.0.20
[root@lvs ~]# service network restart #重启网络服务
[root@lvs ~]# yum -y install ipvsadm #安装ipvsadm命令工具
使用ipvsadm命令工具添加一个虚拟服务,并为该虚拟服务设置一组具体的后端服务器主机和虚拟服务的调度算法。
[root@lvs ~]# ipvsadm -A -t 124.126.147.168:80 -s wrr
[root@lvs ~]# ipvsadm -a -t 124.126.147.168:80 -r 192.168.0.1:80 -g -w 1
[root@lvs ~]# ipvsadm -a -t 124.126.147.168:80 -r 192.168.0.2:80 -g -w 2
[root@lvs ~]# ipvsadm -a -t 124.126.147.168:80 -r 192.168.0.3:80 -g -w 3
[root@lvs ~]# service ipvsadm save #保存调度规则
[root@lvs ~]# iptables -F
[root@lvs ~]# iptables -X
[root@lvs ~]# service iptables save
真实web服务器设置
真实web服务器设置如下(这里为了可以验证调度器每次选取的是不同的服务器,我们将每个真实web服务器的页面内容设置为不同内容,而真实生产环境中所有的Web服务器都应该提供相同的页面内容)。注意,因为调度器与真实服务器都设置了VIP地址,所以这里都要求所有的真实服务器要禁止对VIP地址的ARP响应,方法是通过arp_ignore 与 arp_announce来实现的:
# web1
[root@web1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
TYPE=Ethernet
IPADDR=192.168.0.1
NETMASK=255.255.255.0
GATEWAY=192.168.0.253
[root@web1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
BOOTPROTO=static
ONBOOT=yes
TYPE=Ethernet
IPADDR=124.126.147.168
NETMASK=255.255.255.255
GATEWAY=192.168.0.253
[root@web1 ~]# vim /etc/sysctl.conf
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@web1 ~]# sysctl -p
[root@web1 ~]# yum -y install httpd
[root@web1 ~]# service httpd start
[root@web1 ~]# service network restart
[root@web1 ~]# echo "192.168.0.1" > /var/www/html/index.html
[root@web1 ~]# iptables -F
[root@web1 ~]# iptables -X
[root@web1 ~]# service iptables save
# web2
[root@web2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
TYPE=Ethernet
IPADDR=192.168.0.2
NETMASK=255.255.255.0
GATEWAY=192.168.0.253
[root@web2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
BOOTPROTO=static
ONBOOT=yes
TYPE=Ethernet
IPADDR=124.126.147.168
NETMASK=255.255.255.255
GATEWAY=192.168.0.253
[root@web2 ~]# vim /etc/sysctl.conf
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@web2 ~]# sysctl -p
[root@web2 ~]# yum -y install httpd
[root@web2 ~]# service httpd start
[root@web2 ~]# service network restart
[root@web2 ~]# echo "192.168.0.2" > /var/www/html/index.html
[root@web2 ~]# iptables -F
[root@web2 ~]# iptables -X
[root@web2 ~]# service iptables save
# web3
[root@web3 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
TYPE=Ethernet
IPADDR=192.168.0.3
NETMASK=255.255.255.0
GATEWAY=192.168.0.253
[root@web3 ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
BOOTPROTO=static
ONBOOT=yes
TYPE=Ethernet
IPADDR=124.126.147.168
NETMASK=255.255.255.255
GATEWAY=192.168.0.253
[root@web3 ~]# vim /etc/sysctl.conf
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@web3 ~]# sysctl -p
[root@web3 ~]# yum -y install httpd
[root@web3 ~]# service httpd start
[root@web3 ~]# service network restart
[root@web3 ~]# echo "192.168.0.3" > /var/www/html/index.html
[root@web3 ~]# iptables -F
[root@web3 ~]# iptables -X
[root@web3 ~]# service iptables save
路由器(Router)
路由器(Router)采用Linux作为软件路由来实现本例,具体操作如下。
[root@router ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
TYPE=Ethernet
IPADDR=192.168.0.253
NETMASK=255.255.255.0
[root@router ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=static
ONBOOT=yes
TYPE=Ethernet
IPADDR=124.126.147.168
NETMASK=255.0.0.0
NETMASK=255.255.255.0
[root@router ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@router ~]# sysctl -p
[root@router ~]# service network restart
[root@router ~]# iptables -F
[root@router ~]# iptables -X
[root@router ~]# service iptables save
验证:
客户端使用浏览器访问http://124.126.147.168,最终可以访问到真实服务器所提供的页面内容,由于LVS采用WRR(加权轮询)调度算法,不同的连接请求将被分配到不同的后端服务器上,但服务器之间的优先级不同,本例中由于所有的页面内容都不相同,所以客户端多次访问后将得到不同页面内容。
四、常见的问题分析
1.路由转发功能
在LVS(NAT)工作模式中,LVS调度器必须能够提供数据转发功能,而Centos6.3系统默认的规则没有开启路由转发功能,需要手动修改/etc/sysctl.conf 文件开启该功能。
2.防火墙转发规则默认为禁止
在LVS(NAT)工作模式中,调度器除了担当调度角色外,还需要担当路由的角色,但Centos6.3系统的防火墙转发规则默认为禁止转发,因此需要将准发规则清空,具体操作如下
[root@lvs ~]# iptables -F
[root@lvs ~]# iptables -X
[root@lvs ~]# service iptables save
3.VIP地址的ARP广播
在LVS(DR)工作模式下,由于所有的真实服务器都配置了VIP地址,因此需要设置服务器不进行针对VIP地址的ARP广播,Linux中可以直接通过arp_ignore与arp_announce 来实现。
arp_ignore 用来定义网卡在响应外部ARP请求时的响应级别。
0:默认值,任何网络接口接收到ARP请求后,如果本机的任意接口有该MAC,则予以响应。
1:某个网络接口收到ARP请求后,判断请求的MAC地址是否是本地接口,是则回应,否则不回应。LVS调度器会将客户请求转发给真实服务器的eth0接口,而真实服务器的VIP地址配置在本地回环设备上。
arp_announce 用来定义网卡广播ARP包时的级别。
0:默认值,任何网络接口接收到ARP请求后,如果本机的任意接口有该MAC,则予以响应。
1: 尽量避免响应MAC地址非本地网络接口MAC地址的ARP请求。
2: 不响应MAC地址非本地网络接口MAC地址的ARP请求。
————————————————
版权声明:本文为CSDN博主「chenhuyang」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_40470303/article/details/80556345
LVS的部署、案例、以及常见问题的更多相关文章
- Linux平台下Lotus Domino服务器部署案例
Linux平台下Lotus Domino服务器部署案例 几年前我写了篇<RHAS2.1下安装中文LotusDominoR6.5图解>这篇文档被多个大型网站转载,曾帮助过很多公司系统管理员部 ...
- 突破LVS瓶颈,LVS Cluster部署(OSPF + LVS) - lxcong的运维技术 - 开源中国社区
突破LVS瓶颈,LVS Cluster部署(OSPF + LVS) - lxcong的运维技术 - 开源中国社区 突破LVS瓶颈,LVS Cluster部署(OSPF + LVS)
- Cesium 本地部署案例
众所周知,cesium的服务器是搭建在国外的,所以我们国内的用户访问的时候贼慢.有时想查个api或者看个案例半天都进不去,今天我来说一下傻瓜式搭建本地的cesium环境,用于大家没事查资料用!步骤:1 ...
- Openstack 实现技术分解 (1) 开发环境 — Devstack 部署案例详解
目录 目录 前言 系统环境 Devstack 下载源码 配置文件 local.conf & localrc 简易的环境脚本 openrc 部署 Devstack 自动化部署流程 部署案例 单节 ...
- SaltStack 部署案例 02
远程执行 salt '*' state.sls apache '*':代表所有主机 state.sls :是一个模块 apache : 状态 ,表示需要部署的内容,后缀.sls YAML:三板斧 1. ...
- ES 02 - 部署Elasticsearch单机服务 + 部署中的常见问题
目录 1 准备工作 1.1 安装JDK 1.2 下载安装包 1.3 创建elastic用户 2 启动ES服务 2.1 修改配置文件 2.2 启动服务 3 验证ES服务是否可用 4 关闭与重启服务 4. ...
- LVS主从部署配置和使用
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统.本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一. LVS是L ...
- 服务发现之consul理论整理_结合Docker+nginx+Tomcat简单部署案例
目录 一.理论概述 服务发现的概念简述 consul简述 二.部署docker+consul+Nginx案例 环境 部署 三.测试 四.总结 一.理论概述 服务发现的概念简述 在以前使用的是,N台机器 ...
- lvs+keepalived部署k8s v1.16.4高可用集群
一.部署环境 1.1 主机列表 主机名 Centos版本 ip docker version flannel version Keepalived version 主机配置 备注 lvs-keepal ...
随机推荐
- 【Java必修课】判断String是否包含子串的四种方法及性能对比
1 简介 判断一个字符串是否包含某个特定子串是常见的场景,比如判断一篇文章是否包含敏感词汇.判断日志是否有ERROR信息等.本文将介绍四种方法并进行性能测试. 2 四种方法 2.1 JDK原生方法St ...
- spring boot 调度任务
1.引入spring boot所依赖的jar包 <parent> <groupId>org.springframework.boot</groupId> < ...
- git涨姿势(一)
今天遇到了一个git冲突问题,解决冲突方案我是当然知道的,就是本地不知道何时自己傻不拉几的新建了一个relese分支,而remote是没有release分支的,需要拉取的是release/V1.4.2 ...
- hadoop HDFS完全分布式搭建
1.准备阶段 准备好两台虚拟机(安装好hadoop,见:https://www.cnblogs.com/cjq10029/p/12336446.html),计划: IP 主机名 192.168.3.7 ...
- etcdctl的使用
etcdctl是一个提供简洁命令的etcd客户端,使用etcdctl可以直接和etcd服务打交道,对etcd中的键值对进行增删改查. 安装etcdctl 下载etcdctl工具 下载地址:etcdct ...
- SpringBoot内置的各种Starter是怎样构建的?--SpringBoot源码(六)
注:该源码分析对应SpringBoot版本为2.1.0.RELEASE 1 温故而知新 本篇接 外部配置属性值是如何被绑定到XxxProperties类属性上的?--SpringBoot源码(五) 温 ...
- USB设备描述符和请求命令
USB设备描述符和请求命令 介绍标准的USB设备描述符和请求命令. 标准的USB描述符 当USB设备第一次连接到主机上时,要接收主机的枚举和配置,目的就是让主机知道该设备具有什么功能.是哪一类的USB ...
- mysql那些事之索引篇
mysql那些事之索引篇 上一篇博客已经简单从广的方面介绍了一下mysql整体架构以及物理结构的内容. 本篇博客的内容是mysql的索引,索引无论是在面试还是我们日常工作中都是非常的重要一环. 索引是 ...
- Vulnhub靶场DC-1 WP
前言 之前提到过最近在做vlunhub的靶场复现工作,今天开始更新writeup吧.(对着walkthrough一顿乱抄嘻嘻嘻) 关于DC-1(官网翻译来的) 描述 DC-1是一个专门构建的易受攻击的 ...
- [Java网络安全系列面试题]常见web攻击有哪些?
搞Web开发离不开安全这个话题,确保网站或者网页应用的安全性,是每个开发人员都应该了解的事.本篇主要简单介绍在Web领域几种常见的攻击手段及Java Web中的预防方式. 1. XSS 1.1 什么是 ...