一、集群及LVS简介
1.1 集群简介
1.1.1 什么是集群
• 将很多服务器集中起来一起,提供同一种服务,在客
户端看来就象是只有一个服务器
• 可以在付出较低成本的情况下获得在性能、可靠性、
灵活性方面的相对较高的收益
• 一组通过高速网络互联的计算组,并以单一系统的模
式加以管理
• 任务调度是集群系统中的核心技术
1.1.2 集群目的
• 提高性能
– 如计算密集型应用,如:天气预报、核试验模拟
• 降低成本
– 相对百万美元级的超级计算机,价格便宜
• 提高可扩展性
– 只要增加集群节点即可
• 增强可靠性
– 多个节点完成相同功能,避免单点失败
1.1.3 集群分类
• 高性能计算集群HPC
– 通过以集群开发的并行应用程序,解决复杂的科学问题
• 负载均衡(LB)集群
– 客户端负载在计算机集群中尽可能平均分摊
• 高可用(HA)集群
– 避免单点故障,当一个系统发生故障时,可以快速迁移
二、LVS概述
2.1 LVS集群组成
• 前端:负载均衡层
– 由一台或多台负载调度器构成
• 中间:服务器群组层
– 由一组实际运行应用服务的服务器组成
• 底端:数据共享存储层
– 提供共享存储空间的存储区域
2.2 LVS术语
• Director Server:调度服务器
– 将负载分发到Real Server的服务器
• Real Server:真实服务器
– 真正提供应用服务的服务器
• VIP:虚拟IP地址
– 公布给用户访问的虚拟IP地址
• RIP:真实IP地址
– 集群节点上使用的IP地址
• DIP:调度器连接节点服务器的IP地址
2.3 LVS工作模式
• VS/NAT
– 通过网络地址转换实现的虚拟服务器
– 大并发访问时,调度器的性能成为瓶颈
• VS/DR
– 直接使用路由技术实现虚拟服务器
– 节点服务器需要配置VIP,注意MAC地址广播
• VS/TUN
– 通过隧道方式实现虚拟服务器
2.4 负载均衡调度算法
• LVS目前实现了10种调度算法
• 常用调度算法有5种
– 轮询(Round Robin)
– 将客户端请求平均分发到Real Server
– 加权轮询(Weighted Round Robin)
– 根据Real Server权重值进行轮询调度
– 最少连接(Least Connections)
– 选择连接数最少的服务器
– 加权最少连接( Weighted Least Connections )
– 根据Real Server权重值,选择连接数最少的服务器
– 源地址散列(Source Hashing)
– 根据请求的目标IP地址,作为散列键(Hash Key)从静态分配
的散列表找出对应的服务器
• 其他调度算法
– 基于局部性的最少链接
– 带复制的基于局部性最少链接
– 目标地址散列(Destination Hashing)
– 最短的期望的延迟
– 最少队列调度
1 案例1:ipvsadm命令用法
1.1 问题
准备一台Linux服务器,安装ipvsadm软件包,练习使用ipvsadm命令,实现如下功能:
- 使用命令添加基于TCP一些的集群服务
- 在集群中添加若干台后端真实服务器
- 实现同一客户端访问,调度器分配固定服务器
- 会使用ipvsadm实现规则的增、删、改
- 保存ipvsadm规则
1.2 方案
安装ipvsadm软件包,关于ipvsadm的用法可以参考man ipvsadm资料。常用ipvsadm命令语法格式如表-1所示。
表-1 ipvsadm语法格式
1.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:使用命令增、删、改LVS集群规则
1)创建LVS虚拟集群服务器
- [root@svr5 ~]# ipvsadm -A -t 192.168.0.254 -s wrr -p 30
2)为集群添加若干real server
- [root@svr5 ~]# ipvsadm –a -t 192.168.0.254 -r 192.168.0.1 -m -w 1
- [root@svr5 ~]# ipvsadm –a -t 192.168.0.254 -r 192.168.0.2 -m -w 2
- [root@svr5 ~]# ipvsadm –a -t 192.168.0.254 -r 192.168.0.3 -m -w 3
- [root@svr5 ~]# ipvsadm –a -t 192.168.0.254 -r 192.168.0.4 -m -w 4
3)修改集群服务器设置
- [root@svr5 ~]# ipvsadm -E -t 192.168.0.254 -s sh -p 30
4)修改read server
- [root@svr5 ~]# ipvsadm –a -t 192.168.0.254 -r 192.168.0.1 -m
5)查看LVS状态
- [root@svr5 ~]# ipvsadm –Ln
6)保存所有规则
- [root@svr5 ~]# service ipvsadm save
7)清空所有规则
- [root@svr5 ~]# ipvsadm –C
2 案例2:部署LVS-NAT集群
2.1 问题
使用LVS实现NAT模式的集群调度服务器,为用户提供Web服务:
- 集群对外公网IP地址为202.114.106.20
- 调度器内网IP地址为192.168.0.254
- 真实Web服务器地址分别为192.168.0.1、192.168.0.2、192.168.0.3
- 使用加权轮询调度算法,真实服务器权重与其IP地址末尾数一致
2.2 方案
使用4台虚拟机,1台作为Director调度器、3台作为Real Server、物理机作为客户端,拓扑结构如图-1所示。
2.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:配置网络环境
1)设置Web服务器网络参数
- [root@web1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
- DEVICE=eth0
- ONBOOT=yes
- BOOTPROTO=static
- IPADDR=192.168.0.1
- NETMASK=255.255.255.0
- GATEWAY=192.168.0.254
- DNS1=202.106.0.20
- [root@web1 ~]# systemctl restart network
- nmcli connection reload eth0 //重新加载网卡配置文件
- nmcli connection up eth0 //激活网卡
- 删除多余的网卡 nmcli connection delete eth2
- [root@web2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
- DEVICE=eth0
- ONBOOT=yes
- BOOTPROTO=static
- IPADDR=192.168.0.2
- NETMASK=255.255.255.0
- GATEWAY=192.168.0.254
- DNS1=202.106.0.20
- [root@web2 ~]# systemctl restart NetworkManager
- [root@web3 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
- DEVICE=eth0
- ONBOOT=yes
- BOOTPROTO=static
- IPADDR=192.168.0.3
- NETMASK=255.255.255.0
- GATEWAY=192.168.0.254
- DNS1=202.106.0.20
- [root@web3 ~]# systemctl restart NetworkManager
2)自定义Web页面
- [root@web1 ~]# echo “192.168.0.1” > /var/www/html/index.html
- [root@web2 ~]# echo “192.168.0.2” > /var/www/html/index.html
- [root@web3 ~]# echo “192.168.0.3” > /var/www/html/index.html
3)启动Web服务器软件
- [root@web1 ~]# service httpd start
- [root@web2 ~]# service httpd start
- [root@web3 ~]# service httpd start
4)设置LVS调度器网络参数
- [root@lvs ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
- DEVICE=eth0
- ONBOOT=yes
- BOOTPROTO=static
- IPADDR=202.114.106.20
- DNS1=202.106.0.20
- [root@lvs ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
- DEVICE=eth0
- ONBOOT=yes
- BOOTPROTO=static
- IPADDR=192.168.0.254
- NETMASK=255.255.255.0
- DNS1=202.106.0.20
- [root@lvs ~]# systemctl restart NetworkManager
- [root@lvs ~]# sed -i '/ip_forward/s/0/1/' sysctl.conf //开启路由转发
- [root@lvs ~]# sysctl -p
步骤二:调度器安装软件并启动服务
1)安装软件
- [root@lvs Packages]# rpm –ihv ipvsadm-1.25-10.el6.x86_64.rpm
2)启动服务
- [root@lvs Packages]# service ipvsadm start
- [root@lvs Packages]# chkconfig ipvsadm on
步骤三:部署LVS-NAT模式调度器
1)创建集群服务器
- [root@lvs ~]# ipvsadm -A -t 202.114.106.20:80 -s wrr
2)添加真实服务器
- [root@lvs ~]# ipvsadm -a -t 202.114.106.20:80 -r 192.168.0.1 -m -w 1 【lvs的nat模式】
- [root@lvs ~]# ipvsadm -a -t 202.114.106.20:80 -r 192.168.0.2 -m -w 2
- [root@lvs ~]# ipvsadm -a -t 202.114.106.20:80 -r 192.168.0.3 -m -w 3
3)查看规则列表,并保存规则
- [root@lvs ~]# ipvsadm –Ln
- [root@lvs ~]# ipvsadm-save -n > /etc/sysconfig/ipvsadm
步骤四:客户端测试
客户端使用curl命令反复连接http://202.114.106.20,查看访问的页面是否会轮询到不同的后端真实服务器。
3 案例3:部署LVS-DR集群
3.1 问题
使用LVS实现DR模式的集群调度服务器,为用户提供Web服务:
- 路由器对外公网IP地址为202.114.106.20
- 路由器内网IP地址为192.168.0.254
- 路由是需要设置SNAT及DNAT功能
- LVS调度器真实IP地址为192.168.0.10
- LVS调度器VIP地址设置为192.168.0.253
- 真实Web服务器地址分别为192.168.0.1、192.168.0.2
- 使用加权轮询调度算法,真实服务器权重与其IP地址末尾数一致
3.2 方案
使用4台虚拟机,1台作为Linux路由器、1台作为Director调度器、2台作为Real Server、物理机作为客户端,拓扑结构如图-2所示。
图-2
3.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:配置网络环境
1)设置Web服务器网络参数
- [root@web1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
- DEVICE=eth0
- ONBOOT=yes
- BOOTPROTO=static
- IPADDR=192.168.0.1
- NETMASK=255.255.255.0
- GATEWAY=192.168.0.254
- DNS1=202.106.0.20
- [root@web1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo:0
- DEVICE=lo:0
- ONBOOT=yes
- BOOTPROTO=static
- IPADDR=192.168.0.253
- NETMASK=255.255.255.255
- [root@web1 ~]# vim /etc/sysctl.conf
- .. ..
- net.ipv4.conf.all.arp_ignore = 1
- net.ipv4.conf.lo.arp_ignore = 1
- net.ipv4.conf.lo.arp_announce = 2
- net.ipv4.conf.all.arp_announce = 2
- [root@web1 ~]# sysctl -p
- [root@web1 ~]# systemctl restart NetworkManager
- [root@web2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
- DEVICE=eth0
- ONBOOT=yes
- BOOTPROTO=static
- IPADDR=192.168.0.2
- NETMASK=255.255.255.0
- GATEWAY=192.168.0.254
- DNS1=202.106.0.20
- [root@web2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo:0
- DEVICE=lo:0
- ONBOOT=yes
- BOOTPROTO=static
- IPADDR=192.168.0.253
- NETMASK=255.255.255.255
- [root@web2 ~]# vim /etc/sysctl.conf
- .. ..
- net.ipv4.conf.all.arp_ignore = 1
- net.ipv4.conf.lo.arp_ignore = 1
- net.ipv4.conf.lo.arp_announce = 2
- net.ipv4.conf.all.arp_announce = 2
- [root@web2 ~]# sysctl -p
- [root@web2 ~]# systemctl restart NetworkManager
2)自定义Web页面
- [root@web1 ~]# echo “192.168.0.1” > /var/www/html/index.html
- [root@web2 ~]# echo “192.168.0.2” > /var/www/html/index.html
3)启动Web服务器软件
- [root@web1 ~]# systemctl start httpd; systemctl enable httpd
- [root@web2 ~]# systemctl start httpd; systemctl enable httpd
4)设置LVS调度器网络参数
- [root@lvs ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
- DEVICE=eth0
- ONBOOT=yes
- BOOTPROTO=static
- IPADDR=192.168.0.10
- NETMASK=255.255.255.0
- GATEWAY=192.168.0.254
- DNS1=202.106.0.20
- [root@lvs ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0:0
- DEVICE=eth0:0
- ONBOOT=yes
- BOOTPROTO=static
- IPADDR=192.168.0.253
- NETMASK=255.255.255.0
- GATEWAY=192.168.0.254
- DNS1=202.106.0.20
- [root@lvs ~]# systemctl restart NetworkManager
5)设置Linux路由器网络参数
- [root@router ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
- DEVICE=eth0
- ONBOOT=yes
- BOOTPROTO=static
- IPADDR=202.114.106.20
- DNS1=202.106.0.20
- [root@router ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
- DEVICE=eth0
- ONBOOT=yes
- BOOTPROTO=static
- IPADDR=192.168.0.254
- NETMASK=255.255.255.0
- DNS1=202.106.0.20
- [root@router ~]# systemctl restart NetworkManager
6)设置Linux路由器的SNAT、DNAT功能
- [root@router ~]# sed -i '/ip_forward/s/0/1/' sysctl.conf //开启路由转发
- [root@router ~]# sysctl -p
- [root@router ~]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -p tcp –j SNAT --to-source 202.114.106.20
- [root@router ~]# iptables -t nat -A PREROUTING -d 202.114.106.20 -p tcp --dport 80 –j DNAT --to-destination 192.168.0.253:80
- [root@router ~]# service iptables save
步骤二:调度器安装软件并启动服务
1)安装软件
- [root@lvs Packages]# rpm –ihv ipvsadm-1.25-10.el6.x86_64.rpm
2)启动服务
- [root@lvs Packages]# systemctl start ipvsadm
- [root@lvs Packages]# systemctl enable ipvsadm
步骤三:部署LVS-DR模式调度器
1)创建集群服务器
- [root@lvs ~]# ipvsadm -A -t 192.168.0.253:80 -s wrr
2)添加真实服务器
- [root@lvs ~]# ipvsadm -a -t 192.168.0.253:80 -r 192.168.0.1 -g -w 1
- [root@lvs ~]# ipvsadm -a -t 192.168.0.253:80 -r 192.168.0.2 -g -w 2
3)查看规则列表,并保存规则
- [root@lvs ~]# ipvsadm –Ln
- [root@lvs ~]# ipvsadm-save -n > /etc/sysconfig/ipvsadm
步骤四:客户端测试
客户端使用curl命令反复连接http://202.114.106.20,查看访问的页面是否会轮询到不同的后端真实服务器。
4.常见错误
4.1 服务无法启动
问题现象
• 启动LVS服务时,启动失败
• 尝试以restart方式启动服务,仍然失败
故障分析及排除
• 原因分析
– 检查服务状态和日志,提示没有/etc/sysconfig/ipvsadm文件
– 该文件是调度规则文件
• 解决办法
– 先将规则存盘,再重启服务