大型网站高并发解决方案——集群

大型网站高并发解决方案——集群

前言

LVSLinux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士(阿里巴巴副总裁)成立,是中国国内最早出现的自由软件项目之一。

一、集群

由多台主机构成,但对外只表现为一个整体,只提供一个访问入口(域名与P地址),相当于一台大型计算机。

在互联网应用中,随着站点对硬件性能、响应速度、服务稳定性、数据可靠性等要求越来越高,单台服务器已经无法满足负载均衡及高可用的要求,那么如何解决这个问题呢?

这时候就可以使用普通服务器构建服务集群:通过整合多台服务器,使用集群来达到服务器的高可用、高性能和负载均衡。

1.集群的分类

根据集群所针对的目标差异,可以分为三中类型:

• 负载均衡集群(LB)

• 高可用集群(HA)

• 高性能运算集群(HPC)

2.负载均衡集群(LB)

负载均衡(增加处理能力),有高可用能力,但不是高可用集群负载均衡集群,是以提高服务的并发处理能为根本着眼点。提高应用系统的响应能力、尽可能处理更多的访问请求、减少延迟为目标,获得高并发、高负载(LB)的整体性能。LB的负载分配依赖于主节点的分流算法(访问请求分担给多个服务器节点,从而缓解整个系统的负载压力。例如,DNS轮询、反向代理等)。

扫描二维码关注公众号,回复: 14483394 查看本文章

(1)负载均衡集群结构

第一层:负载调度器(Load Balancer或Director)

访问整个群集系统的唯一入口,对外使用所有服务器共有的VP地址,也称为群集P地址。通常会配置主、备两台调度器实现热备份,当主调度器失效以后能够平滑替换至备用调度器,确保高可用性。

第二层,服务器池(Server Pool)

群集所提供的应用服务、由服务器池承担,其中每个节点具有独立的RIP地址(真实IP),只处理调度器分发过来的客户机请求。当某个节点暂时失效时,负载调度器的容错机制会将其隔离,等待错误排除以后再重新纳入服务器池。

第三层,共享存储(Share Storage)

为服务器池中的所有节点提供稳定、一致的文件存取服务,确保整个群集的统一性。共享存储可以使用NAS设备,或者提供NFS共享服务的专用服务器。

(2)负载均衡设备分类

软件负载均衡设备

LVS:是由中国人张文松研发的(阿里巴巴副总裁)根据用户请求的IP与端口号,实现将用户的请求分发至不同的主机。

nginx:是由俄罗斯人开发的,主要功能是针对http,smtp,pop3,imap等协议实现负载均衡。

haproxy:主要功能是针对http协议实现负载均衡,也可以实现tcp(mysql,smtp)等协议的负载均衡。

三者的对比:

LVS基于Linux操作系统内核实现软负载均衡,而HAproxy和Nginx是基于第三方应用实现的软负载均衡:

LVS是可实现4层的IP负载均衡技术,无法实现基于目录、URL的转发。而HAproxy和Nginx都可以实现4层和7层技术,HAproxy可提供TCP和HTTP应用的负载均衡综合解决方案。

LVS因为工作在ISO模型的第四层,其状态监测功能单一,而HAproxy在状态监测方面功能更丰富、强大,可支持端口、URL、脚本等多种状态检测方式。HAproxy功能强大,但整体性能低于4层模式的LVS负载均衡。

●Nginx主要用于Web服务器或缓存服务器。Nginx的upstream模块虽然也支持群集功能,但是对群集节点健康检查功能不强,性能没有Haproxy好。

硬件负载均衡设备

F5: BIG IP——型号:F5 BIG-IP-1500,F5 BIG-IP LTM8800;价格:20W~100W

深信服

A10

绿盟,360,天融信,启明等。

3.高可用集群(HA)

提高应用系统的可靠性、尽可能地减少中断时间为目标,确保服务的连续性,达到高可用(HA)的容错效果,HA的工作方式包括双工和主从两种模式。

典型的高可用集群:keepalive

4.高性能运算集群(HPC)

提高应用系统的CPU运算速度、扩展硬件资源和分析能力为目标,获得
相当于大型、超级计算机的高性能运算(HPC)能力。

