1、集群
1.1 集群类型
软件集群:
lvs(传输层)
Nginx(应用层)
haproxy(应用层)
硬件集群:
F5
A10
Array
Redware
Netscaler
HA:
heartbeat
keepalived
corosync+pacemaker
RHCS
HPC:
hadoop
硬件集群和软件集群
硬件:F5负载均衡器 https://f5.com/
软件:LVS (工作在OSI第四层,传输层) Nginx(工作在OSI第七应用层)
LVS:Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,此项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。
集群特性
- 可伸缩性(Scalability)比如:20台计算机为我们提供服务,可缩可减,可增可拓
- 可靠性(Reliability)一部分计算机出现问题,并不影响对用户提供服务
- 可管理性(Manageability)统一管理
1.2 集群分类
无论是哪种集群,都至少包括两台节点服务器,而对外表现为一个整体,只提供一个访问入口(域名或IP地址),相当于一台大型计算机。根据集群所针对的目标差异,可分为以下三种类型。
- 负载均衡集群:Load Balance集群,简称LB,当一台服务器无法满足需求的时候,两台或多台服务器同时为客户端提供服务,以分担需求,提供轮询工作查询
- 高可用集群:High Availability集群,简称HA,比如一台服务器出现故障的时候,但是不影响客户端体验,另外一台服务器担当这台服务器的工作!
- 高性能集群:High Perfermance Computing集群,简称HPC,一台计算机是4路,那么100台计算机同时来辅助计算处理,就是400颗CPU!
2、LVS简介
Linux Virtual Server 是针对Linux内核开发的一个负载均衡项目,由我国的章文嵩博士在1998年5月创建,官方站点http://www.linuxvirtualserver.org/ 。 LVS实际上相当于基于IP地址的虚拟化应用,为基于IP地址和内容请求颁发的负载均衡提出了一种高效的解决方法。
LVS现在已成为Linux内核的一部分,默认编译为ip_vs模块,必要时能够自动调用。在CentOS 6系统中,以下操作可以手动加载ip_vs模块,并查看当前系统中ip_vs模块的版本信息。
1 | [root@centos1 ~]# modprobe ip_vs |
2.1 LVS的负载调度算法
- 轮询(Round Robin):将收到的访问请求按照顺序轮流分配给集群中的各节点(真实服务器),均等地对待每一台服务器,而不管服务器实际的连接数和系统负载。
- 加权轮询(Weighted Round Robin):根据真实服务器的处理能力轮流分配收到的访问请求,调度器可以自动查询各节点的负载情况,并动态调整其权重。这样可以保证处理能力强的服务器承担更多的访问流量。
- 最少连接(Least Connections):根据真实服务器已建立的连接数进行分配,将收到的访问请求优先分配给连接数最少的节点。如果所有的服务器节点性能相近,采用这种方式可以更好地均衡负载。
- 加权最少连接(Weighted Least Connections):在服务器节点功效 大的情况下,可以为真实服务器自动调整权重,权重较高的节点将承担更大的比例的活动连接制裁。
2.2 LVS 的优势
LVS工作在网络模型的4层,可以针对http应用做一些分流的策略,比如针对域名、目录结构。Nginx单凭这点可利用的场合就远多于LVS。
最新版本的nginx也支持4层TCP负载。曾经这是LVS比nginx好的地方。
nginx对网络稳定性的依赖非常小,理论上能ping通就能进行负载功能,这个也是它的优势之一,相反LVS对网络稳定依赖性比较大。
nginx安装和配置比较简单测试起来比较方便,它的基本能把错误用日志打印出来。LVS的配置、测试就要花比较长时间了,LVS对网络依赖比较大。
总结:当并发超过nginx上限,就可以使用LVS了。日1000-2000W pv或并发请求1万以下都可以考虑用nginx。大型门户网站,电商网站需要用到LVS
官网:http://www.linuxvirtualserver.org/index.html
中文资料
中文官方网站:http://zh.linuxvirtualserver.org/ http://www.linux-vs.org/zh/
LVS项目介绍 http://www.linuxvirtualserver.org/zh/lvs1.html
LVS集群的体系结构 http://www.linuxvirtualserver.org/zh/lvs2.html
LVS集群中的IP负载均衡技术 http://www.linuxvirtualserver.org/zh/lvs3.html
LVS集群的负载调度 http://www.linuxvirtualserver.org/zh/lvs4.html
2.3 LVS负载均衡的分层结构
- 负载调度器:这是访问整个集群系统的唯一入口,对外使用所有服务器共有的VIP (Virtual IP,虚拟IP)地址,也称为集群IP地址。通常会配置主,备两台调度器实现热备份,当主调度器失效以后平滑替换至备用调度器,确保高可用性
- 服务器池:集群所提供的应用服务(如HTTP,FTP)由服务器池承担,其中的每个节点具有独立的RIP(Real IP ,真实IP)地址,只处理调度器分发过来的客户请求。 当某个节点暂时失效时,负载调度器的容错机制会将其隔离,等待错误排除以后再重新纳入服务器池。
- 共享存储:为服务器池中的所有节点提供稳定,一致的文件存取服务,确保整个集群的统一性。在Linux/UNIX环境中,共享存储可以使用NAS设备,或者提供NFS(Network File System,网络文件系统)共享服务的专用服务器。
3、LVS负载均衡的工作模式
地址转换(Network Address Translation):简称NAT模式,类似于防火墙的私有网络结构,负载调度器作为所有服务器节点的网关,即作为客户机的访问入口,也是各节点回应客户机的访问出口。服务器节点使用私有IP地址,与负载调度器位于同一个物理网络,安全性要优于其他两种方式。
IP隧道(IP Tunnel):简称TUN模式,采用开放式的网络结构,负载调度器仅作为客户机的访问入口,各节点通过各自的Internet连接直接回诮客户机,而不再经过负载调度器。服务器节点分散在互联网中的不同位置,具有独立的公网IP地址,通过专用IP隧道与负载调度器相互通信。
直接路由(Direct Routing):简称DR模式,采用半开放式的网络结构,与TUN模式的结构类似,但各节点并不是分散在务地,而是与调度器位于同一个物理网络。负载调度器与各节点服务器通过本地网络连接,不需要建立专用的IP隧道。
LVS三种模式的比较
NAT模式 | IPIP模式 | DR模式 | |
---|---|---|---|
对服务器结点要求 | 服务结点可以是任何操作系统 | 必须支持IP隧道模式,目前只有Linux | 服务结点支持虚拟网卡设备,能够禁用设备的ARP响应 |
网络要求 | 拥有私有IP地址的局域网络 | 拥有合法IP地址的局域网络或广域网 | 拥有合法IP地址的局域网,服务结点与均衡器必须在同一个网段 |
通常支持结点数 | 10~20个,试均衡器处理能力而定 | 较高,可以支持到100个服务结点 | 较高,可以支持到100个服务结点 |
网关 | 均衡器即为服务器结点网关 | 服务结点同自己的网关或者路由器连接,不经过均衡器 | 服务结点同自己的网关或者路由器连接,不经过均衡器 |
服务结点安全性 | 较好,采用内部IP,服务结点隐藏 | 较差,采用公用IP地址,结点完全暴露 | 较差,采用公用IP地址,结点完全暴露 |
IP要求 | 仅需要一个合法IP地址 作为VIP | 除VIP外,每个服务结点需拥有合法IP地址,可以直接路由至客户端 | 除VIP外,每个服务结点需拥有合法的IP地址,可以直接路由至客户端 |
比较 | TUN | NAT | DR |
---|---|---|---|
配置复杂度 | 复杂 | 简单 | 复杂 |
拓展性 | 很好 | 差 | 好 |
支持数量 | >100 | <20 | >100 |
特点 | 封装IP | 地址转化 | 修改MAC |
支持OS | 需要支持IPIP隧道 | Any | 大部分 |
三种模式下的压力测试
LVS 模式 | 总耗时(s) | 总耗时(s) |
---|---|---|
NAT | 22.480 | 4448.34 |
TUNNEL | 10.707 | 9339.80 |
DR | 10.177 | 9825.68 |
#TPS(Transaction Per Second)每秒系统处理事务的数量
可以看出 NAT 性能要比后两种差一倍。
网站性能测试工具webbench
4、LVS集群部署
4.1 配置地址转换模式(LVS—NAT)
实验环境:
4.1.1 配置负载调度器
①加载ip_vs模块
1 | [root@centos1 ~]# modprobe ip_vs |
②安装ipvsadm管理工具
1 | [root@centos1 ~]# rpm -ivh /media/Packages/ipvsadm-1.26-2.el6.x86_64.rpm |
③创建虚拟服务器
1 | [root@centos1 ~]# ipvsadm -A -t 192.168.1.254:80 -s rr |
-A: 添加虚拟服务器
-t:用来指定VIP地址及TCP端口
-s:用来指定负载调度算法—-轮询(rr),加权轮询(wrr),最少连接(lc),加权最少连接(wlc)
④添加服务器节点
1 | [root@centos1 ~]# ipvsadm -a -t 192.168.1.254:80 -r 172.16.16.21:80 -m -w 1 |
⑤查看集群节点状态
1 | [root@centos1 ~]# ipvsadm -ln |
上述输出结果中,Forward列下的Masq对应Masquerade (地址伪装),表示采用的集群模式为NAT;如果是Route,则表示采用的集群模式为DR;如果是Tunnel,则表示采用的集群模式为TUN模式。
⑥保存负载分配策略
使用导出/导师入工具ipvsadm-save/ipvsadm-restore可以保存,恢复LVS策略,操作方法类似于iptables规则的导出,导入。通过系统服务ipvsadm也可以保存策略,如可执行“service ipvsadm save”;当然也可以快速清除,重建负载分配策略。
1 | [root@Centos1 ~]# ipvsadm-save > /etc/sysconfig/ipvsadm |
⑦配置SNAT转发规则
1 | [root@Centos1 ~]# vim /etc/sysctl.conf |
⑧闭防火墙(LVS跟防火墙有冲突会导致访问失败,需要关闭防火墙)
1 | [root@Centos1 ~]# service iptables stop |
4.1.2 配置NFS共享存储服务
①安装nfs-utils rpcbind软件包
1 | [root@centos4 ~]# yum install –y nfs-utils rpcbind |
②设置共享目录
1 | [root@centos4 ~]# mkdir /wwwroot |
其中客户机地址可以是主机名,IP地址,网段地址,允许使用,?通配符;权限选项中的rw表示允许读写(ro为只读),sync表示同步写入,no_root_squash表示当客户机以root身份访问时赋予本地root权限(默认是root_squash,将作为nfsnobdy用户降权对待)。
*③启动NFS服务程序**
1 | [root@centos4 ~]# service rpcbind start |
注意:一定要先启动rpcbind然后才能启动nfs 否则nfs服务将启动失败。
④查看本机发布的NFS共享目录
1 | [root@centos4 ~]# showmount -e |
⑤挂载之前记得关闭防火墙
1 | [root@centos4 ~]# service iptables stop |
4.1.3 在web1(Real Server1)中挂载NFS共享资源
①安装rpcbind软件包,并启动rpcbind服务
若要正常访问NFS共享资源,客户机中也需要安装rpcbind软件包,并ynfcrpcbind系统服务别外,为了使用showmount查询工具,建议将nfs-utils软件包也一并将上。
1 | [root@Centos2 ~]# yum install –y rpcbind nfs-utils |
如果已经安装了nfs-utils软件包,则客户机可以使用showmount查看NFS服务器的共享目录
1 | [root@Centos2 ~]# showmount -e 172.16.16.188 |
②手动挂载NFS共享目录
1 >[root@Centos2 ~]# mount 172.16.16.188:/wwwroot /var/www/html/mount.nfs: /var/www/html is busy or already mounted
[root@Centos2 ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/vg_centos1-lv_root 47066056 4228644 40446580 10% /
tmpfs 957760 72 957688 1% /dev/shm
/dev/sda1 495844 39947 430297 9% /boot
/dev/sr0 4363088 4363088 0 100% /media
172.16.16.188:/wwwroot 47066112 4228608 40446720 10% /var/www/html
//已成功挂载
③设置fstab自动挂载
1 | Echo “172.16.16.188:/wwwroot /var/www/html nfs defaults,_netdev 0 0” >> /etc/fstab |
4.1.4 在web2(Real Server2)中挂载NFS共享资源
(步骤跟web1是一样的)
④添加网页测试文件
1 | [root@centos3 ~]# echo "www.benet.com" > /var/www/html/index.html |
因为NFS共享存储就是为了实现内容同步,所以只要主机有共享存储的写入权限,那么写入的index.html测试文件,会立刻同步到服务器的/wwwroot目录下。
4.1.5 在客户机上测试集群效果
那怎么才能知道集群有没有生效呢?
在LVS上用命令查看
1 | [root@Centos1 network-scripts]# ipvsadm -ln |
4.2 配置IP隧道(IP Tunnel)模式(LVS—TUN)
★ TUNNEL 模式必须在所有的realserver 机器上面绑定VIP的IP地址
★ TUNNEL 模式的vip ——>realserver 的包通信通过TUNNEL 模式,不管是内网和外网都能通信,所以不需要lvs vip跟realserver 在同一个网段内,但是服务器必须可以通达外网!
★ TUNNEL 模式 realserver会把packet 直接发给client 不会给director了
★ TUNNEL 模式走的隧道模式,所以运维起来比较难,所以一般不用
4.2.1 配置负载调度器
①加载ip_vs模块
1 | [root@centos1 ~]# modprobe ip_vs |
②安装ipvsadm管理工具
1 | [root@centos1 ~]# rpm -ivh /media/Packages/ipvsadm-1.26-2.el6.x86_64.rpm |
③配置IP地址,网关,DNS
1 | [root@centos1 ~]# cd /etc/sysconfig/network-scripts/ |
④配置虚拟IP地址(VIP)
1 | [root@Centos1 network-scripts]# vim ifcfg-eth0:0 |
⑤启用路由模式
1 | [root@centos1 ~]# vim /etc/sysctl.conf |
⑥配置负载分配策略
1 | [root@centos1 ~]# ipvsadm -A -t 172.16.16.172:80 -s rr |
⑦查看集群节点状态
1 | [root@centos1 ~]# ipvsadm –ln |
上述输出结果中,Forward列下的Tunnel对应IP隧道(IP Tunel),表示采用的集群模式为TUN;如果是Route,则表示采用的集群模式为DR;如果是Masq,则表示采用的集群模式为NAT模式。
⑧关闭防火墙(LVS跟防火墙有冲突会导致访问失败,需要关闭防火墙)
1 | [root@Centos1 ~]# service iptables stop |
4.2.2 配置NFS共享存储服务
①安装nfs-utils rpcbind软件包
1 | [root@centos4 ~]# yum install –y nfs-utils rpcbind |
②设置共享目录
1 | [root@centos4 ~]# mkdir /wwwroot |
其中客户机地址可以是主机名,IP地址,网段地址,允许使用*,?通配符;权限选项中的rw表示允许读写(ro为只读),sync表示同步写入,no_root_squash表示当客户机以root身份访问时赋予本地root权限(默认是root_squash,将作为nfsnobdy用户降权对待)。
③启动NFS服务程序
1 | [root@centos4 ~]# service rpcbind start |
注意:一定要先启动rpcbind然后才能启动nfs 否则nfs服务将启动失败。
④查看本机发布的NFS共享目录
1 | [root@centos4 ~]# showmount -e |
⑤挂载之前记得关闭防火墙
1 | [root@centos4 ~]# service iptables stop |
4.2.3 配置 web1(Real Server1)节点服务器
①配置IP地址
1 | [root@Centos2 ~]]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 |
②加载ipip模块
1 | [root@Centos2 ~]# modprobe ipip |
在加载好 ipip 模块后就会有默认的 tunl0 隧道。 注,如果没有在此处手动加载,那么使用 ifconfig tunl0 配置IP时,会自动加载 ipip 隧道模块。使用ifconfig tunl0或者ifconfig -a 可以查看关于tunl0的配置相关,使用ifconfig直接去查看是没有的
1 | [root@Centos2 ~]# ifconfig tunl0 |
③配置虚拟IP地址(VIP)
1 | [root@Centos2 ~]# cd /etc/sysconfig/network-scripts/ |
④调整/proc响应参数
1 | [root@Centos2 network-scripts]# echo 0 > /proc/sys/net/ipv4/ip_forward |
或者使用下面的方法:(上面的方法一般在使用脚本的时候,会去这样写)
1 | [root@Centos2 network-scripts]# vim /etc/sysctl.conf |
⑤安装rpcbind软件包,并启动rpcbind服务
若要正常访问NFS共享资源,客户机中也需要安装rpcbind软件包,并ynfcrpcbind系统服务别外,为了使用showmount查询工具,建议将nfs-utils软件包也一并将上。
1 | [root@Centos2 ~]# yum install –y rpcbind nfs-utils |
如果已经安装了nfs-utils软件包,则客户机可以使用showmount查看NFS服务器的共享目录
1 | [root@Centos2 ~]# showmount -e 172.16.16.188 |
⑥手动挂载NFS共享目录
1
2
3 [root@Centos2 ~]# mount 172.16.16.188:/wwwroot /var/www/html/
mount.nfs: /var/www/html is busy or already mounted
[root@Centos2 ~]# dfFilesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/vg_centos1-lv_root 47066056 4228644 40446580 10% /
tmpfs 957760 72 957688 1% /dev/shm
/dev/sda1 495844 39947 430297 9% /boot
/dev/sr0 4363088 4363088 0 100% /media
172.16.16.188:/wwwroot 47066112 4228608 40446720 10% /var/www/html
//已成功挂载
⑦设置fstab开机自动挂载
1 | echo “172.16.16.188:/wwwroot /var/www/html nfs defaults,_netdev 0 0” >> /etc/fstab |
⑧最后记得关闭防火墙
1 | [root@centos3 network-scripts]# service iptables stop |
4.2.4 配置 web2(Real Server2)节点服务器
(步骤跟web1是一样的)
⑦添加网页测试文件
1 | [root@centos3 ~]# echo "www.benet.com" > /var/www/html/index.html |
因为NFS共享存储就是为了实现内容同步,所以只要主机有共享存储的写入权限,那么写入的index.html测试文件,会立刻同步到服务器的/wwwroot目录下。
4.2.5 在客户机上测试集群效果
那怎么才能知道集群有没有生效呢?
在LVS上用命令查看
1 | [root@Centos1 network-scripts]# ipvsadm -ln |
4.3 配置直接路由模式(LVS—DR)
实验环境:
4.3.1 配置负载调度器
①加载ip_vs模块
1 | [root@centos1 ~]# modprobe ip_vs |
②安装ipvsadm管理工具
1 | [root@centos1 ~]# rpm -ivh /media/Packages/ipvsadm-1.26-2.el6.x86_64.rpm |
③配置IP地址
1 | [root@centos1 ~]# cd /etc/sysconfig/network-scripts/ |
//添加以上5行内容,橙色为行号
1 | [root@centos1 network-scripts]# ifup eth0:0 |
④调整/proc响应参数
对于DR集群模式来说,由于LVS负载调度器和各节点需要共用VIP地址,应该关闭Linux内核的重定向参数响应。
1 | [root@centos1 ~]# vim /etc/sysctl.conf |
//在任意位置添加以上3行
1 | [root@centos1 ~]# sysctl -p |
⑤配置负载分配策略
1 | [root@centos1 ~]# ipvsadm -A -t 172.16.16.172:80 -s rr |
⑥查看集群节点状态
1 | [root@centos1 ~]# ipvsadm -ln |
上述输出结果中,Forward列下的Route对应模式为DR,表示采用的集群模式为DR;如果是Masq,则表示采用的集群模式为NAT;如果是Tunnel,则表示采用的集群模式为TUN模式。
⑦关闭防火墙(LVS跟防火墙有冲突会导致访问失败,需要关闭防火墙)
1 | [root@Centos1 ~]# service iptables stop |
4.3.2 配置NFS共享存储服务
①安装nfs-utils rpcbind软件包
1 | [root@centos4 ~]# yum install –y nfs-utils rpcbind |
②设置共享目录
1 | [root@centos4 ~]# mkdir /wwwroot |
其中客户机地址可以是主机名,IP地址,网段地址,允许使用*,?通配符;权限选项中的rw表示允许读写(ro为只读),sync表示同步写入,no_root_squash表示当客户机以root身份访问时赋予本地root权限(默认是root_squash,将作为nfsnobdy用户降权对待)。
③启动NFS服务程序
1 | [root@centos4 ~]# service rpcbind start |
注意:一定要先启动rpcbind然后才能启动nfs 否则nfs服务将启动失败。
④查看本机发布的NFS共享目录
1 | [root@centos4 ~]# showmount -e |
⑤挂载之前记得关闭防火墙
1 | [root@centos4 ~]# service iptables stop |
4.3.3 配置 web1(Real Server1)节点服务器
①安装rpcbind软件包,并启动rpcbind服务
若要正常访问NFS共享资源,客户机中也需要安装rpcbind软件包,并ynfcrpcbind系统服务别外,为了使用showmount查询工具,建议将nfs-utils软件包也一并将上。
1 | [root@Centos2 ~]# yum install –y rpcbind nfs-utils |
如果已经安装了nfs-utils软件包,则客户机可以使用showmount查看NFS服务器的共享目录
1 | [root@Centos2 ~]# showmount -e 172.16.16.188 |
②手动挂载NFS共享目录
1
2
3 [root@Centos2 ~]# mount 172.16.16.188:/wwwroot /var/www/html/
mount.nfs: /var/www/html is busy or already mounted
[root@Centos2 ~]# dfFilesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/vg_centos1-lv_root 47066056 4228644 40446580 10% /
tmpfs 957760 72 957688 1% /dev/shm
/dev/sda1 495844 39947 430297 9% /boot
/dev/sr0 4363088 4363088 0 100% /media
172.16.16.188:/wwwroot 47066112 4228608 40446720 10% /var/www/html
//已成功挂载
③设置fstab开机自动挂载
1 | echo “172.16.16.188:/wwwroot /var/www/html nfs defaults,_netdev 0 0” >> /etc/fstab |
④配置虚拟IP地址(VIP)
1 | [root@centos2 ~]# cd /etc/sysconfig/network-scripts/ |
⑤调整/proc响应参数
1 | [root@centos2 network-scripts]# vim /etc/sysctl.conf |
//在任意位置添加以上4行内容
1 | [root@centos2 network-scripts]# sysctl -p |
⑥最后记得关闭防火墙
1 | [root@centos3 network-scripts]# service iptables stop |
4.3.4 配置 web2(Real Server)节点服务器
(步骤跟web1是一样的)
⑦添加网页测试文件
1 | [root@centos3 ~]# echo "www.benet.com" > /var/www/html/index.html |
因为NFS共享存储就是为了实现内容同步,所以只要主机有共享存储的写入权限,那么写入的index.html测试文件,会立刻同步到服务器的/wwwroot目录下。
4.3.5 在客户机上测试集群效果
那怎么才能知道集群有没有生效呢?
在LVS上用命令查看
1 | [root@Centos1 network-scripts]# ipvsadm -ln |