Linux集群
集群概述
集群是一组协同工作的服务器,各有分工,但是对外表现为一个整体
单机模式成本低,时间长,效率低下,稳定性低,有性能极限,无法突破
集群模式成本高,效率高(1+1>2),适合大型业务,单机器宕机业务不中断
普通的单台服务器一般可以承受10万PV(点击量)的并发访问
集群分类
- 负载均衡集群LBC:有人负责指挥分配任务,有人负责工作,典型的是Web服务器。负责管理的是负载均衡服务器,可以是一个服务器实体,也可以是一个LVS软件模拟
- 高可用(故障转移)集群HAC:主服务器挂了后,备用服务器会自动切换过来继续承担主服务器的服务。主备服务器会通过keepalive模块进行检测(心跳线),主挂掉后备自动启动。当备份服务器启动后,如果有自动断电机,会自动切断主服务器电源,防止备份服务器误判,主备同时开启。
- 高性能科学计算集群HPC:整合网络上有空闲资源的计算机,进行科学计算
负载均衡集群
负载均衡工作模式
用户访问负载均衡服务器,负载均衡服务器将请求转发到业务服务器
-
常见的负载均衡服务器软件有:LVS(工作在7层模型的传输层),Nginx(工作在7层模型的应用层),Haproxy
-
常见的负载均衡服务器硬件叫:F5(工作在7层模型的数据链路层)
LVS在网络传输层工作原理
LVS工作在7层模型的传输层,也就是在五层模型传输而后数据网络层之间
用户与LVS服务器都工作在公网上,Apache服务器工作在内网上
用户发送请求到LVS服务器,LVS收到socket,上面有双方IP,LVS收到请求后使用规则库,将目标IP从自己的公网IP改为某个服务器的内网IP进行链接
精度低,负载大,可用于B/S与C/S架构
Nginx网络应用层工作原理
用户发起请求到Nginx,Nginx根据用户请求类型,重新与服务器建立TCP链接发送请求
相当于LVS是收到一个包裹,直接根据规则修改目的地,继续发送,但是Nginx是收到包裹,拆开,然后重新打单,做一个全新的链接,这是因为Nginx是工作在应用层的,所以LVS的负载均衡能力可能达到Nginx的几百倍,但是得益于此,Nginx可以对不同请求智能判断类型,转发到不同服务器
精度高,负载小,只能应用于B/S服务
LVS在系统中工作方式
操作系统可以分为内核空间和用户空间,用户空间安装了用户需要的程序,内核空间只有内核,LVS需要两个部分的程序:IPVS和IPVSadmin,其中IPVS工作在内核空间实现了OSI模型的部分功能,IPVSadmin工作在用户空间,实现了对IPVS的修改,LVS目前在用的有三种模式:NAT,TUN,DR模式,第四种模式目前正在开发
-
NAT模式:
负载均衡服务器和用户在公网,服务器在内网
用户访问网站时访问到了负载均衡服务器的外网卡,LVS分配服务器,使用DNAT目标地址端口转换,通过内网网卡链接到服务器
服务器发送对象的时候发送到负载均衡服务器(否则用户看到源地址不对不收),LVS使用SNAT源地址端口转换,修改socket的源地址为自己的外网IP,转发回去
特点是
- 来回都要负载均衡服务器
- 负载均衡服务器一定程度扮演了网关的作用
- 支持端口映射
-
TUN模式:
服务器,负载均衡服务器,用户都在外网,但是负载均衡服务器和工作服务器不在一个广播域
用户发送请求到负载均衡服务器,负载均衡服务器不修改目标IP,而是在数据包外面重封装了一个数据包,源IP是用户的,目标IP是真实服务器的
真实服务器去掉包装,处理数据,使用内层的目标IP(负载均衡服务器IP)作为源IP,使用内层的源IP(用户IP)作为目标IP,发送回应对象
特定是:
- 两次借用公网IP,速度慢
- 压力大
-
DR模式[负载能力最高]:
服务器,负载均衡服务器,用户都在外网,但是负载均衡服务器和工作服务器在一个广播域,也就是负载均衡服务器和工作服务器是同级别的
用户发起请求到负载均衡服务器,负载服务器转发到真实服务器,这次转发与NAT不同的是这次转发没有修改请求的目标IP,而是修改了请求的目标mac,由于负载均衡服务器和工作服务器是字啊一个广播域的,交换机可以通过MAC对请求进行转发,正常情况下,服务器收到了这个包,发现mac是自己的,但是IP不是自己的,不会收,但是我们在服务器上多设置了一个IP,IP地址与负载均衡服务器是一样的,于是服务器就会收下,但是这个IP是不能暴露的,只能用于通过MAC收到数据包验证用,否则就IP冲突了,于是我们需要把IP隐藏起来,
返回文件的时候,服务器不经过负载均衡服务器,直接用隐藏的IP发送数据包,客户机看到双方IP与端口都是对的,于是接受。
特点是:
-
由于负载均衡服务器转发使用的是MAC,所以必须在一个广播域
-
真实服务器回应无需负载均衡服务器(高并发原因)
-
不支持端口映射(根本就没有触碰到传输层)
-
-
TUN和DR的区别就是DR的机器都在一个广播域,可以通过修改MAC的方式实现数据包的转发,但是TUN不再一个广播域,就必须改IP,最后两者返回数据的方式都是将IP改为负载服务器IP返回的
实验环境配置
-
物理机安装Chrome,由于浏览器缓存,可能无法明显感知服务器的切换,安装后使用无痕模式可以解决这个问题
-
6台CentOS7 BaseServer 服务器
-
1台CentOS7 GUI 桌面服务器
-
关闭防火墙 SELinux
-
网络选择仅主机(Host-Only)
配置网卡地址10.10.10.01/24
关闭DHCP服务器
虚拟机IP从10.10.10.11开始命名
-
虚拟机配置双网卡 全部是HostOnly==?==
-
1G内存
-
配置6台机器为静态IP
vim /etc/sysconfig/network-scripts/ifcfg-enp0s3 # 修改 BOOTPROTO="static" IPADDR=10.10.10.11 NETMASK=255.255.255.0 systemctl restart network.service使用物理机ssh尝试连接
-
配置本地yum源
mkdir /mnt/cdrom mount -t iso9660 /dev/cdrom /mnt/cdrom/ cd /etc/yum.repos.d/ mkdir ./CentBak mv *.repo CentBak/ cp ./CentBak/CentOS-Media.repo ./ vim CentOS-Media.repo baseurl=file:///media/CentOS/ file:///media/cdrom/ file:///media/cdrecorder/ gpgcheck=1 enabled=0 # 改为 baseurl=file:///mnt/cdrom # 改路径 gpgcheck=0 # 不检查gpg enabled=1 # 启动 yum clean all && yum makecache yum install gcc gcc-c++ lrzsz # 安装编译器 文件上传工具(如果是xshell)
LVS-DR模式构建
需要三台虚拟机:
- 机器C:客户机 物理机 192.168.177.162
- 机器D:负载均衡服务器 虚拟机1 网卡1(enpxxx):10.10.10.11 网卡1(enpxxx)浮动:10.10.10.100
- 机器RS1:服务器1 虚拟机2 网卡1(enpxxx):10.10.10.12 网卡0(lo)浮动:10.10.10.100
- 机器RS2:服务器2 虚拟机3 网卡1(enpxxx)10.10.10.13 网卡0(lo)浮动:10.10.10.100
原理
-
物理机C访问负载均衡服务器D网卡2 10.10.10.100
-
负载均衡服务器D进行负载均衡计算,修改DMAC,用网卡1 10.10.10.11 发到广播域
-
其他服务器修改lo卡 为10.10.10.100,接受数据报文
ARP 通讯行为
ARP响应级别(arp-ignore):数据报文到达网口后是否响应
-
0级别(默认):只要收到了本机配置的IP就响应
-
1级别:只有发送到了接受网卡的IP上才响应
例如负载均衡服务器D有10.10.10.11 和 10.10.10.100 两张卡,10.10.10.11卡收到了一个发给10.10.10.100卡的报文,如果是0级别,发现本机有10.10.10.100 于是会手下,如果是1级别,发现不是本卡IP10.10.10.11就不接受
ARP通告级别:
- 0级别:将本机上的所有的网络接口地址都进行通告(例如网卡上电后会向网络中中广播自己的地址)
- 1级别:尽可能避免0的情况,倾向于2,但是不保证,尽量仅向该网卡回应与该网段匹配的ARP报文
- 2级别:只向网络中通告自己的IP,MAC
这样,我们将配置修改为1,2,这样实际服务器的网卡2lo 不会主动接受发给10.10.10.12的消息,也不往外说
负载均衡服务器操作
-
关闭所有虚拟机的
NetworkManager[root@C7B1 ~]# systemctl stop NetworkManager [root@C7B1 ~]# systemctl disable NetworkManager这个服务主要是负责Linux的无线网络服务和危险网络策略的关闭,我们需要关闭这个服务,注意:服务名区分大小写
-
开启网卡的子接口:也就是一块网卡两个IP地址
[root@C7B1 network-scripts]# cp ifcfg-enp0s3 ifcfg-enp0s3:0 [root@C7B1 network-scripts]# vim !$ # !$ 上一条命令最后一个参数修改复制过去的配置文件
- IPADDR=10.10.10.11 + IPADDR=10.10.10.100 - DEVICE="enp0s3" + DEVICE="enp0s3:0" - NAME="enp0s3" - UUID="9b24b2da-f8e2-45c9-81dd-e3b364066858"重启网络服务
[root@C7B1 network-scripts]# systemctl restart network这里复制的接口IP相当于是浮动IP,可以认为原来的IP是绝对IP,浮动IP通常是一个公开的、可以路由到的IP地址,并且不会自动分配给实体设备。项目管理者临时分配动态IP到一个或者多个实体设备。这个实体设备有自动分配的静态IP用于内部网间设备的通讯。这个内部网使用私有地址,这些私有地址不能被路由到。通过浮动IP内网实体的服务才能被外网识别和访问。在一个配置好浮点IP的切换场景是,IP地址飘到网络中的另一台设备。新设备无延迟的接替当掉的设备,并对外提供服务。
-
修改内核文件
/etc/sysctl.conf设置ARP关闭网卡的广播,这是一个优化功能,不强制要求,追加net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.enp0s3.send_redirects = 0sysctl -p刷新内核 -
安装ipvsadm
yum install ipvsadm -
将ipvs加入到系统内核
modprobe ip_vs -
配置IPVS
ipvsadm命令用来添加LVS规则-A添加一个集群-a添加集群的节点-ttcp协议-s算法
ipvsadm -A -t 10.10.10.100:80 -s rr # 轮询 ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.12:80 -g ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.13:80 -g保存配置的规则
ipvsadm -S > /etc/sysconfig/ipvsadm
真实服务器的操作
-
启动Apache用于测试,写一个网页用来标识
[root@C7B2 ~]# systemctl start httpd [root@C7B2
本文详细介绍了Linux集群的构建,包括负载均衡集群和高可用集群的原理及实践。重点讲解了LVS的NAT、TUN、DR三种工作模式,以及KeepAlived在高可用集群中的应用。此外,还探讨了Nginx结合HeartBeat实现高可用的方案,以及多级负载的部署策略。内容深入浅出,适合运维人员和系统管理员学习。
最低0.47元/天 解锁文章

1066

被折叠的 条评论
为什么被折叠?