高性能依赖于“分布式运算”、“并行计算”,通过专用硬件和软件将多个服务器的CPU、内存等资源整合在一起,实现只有大型、超级计算机才具备的计算能力。

平时所说的超级计算机就是高性能计算集群,查看每秒钟浮点运算的能力
运用到的名词:

向量机:尽可能向上进行扩展,如果CPU过多,在架构上纵然会有问题的

并行处理集群:包括两部分

1、分布式文件系统

2、将大任务切割为小任务,分别进行处理的机制

例如nadoop就是并行处理集群

二、LVS负载均衡集群工作模式

负载均衡群集是目前企业用得最多的群集类型,群集的负载调度技术有四种工作模式。

1.LVS-NAT转发模式

①客户端将请求发往前端的负载均衡器,请求报文源地址是CIP(客户端IP),后面统称为CIP),目标地址为VIP(负载均衡器前端地址,后面统称为VIP)。

②负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的目标地址改为了后端服务器的IP地址并将报文根据算法发送出去。

③报文送到Real Server后,由于报文的目标地址是自己,所以会响应该请求,并将响应报文返还给LVS。

④然后lvs将此报文的源地址修改为本机并发送给客户端。

注意在NAT模式中,Real Server的网关必须指向LVS,否则报文无法送达客户端。

LVS-NAT部署

1.首先准备集群中的设备

LVS敷在调度器:ens33:192.168.222.128, ens37:20.0.0.128
节点服务器1:192.168.222.52;节点服务器2:192.168.222.54
NFS服务器:192.168.222.56;客户端:20.0.0.100

2.LVS的管理工具是ipvsadm

ipvsadm工具选项说明

选项 说明
-A 添加虚拟服务器
-D 删除整个虚拟服务器
-s 指定负载调度算法(轮询:rr、加权轮询:wrr、最少连接:lc、加权最少连接:wlc)
-a 表示添加真实服务器(节点服务器)
-d 删除某一个节点
-t 指定VIP地址及TCP端口
-r 指定RIP地址及TCP端口
-m 表示使用NAT模式
-g 表示使用DR模式
-i 表示使用TUN模式
-w 设置权重(权重为0时表示暂停节点)
-p 60 表示保持长链接60秒
-l 列表查看LVS虚拟服务器(默认为查看所有)
-n 以数字形式显示地址、端口等信息,常与“-l”选项组合使用。ipvsadm -ln
-C 清除原有策略

3.部署共享存储

[root@NFS ~]# systemctl stop firewalld.service
[root@NFS ~]# systemctl disable firewalld.service
[root@NFS ~]# setenforce 0
[root@NFS ~]# yum install -y nfs-utils rpcbind
[root@NFS ~]# systemctl start nfs.service
[root@NFS ~]# systemctl start rpcbind.service
[root@NFS ~]# systemctl enable nfs.service
[root@NFS ~]# systemctl enable rpcbind.service
[root@NFS ~]# mkdir /opt/a /opt/b
[root@NFS ~]# chmod 777 /opt/a /opt/b/
[root@NFS ~]# echo -e "/opt/a 192,168.222.0/24(rw,sync)\n/opt/b 192.168.222.0/24(rw,sync)" /etc/exports
[root@NFS ~]# exportfs  -rv

4.部署节点服务器

#192.168.222.52、192.168.222.54
[root@http ~]# systemctl stop firewalld
[root@http ~]# systemetl disable tirewalld
[root@http ~]# setenforce 0
[root@http ~]# yum install -y httpd
[root@http ~]# systemetl start httpd
[root@http ~]# mount.nfs 192.168.222.128:/opt/a /var/www/html/
[root@http ~]# echo 'this is a'>/var/www/html/index.html
[root@http ~]# mount -a

5.部署负载调度器lvs

[root@lvs ~]#  echo '1' > /proc/sys/net/ipv4/ip_forward
[root@lvs ~]# iptables -t nat -F
[root@lvs ~]# iptables -F
[root@lvs ~]# iptables -t nat -A POSTROUTING -s 192.168.222.0/24 -o ens37 -j SNAT --to-source 20.0.0.128
#手动加载ipvs模块
[root@lvs ~]# modprobe ip_vs 
[root@lvs ~]# yum install -y ipvsadm
#注意:启动服务前必须保存负载分配策略,否则将会报错
[root@lvs ~]# ipvsadm-save /etc/sysconfig/ipvsadm
[root@lvs ~]# systemctl start ipvsadm
#配置负载分配策略(NAT模式只要在服务器上配置,节点服务器不需要特殊配置)
[root@lvs ~]# ipvsadm -C
[root@lvs ~]# ipvsadm -A -t 20.0.0.128:80 -s rr
[root@lvs ~]# ipvsadm -a -t 20.0.0.128:80 -r 192.168.222.52:80 -m -w 1
[root@lvs ~]# ipvsadm -a -t 20.0.0.128:80 -r 192.168.222.54:80 -m -w 1
[root@lvs ~]# ipvsadm
[root@lvs ~]# ipvsadm-save /etc/sysconfig/ipvsadm

NAT模式的缺点:director很可能成为系统性能瓶颈,所有的请求director都需要处理应答。

2.LVS-IP隧道模式

IP Tunnel,简称TUN模式采用开放式的网络结构,负载调度器仅作为客户机的访问入口,各节点通过各自的Internet连接直接回应客户机,而不再经过负载调度器。服务器节点分散在互联网中的不同位置,具有独立的公网IP地址,通过专用引IP隧道与负载调度器相互通信。

IP TUN模式的缺点:

3.LVS-DR直接路由模式

采用半开放式的网络结构,与TUN模式的结构类似,但各节点并不是分散在各地,而是与调度器位于同一个物理网络负载调度器与各节点服务器通过本地网络连接,不需要建立专用的IP隧道。

LVS—DR模式部署

1.首先准备群集中的设备

负载调度器:192.168.222.128
real server1:192.168.222.54
real server2:192.168.222.52
NFS服务器:192.168.222.56
VIP:192.168.222.180

2.配置负载均衡调度器(192.168.222.128)

[root@DR ~]# systemctl stop firewalld
[root@DR ~]# systemctl disable firewalld
[root@DR ~]# setenforce 0
[root@DR ~]# modprobe ip_vs
[root@DR ~]# yum -y install ipvsadm
#配置VIP地址(192.168.222.180)
[root@DR ~]# cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33:0
[root@DR ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33:0
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.222.180
NETMASK=255.255.255.255
[root@DR ~]# ifup ens33:0
#调整proc响应参数
[root@DR ~]# vim /etc/sysctl.conf
#由于LVS负载调度器和各节点需要共用VIP地址,需要关闭icmp的重定向,不充当路由器
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
[root@DR ~]# sysctl -p
[root@DR ~]# ipvsadm -C
[root@DR ~]# ipvsadm -A -t 192,168,10,180:80 -s rr
[root@DR ~]# ipvsadm -a -t 192.168.10.180:80 -r 192.168.10.16:80 -g
[root@DR ~]# ipvsadm -a -t 192.168.10.180:80 -r 192,168.10.17:80 -g
#查看节点状态,Route代表DR模式
[root@DR ~]# ipvsadm -ln 

3.部署共享存储(NFS服务器:192.168.222.56)

[root@NFS ~]# systemctl stop firewalld
[root@NFS ~]# systemctl disable firewalld
[root@NFS ~]# setenforce 0
[root@NFS ~]# yum -y install nfs-utils rpcbind
[root@NFS ~]# mkdir /mnt/{a,b}
[root@NFS ~]# chmod 777 /mnt/{a,b}
[root@NFS ~]# echo "<h1>this is a</h1>" > /mnt/a/index.html
[root@NFS ~]# echo "<h1>this is b</h1>" > /mnt/b/index.html
[root@NFS ~]# vim /etc/exports
/mnt/a 192.168.222.0/24(rw,sync)
/mnt/b 192.168.222.0/24(rw,sync)
[root@NFS ~]# systemctl start nfs.service
[root@NFS ~]# systemctl start rpcbind.service

4.配置server服务端(192.168.222.54 192.168.222.52)

[root@server ~]# systemctl stop firewalld
[root@server ~]# setenforce 0
#配置虚拟IP地址(VIP:192.168.222.180)
##此地址仅用作发送web响应数据包的源地址,并不需要监听客户机的访问请求(改由调度器监听并分发)。因此使用虚接口lo:0来承载VIP地址,并为本机添加一条路由记录,将访问VIP的数据限制在本地,以避免通信紊乱。
[root@server ~]# cp /etc/sysconfig/network-scripts/ifcfg-lo /etc/sysconfig/network-scripts/ifcfg-lo:0
[root@server ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.222.180
NETMASK=255.255.255.255   #注意子网掩码必须全为11111111
[root@server ~]#  ifup lo:0
[root@server ~]#  echo "/sbin/route add -host 192.168.222.180 dev lo:0"  
[root@server ~]#  chmod +x /etc/rc.d/rc.local
#调整内核的ARP响应参数以阻止更新VIP的MAC地址,避免发生冲突
[root@server ~]# echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore
[root@server ~]# echo "2">/proc/sys/net/ipv4/conf/1o/arp_announce
[root@server ~]# echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore
[root@server ~]# echo "2">/proc/sys/net/ipv4/conf/all/arp_announce
#查看内核的ARP响应参数
[root@server ~]# sysctl -p
[root@server ~]# yum -y install ufs-utils rpcbind httpd
########192.168.222.54########
[root@server1 ~]# mount .nfs 192.168.222.56:/mnt/a /var/www/html
########192.168.222.52########
[root@server2 ~]# mount .nfs 192.168.222.56:/mnt/b /var/www/html

5.测试LVS群集

使用同一台主机访问VIP:192.168.222.180,观察是否能够做到负载均衡。

4.FULL-NAT模式(非主要)

Full-NAT解决的是LVS和RS跨VLAN的问题,而跨VLAN问题解决后,LVS和RS不再存在VLAN上的从属关系,可以做到多个LVS对应多个RS,解决水平扩容的问题。

5.LVS主要的三种工作模式区别

NAT:通过网络地址实现的虚拟服务器,大并发访问时调度器的性能有瓶颈。

DR:使用路由器技术来实现虚拟服务器,节点服务器需要配置VIP,注意MAC地址广播。

TUN:通过隧道的方式来实现虚拟服务器。

三、负载调度算法

1.Fixed Scheduling Method静态调度方法

轮询(Round Robin)

将收到的访问请求按照顺序轮流分配给群集中的各节点(真实服务器)均等地对待每一台服务器,而不管服务器实际的连接数和系统负载。

加权轮询(Weighted Round Robin)

根据调度器设置的权重值来分发请求,权重值高的节点优先获得任务,分配的请求数越多。保证性能强的服务器承担更多的访问流量。

目标地址散列调度(Destination Hashing Scheduling)

"目标地址散列"调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

源地址散列调度(Source Hashing Scheduling)

"源地址散列"调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

2.Dynamic Scheduling Method 动态调度方法

最少连接(Least Connections)

根据真实服务器已建立的连接数进行分配,将收到的访问请求优先分配给连接数最少的节点。

加权最少连接(Weighted Least Connections)

在服务器节点的性能差异较大时,可以为真实服务器自动调整权重,性能较高的节点将承担更大比例的活动连接负载。

四、Haproxy负载均衡集群工作模式

1.haproxy概述

haproxy是一款高性能的负载均衡软件。因为其专注于负载均衡这一些事情,因此与nginx比起来在负载均衡这件事情上做更好,更专业。

而LVS在企业应用中抗负载能力很强,但存在不足,LVS不支持正则处理,不能实现动静分离,对于大型网站,LVS的实施配置复杂,维护成本相对较高。

2.haproxy的特点

• 支持tcp/http两种协议层的负载均衡,使得其负载均衡功能非常丰富。

• 支持8种左右的负载均衡算法,尤其是在http模式时,有许多非常实在的负载均衡算法,适用各种需求。

• 性能非常优秀,基于事件驱动的链接处理模式及单进程处理模式(和Nginx类似)让其性能卓越。

• 拥有一个功能出色的监控页面,实时了解系统的当前状况。

• 功能强大的ACL支持,给用户极大的方便。

3.Haproxy群集搭建

准备设备

Centos7:

haproxy服务器:192.168.222.128

nginx1服务器:192.168.222.52

nginx2服务器 :192.168.222.54

tomcat1服务器:192.168.222.56:8080

Ubuntu22.04:

tomcat2服务器:192.168.222.58:8080

tomcat1

[root@tomcat1 ~]# systemctl stop firewalld
[root@tomcat1 ~]# setenforce 0
[root@tomcat1 ~]# cd /opt
[root@tomcat1 opt]# ls
rh
[root@tomcat1 opt]# rz -E
rz waiting to receive.
[root@tomcat1 opt]# ls
apache-tomcat-9.0.16.tar.gz  jdk-8u201-linux-x64.rpm  rh
[root@tomcat1 opt]# rpm -ivh jdk-8u201-linux-x64.rpm
[root@tomcat1 opt]# vim /etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
#编辑/usr/local/tomcat/conf/server.xml
#在<Host name后改为
<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/ttt" path="" reloadable="true" />

#编辑首页
[root@tomcat1 opt]# mkdir /usr/local/tomcat/webapps/ttt
[root@tomcat1 opt]# echo "aaaa" >/usr/local/tomcat/webapps/ttt/index.html
[root@tomcat1 opt]# source /etc/profile
[root@tomcat1 opt]# java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
[root@tomcat1 opt]# tar zxf apache-tomcat-9.0.16.tar.gz
[root@tomcat1 opt]# mv apache-tomcat-9.0.16 /usr/local/tomcat
[root@tomcat1 opt]# echo 'export TOMCAT_HOME=/usr/local/tomcat'>> /etc/profile
[root@tomcat1 opt]# source /etc/profile
[root@tomcat1 opt]# chown -R root:root  /usr/local/tomcat /usr/java/jdk1.8.0_201-amd64
[root@tomcat1 opt]# /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/java/jdk1.8.0_201-amd64
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.

tomcat2

Ubuntu18.04版本以上没有ifconfig命令所以要先下载net-tools服务:

root@tomcat2:/# apt-get install net-tools
#无法和终端交互
root@tomcat2:/# apt-get autoremove open-vm-tools 
root@tomcat2:/# apt-get install open-vm-tools-desktop
#重启
#无法链接xshell
root@tomcat2:/# apt-get install openssh-server openssh-client 
root@tomcat2:/# lsof -i:22
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd     956 root    3u  IPv4  38136      0t0  TCP *:ssh (LISTEN)
sshd     956 root    4u  IPv6  38138      0t0  TCP *:ssh (LISTEN)
#下载JDK
root@tomcat2:/opt# apt install openjdk-8-jre-headless
root@tomcat2:/opt# java -version
openjdk version "1.8.0_312"
OpenJDK Runtime Environment (build 1.8.0_312-8u312-b07-0ubuntu1-b07)
OpenJDK 64-Bit Server VM (build 25.312-b07, mixed mode)
#下载tomcat
root@tomcat2:/opt# wget https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.81/bin/apache-tomcat-8.5.81.tar.gz
root@tomcat2:/opt# tar zxf apache-tomcat-8.5.81.tar.gz 
root@tomcat2:/opt# mv apache-tomcat-8.5.81 /usr/local/tomcat
root@tomcat2:/opt# ln -s /usr/local/tomcat/bin/*  /usr/local/sbin/
root@tomcat2:/opt# startup.sh start
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
Tomcat started.
root@tomcat2:/usr/local/tomcat/conf# netstat -natp | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      5008/java     
#编辑/usr/local/tomcat/conf/server.xml
#在<Host name后改为
<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/ttt" path="" reloadable="true" />
#编辑首页
root@tomcat2:/opt# mkdir /usr/local/tomcat/webapps/ttt
root@tomcat2:/opt# echo "nbbbbbbb" >/usr/local/tomcat/webapps/ttt/index.html

nginx1

[root@nginx1 opt]# ls
apr-1.6.2.tar.gz       httpd-2.4.25.tar.gz  nginx-1.22.0.tar.gz
apr-util-1.6.0.tar.gz  http.sh              rh
[root@nginx1 opt]# tar zxf nginx-1.22.0.tar.gz 
[root@nginx1 nginx-1.22.0]# useradd -M -s /sbin/nologin nginx
[root@nginx1 local]# yum -y install pcre-devel zlib-devel gcc gcc-c++ make >/dev/null
[root@nginx1 nginx-1.22.0]# ./configure \
> --prefix=/usr/local/nginx \
> --user=nginx \
> --group=nginx \
> --with-http_stub_status_module \
> --with-stream \
> --with-stream_realip_module
[root@nginx1 local]# make && make install
[root@nginx1 nginx-1.22.0]# ln -s /usr/local/nginx/sbin/nginx  /usr/local/sbin/
[root@nginx1 nginx-1.22.0]# nginx
[root@nginx1 nginx-1.22.0]# nginx -v
nginx version: nginx/1.22.0
[root@nginx1 conf]# vim /usr/local/conf/nginx.conf
events {
    worker_connections  1024;
}

stream {
    upstream tcp_proxy{
        server 192.168.222.56:8080 weight=1;
        server 192.168.222.58:8080 weight=1;
    }

    server {
        listen 8080;
        proxy_pass tcp_proxy;
        }
    }

http {
[root@nginx1 conf]# nginx -t
nginx: the configuration file /usr/local/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/conf/nginx.conf test is successful
[root@nginx1 conf]# nginx -s reload

nginx2

同Nginx1

haproxy

[root@haproxy ~]# yum install pcre-devel bzip2-devel gcc gcc-c++ make
[root@haproxy ~]# tar zxf haproxy-1.5.19.tar.gz 
[root@haproxy haproxy-1.5.19]# make TARGET=linux2628 ARCH=x86_64
[root@haproxy haproxy-1.5.19]# make install PREFIX=/usr/local/haproxy
[root@haproxy haproxy-1.5.19]# cd /usr/local
[root@haproxy haproxy-1.5.19]# mkdir /etc/haproxy
[root@haproxy haproxy-1.5.19]# cp examples/haproxy.cfg  /etc/haproxy/
[root@haproxy haproxy-1.5.19]# vim /etc/haproxy/haproxy.cfg 
global		#全局配置,主要用于定义全局参数,属于进程级的配置,通常和操作系统配置有关
        log /dev/log    local0			#修改  local0代表系统默认设备
        log /dev/log    local0 notice	#修改
        #log loghost    local0 info
        maxconn 4096					#最大连接数,需考虑ulimit -n限制,推荐使用10240
        #chroot /usr/share/haproxy
        uid 99							#用户UID
        gid 99							#用户GID
        daemon							#守护进程模式
        nbproc 2						#添加,设置并发进程数,建议与当前服务器CPU核数相等或为其2倍
        #debug
        #quiet

defaults	#引入global定义的日志格式
        log     global					#引入global定义的日志格式
        mode    http					#模式为http(7层代理http,4层代理tcp)
        option  httplog					#日志类别为http日志格式
        option  dontlognull				#不记录健康检查日志信息
        retries 3						#检查节点服务器失败次数,连续达到三次失败,则认为节点不可用
        redispatch						#当服务器负载很高时,自动结束当前队列处理比较久的连接
        maxconn 2000					#最大连接数,“defaults”中的值不能超过“global”段中的定义
        #contimeout     5000			#设置连接超时时间,默认单位是毫秒
        #clitimeout     50000			#设置客户端超时时间,默认单位是毫秒
        #srvtimeout     50000			#设置服务器超时时间,默认单位是毫秒
        timeout http-request 10s		#默认http请求超时时间
        timeout queue 1m				#默认队列超时时间
        timeout connect 10s				#默认连接超时时间,新版本中替代contimeout,该参数向后兼容
        timeout client 1m				#默认客户端超时时间,新版本中替代clitimeout,该参数向后兼容
        timeout server 1m				#默认服务器超时时间,新版本中替代srvtimeout,该参数向后兼容
        timeout http-keep-alive 10s		#默认持久连接超时时间
        timeout check 10s				#设置心跳检查超时时间

#删除下面所有listen项,添加:
listen  webcluster 0.0.0.0:8080		#haproxy实例状态监控部分配置,定义一个名为webcluster的应用
        option httpchk GET /index.jsp	#检查服务器的index.jsp文件
        balance roundrobin				#负载均衡调度算法使用轮询算法roundrobin
        server  inst1 192.168.222.52:8080 check inter 2000 fall 3	#定义在线节点
        server  inst1 192.168.222.54:8080 check inter 2000 fall 3
listen  webcluster 0.0.0.0:80
        option httpchk GET /index.html
        balance roundrobin
        server  inst1 192.168.222.52:80 check inter 2000 fall 3
        server  inst1 192.168.222.54:80 check inter 2000 fall 3
---------------------参数说明---------------------------------------------------------------------------
#轮询算法:roundrobin;最小连接数算法:leastconn;来源访问调度算法:source,类似于nginx的ip_hash

#check inter 2000	表示启用对此后端服务器执行健康检查,设置健康状态检查的时间间隔,单位为毫秒
#fall 3				表示连续三次检测不到心跳频率则认为该节点失效
#若节点配置后带有“backup”表示该节点只是个备份节点,仅在所有在线节点都失效该节点才启用。不携带“backup”,表示为主节点,和其它在线节点共同提供服务。
[root@haproxy haproxy-1.5.19]# cp examples/haproxy.init  /etc/init.d/haproxy
[root@haproxy sbin]# chmod 777 /usr/local/haproxy/sbin/haproxy 
[root@haproxy sbin]# ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/haproxy
[root@haproxy haproxy-1.5.19]# chkconfig --add /etc/init.d/haproxy
[root@haproxy sbin]# systemctl start haproxy
[root@haproxy sbin]# 
Broadcast message from systemd-journald@TTTTTTT (Wed 2022-08-03 20:46:19 CST):

haproxy[11859]: proxy webcluster has no server available!


Broadcast message from systemd-journald@TTTTTTT (Wed 2022-08-03 20:46:19 CST):

haproxy[11859]: proxy webcluster has no server available!


Message from syslogd@TTTTTTT at Aug  3 20:46:19 ...
 haproxy[11859]:proxy webcluster has no server available!

Broadcast message from systemd-journald@TTTTTTT (Wed 2022-08-03 20:46:19 CST):

haproxy[11860]: proxy webcluster has no server available!


Message from syslogd@TTTTTTT at Aug  3 20:46:19 ...
 haproxy[11859]:proxy webcluster has no server available!

Broadcast message from systemd-journald@TTTTTTT (Wed 2022-08-03 20:46:19 CST):

haproxy[11860]: proxy webcluster has no server available!


Message from syslogd@TTTTTTT at Aug  3 20:46:19 ...
 haproxy[11860]:proxy webcluster has no server available!

Message from syslogd@TTTTTTT at Aug  3 20:46:19 ...
 haproxy[11860]:proxy webcluster has no server available!

测试

五、Keepalive高可用集群

1.keepalive是什么?

企业应用中,单台服务器承担应用存在单点故障的危险,单点故障一旦发生,企业服务将发生中断,造成极大的危害。

keepalived就是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。它是专为LVS和HA设计的一款健康检查工具。支持故障自动切换(Failover);支持节点健康状态检查(Health Checking)。

官方网站:http:www.keepalived.org/

2.keepalive的工作原理

keepalived是VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。

将N台提供相同功能的服务器组成一个服务器组,这个组里面有一个master和多个backup,master.面有一个对外提供服务的vip(该服务器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。

3.VRRP协议

虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的ip(该路由器所在局域网内其他机器的默认路由/网关为该vip),master会发组播,当backup收不到vrrp包时就认为master岩掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。

4.keepalive主要模块

keepalive主要由三个模块,分别是core、check和vrrp。

• core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。

• check负责健康检查,包括常见的各种检查方式。

• vrrp模块是来实现VRRP协议的。

5.脑裂

Keepalived的BACKUP主机在收不到MASTER主机报文后就会切换成为master,如果是它们之间的通信线路出现问题,无法接收到彼此的组播通知,但是两个节点实际都处于正常工作状态,这时两个节点均为master强行绑定虚拟IP,导致不可预料的后果,这就是脑裂。

一般来说,裂脑的发生,有以下几种原因:

• 高可用服务器对之间心黜线辩路发生故障,导致无法正常通信。

• 因心跳线坏了(包括断了,老化)。

• 因网卡及相关驱动坏了,配置及冲突问题(网卡直连)。

• 因心跳线间连接的设备故障(网卡及交换机)。

• 因仲裁的机器出问题(采用仲裁的方案)

• 高可用服务器上开启了iptables防火墙阻挡了心跳消息传输。

• 高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败。

• 其他服务配置不当等原因,如心跳方式不同,心跳广播冲突、软件Bug等。

那么如何解决脑裂的问题呢?

①添加更多的检测手段,比如冗余的心跳线(两块网卡做健康监测),ping对方等等。尽量减少“裂脑"发生机会(指标不治本,只是提高了检测到的概率)

②设置仲裁机制。两方都不可靠,那就依赖第三方。比如启用共享磁盘锁,ping网关等。(针对不同的手段还需具体分析)

③算法保证,比如采用投票机制(keepalived没有实现)

其他的高可用方案

heartbeat、pacemaker、piranha(web页面)

6.Keepalive集群配置

Keepalived配置目录位于etc/keepalived,其中keepalived.conf是主配置文件

● global_defs{…}区段指定全局参数

● vrrp_instance实例名称{…}区段指定VRRP热备参数

● 注释文字以"!"符号开头

● 目录samples,提供了许多配置样例作为参考

配置keepalive在主、备DR服务器上都要设置。

yum -y install ipvsadm keepalived
modprobe ip_vs
vim /etc/keepalived/keepalived.conf
#定义全局参数
global defs {
    
     
#10行修改,邮件服务指向本地
	smtp_server 127.0.0.1
#12行修改,指定服务器(路由器)的名称,主备服务器名称须不同,主为LVS_01,备为LVS_02
	router_id LVS_01
#14行注释掉,取消严格遵守VRRP协议功能,否则VIP无法被连接
	#vrrp_strict
}
#定义VRRP热备实例参数
	vrrp instance VI_1 {
    
    
#20行修改,指定热备状态,主为MASTER,备为BACKUP
	state MASTER
#21行修改,指定承载vip地址的物理接口
	interface ens33
#22行修改,指定虚拟路由器的ID号,每个热备组保持一致
	virtual_router_id 10
	#nopreempt
#如果设置非抢占模式,两个节点state必须为bakcup,并加上配置nopreempt
#23行修改,指定优先级,数值越大优先级越高,这里设置主为100,备为90
	priority 100
	advert_int 1			#通告间隔秒数(心跳频率)
	authentication {
    
    	 	#定义认证信息,每个热备组保持一致
		auth_type PASS		#认证类型
#27行修改,指定验证密码,主备服务器保持一致
		auth pass abc123
	}
	virtual ipaddress {
    
      	#指定群集vip地址
		192.168.222.180
	}
}
#36行修改,指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和web服务器池参数
virtua1_server192.168.222.180 80 {
    
    
	delay_loop 6			#健康检查的间隔时间(秒)
	lb_algo rr				#指定调度算法,轮询(xx)
#39行修改,指定群集工作模式,直接路由(DR)
	lb_kind DR
	persistence_timeout 50	#连接保持时间(秒)
	protocol TCP			#应用服务采用的是TCP协议
#43行修改,指定第一个Web节点的地址、端口
	rea1_server 192.168,222.56 80 {
    
     
	weight 1				#节点的权重
#45行删除,添加以下健康检查方式
	TCP_CHECK {
    
    
		connect_port 80		#添加检查的目标端口
		connect_timeout 3	#添加连接超时(秒)
		nb_get_retry 3		#添加重试次数
		delay_before_retry 3#添加重试间隔
	}
}
	rea1_server 192.168.222.57 80 {
    
     #添加第二个web节点的地址、端口
		weight 1
		TCP_CHECK
			connect_port 80
			connect_timeout 3
			nb_get_retry 3
			delay_before_retry 3
		}
	}
#删除后面多余的配置
}
#其他配置与LVS-DR一致

END

猜你喜欢

转载自blog.csdn.net/tu464932199/article/details/126204066