负载均衡与高可用

目录

一、LVS介绍

二、LVS的三种工作模式

1、NAT模式

2、TUN模式

3、DR模式

三、ipvsadm实现Apache负载均衡横

1、调度器(vm1):

 2、真实服务端:RS端(vm2,vm3)

 3、访问(vm4)

4、查看调度器情况

四、keepalive实现DR模式故障检测

五、keepalive实现LVS高可用 

六、负载均衡分层的介绍

1、四层负载均衡

2、七层负载均衡

3、四层与七层区别

七、 NGINX 7层负载均衡

1、nginx部署

2、负载均衡

3、修改nginx服务配置

4、LNMP架构

 Nginx平滑版本升级

 Nginx平滑版本回退

八、 Pacemaker高可用

 1、Pacemaker

 2、实验环境

 3、主机配置免密

 4、配置yum源

 5、安装软件

 6、启动pcsd服务

 7、配置corosync

 8、 启动与校验集群

 9、 创建集群资源

 10、添加nginx服务资源


实验环境

四台主机

vm1(调度器)

vm2(RS)

vm3(RS)

vm4(高可用/访问机)

配置好网络

关闭防护墙

关闭selinux

一、LVS介绍

        LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器,该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器。


        将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实的服务器,但如果真实服务器连接的是相同的存储,提供的服务也是相同的服务,最终用户不管是访问哪台真实服务器,得到的服务内容都是一样的。


        LVS工作模式分为NAT模式、TUN模式、以及DR模式

二、LVS的三种工作模式


1、NAT模式

 通过网络地址转换的方式来实现调度
(1)首先调度器(LB)接收到客户的请求数据包时(请求的目的IP为VIP),根据调度算法决定将请求发送给哪个后端的真实服务器(RS)。
(2)接着调度把客户端发送的请求数据包的目标IP地址及端口改成后端真实服务器的IP地址(RIP),真实服务器(RS)就可以接收到客户的请求数据包了。
(3)真实服务器响应完请求后,查看默认路由(NAT模式下需要将RS的默认路由设置为LB服务器),把响应后的数据包再发送给LB。
(4)LB接收到响应包后,把包的源地址改为虚拟地址(VIP),然后再发送回客户端。

整体流程:Client > VS > RS > VS > Client
当数据流进入VS时,做了一次DNAT,从VS出去时做了一次DNAT

2、TUN模式

 隧道模式
(1)将请求与响应数据分离,让调度器仅处理数据请求,而让真实服务器响应数据包直接返回给客户端。
(2)VS/TUN工作模式拓扑结构如图所示。其中,IP隧道(IP tunning)是一种数据包封装技术,它可以将原始数据包封装并添加新的包头(内容包括新的源地址及端口、目标地址及端口),从而实现将一个目标为调度器的VIP地址的数据包封装,通过隧道转发给后端的真实服务器(Real Server),通过将客户端发往调度器的原始数据包封装,并在其基础上添加新的数据包头(修改目标地址为调度器选择出来的真实服务器的IP地址及对应端口)。

LVS(TUN)模式要求真实服务器可以直接与外部网络连接,真实服务器在收到请求数据包后直接给客户端主机响应数据

3、DR模式

 (1)直接路由模式(DR模式)要求调度器与后端服务器必须在同一个局域网内,VIP地址需要在调度器与后端所有的服务器间共享,因为最终的真实服务器给客户端回应数据包时需要设置源IP为VIP地址,目标IP为客户端IP,这样客户端访问的是调度器的VIP地址,回应的源地址也依然是该VIP地址(真实服务器上的VIP),客户端是感觉不到后端服务器存在的。
(2)由于多台计算机都设置了同样一个VIP地址,所以在直接路由模式中要求调度器的VIP地址是对外可见的,客户端需要将请求数据包发送到调度器主机,而所有的真实服务器的VIP地址必须配置在Non-ARP的网络设备上,也就是该网络设备并不会向外广播自己的MAC及对应的IP地址,真实服务器的VIP对外界是不可见的,但真实服务器却可以接受目标地址VIP的网络请求,并在回应数据包时将源地址设置为该VIP地址。
(3)调度器根据算法在选出真实服务器后,在不修改数据报文的情况下,将数据帧的MAC地址修改为选出的真实服务器的MAC地址,通过交换机将该数据帧发给真实服务器。整个过程中,真实服务器的VIP不需要对外界可见。

整体流程:Client----DR—RS–Client

三、ipvsadm实现Apache负载均衡横

  • 利用DR工作模式和轮询调度算法实现 

1、调度器(vm1):

 vip:192.168.189.100 ,rr:轮询调度算法 

dnf install -y ipvsadm              ##安装lvs管理器
ip a a 192.168.189.100/24 dev ens160   ##添加vip
ipvsadm -A -t 192.168.189.100:80 -s rr  ##添加虚拟服务
ipvsadm -a -t 192.168.189.100:80 -r 192.168.189.112:80 -g  ##将虚拟服务关联到真实服务上
ipvsadm -a -t 192.168.189.100:80 -r 192.168.189.113:80 -g
ipvsadm -ln  ##查看配置信息

 2、真实服务端:RS端(vm2,vm3)

安装测试服务  RS添加vip

dnf install -y httpd
systemctl enable --now httpd
echo vm2 >/var/www/html/index.html
echo vm3 >/var/www/html/index.html
ip a a 192.168.189.100/24 dev ens160

禁用ARP

dnf install arptables -y
arptables -A INPUT -d 192.168.189.100 -j DROP
arptables -A OUTPUT -s 192.168.189.100 -j mangle --mangle-ip-s 192.168.189.113
arptables -nL
arptables-save > /etc/sysconfig/arptables  ##保存策略
systemctl enable arptables    

 3、访问(vm4)

curl 192.168.189.100
for i in {1..10}; do curl 192.168.189.100; done

4、查看调度器情况

四、keepalive实现DR模式故障检测

  • DR模式的缺点是无法发现客户端故障
  • 针对RS服务器出现故障或者调度器单点故障,keepalive的健康检查和失败切换(LVS冗余)可以解决。
  • keepalive中的vrrp协议实现高可用解决单点故障,TCP_CHECK实现对后端RS的健康检测

master配置

清除资源
ip a d 192.168.189.100/24 dev ens160
ipvsadm -C

安装

yum install keepalived.x86_64 -y
cd /etc/keepalived/
vim keepalived.conf

编辑文件:

! Configuration File for keepalived

global_defs {
   notification_email {
        root@localhost   ##设定发送故障邮件到本机
   }
   notification_email_from keepalived@localhost ##邮件来源
   smtp_server 127.0.0.1  ##发送服务器
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict  ##禁用此选项
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {  ##高可用部分
    state MASTER
    interface ens160  ##网卡
    virtual_router_id 51
    priority 100  ###当前主机在此虚拟路径器中的优先级;范围1-254;设置backup优先级需比master优先级低
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.189.100  ##设定vip
    }
}
virtual_server 192.168.189.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    #persistence_timeout 50 ##50秒内同一个客户端请求将会交给同一个后端处理,为观察实验效果,将其注释
    protocol TCP

    real_server 192.168.189.112 80 {  ##RS1
        weight 1
        TCP_CHECK {
          connect_timeout 3
          delay_before_retry 3
            }
        }

    real_server 192.168.189.113 80 {  ##RS2
        weight 1
        TCP_CHECK {
          connect_timeout 3
          delay_before_retry 3
            }
        }

}

启动keepalive服务会自动添加VIP和编写ipvsadm规则

测试keepalived对后端RS的健康检测

systemctl  stop httpd

故障的RS会自动从调度列表中被摘除

ipvsadm -ln

再次启动服务

systemctl  start httpd

恢复的RS会自动添加到调度列表

五、keepalive实现LVS高可用 

由于vm1为LVS策略服务提供者,当vm1出现故障时,将导致访问及负载均衡都无法进行,因此采用高可用方式,双机热备确保LVS稳定性。
高可用描述:
配置一台BACKUP 端vm4,具备与vm1相同LVS策略配置,当vmr1出现故障时,将VIP转移至vm4,并切换vm4为MASTER,继续提供服务。
当vm1恢复正常,再将VIP及MASTER转移至vm1(须设定vm1优先级大于vm4)

1、vm4端安装keepalived,ipvsadm,将vm1的配置文件复制过来,配置keepalived,启动keepalived服务

yum install keepalived -y
yum install ipvsadm -y
cd /etc/keepalived/
scp /etc/keepalived/keepalived.conf vm4:/etc/keepalived/ ##从vm1中复制
vim keepalived.conf
systemctl start keepalived.service

2、查看server4的日志,发现为BACKUP端

 

3、停止vm1的keepalived服务,查看资源是否自动迁移到vm4

 

 4、 启动vm1的keepalived服务 查看资源会回到vm1上

vm4的VIP就会消失

 

六、负载均衡分层的介绍

1、四层负载均衡

所谓四层就是基于IP+端口的负载均衡

四层负载均衡,是指OSI七层模型中的传输层,传输层已经支持TCP/IP的控制,所以只需要对客户端的请求进行TCP/IP协议的包转发就可以实现负载。

2、七层负载均衡

 七层是基于URL等应用层信息的负载均衡

七层负载均衡是在应用层,它可以完成很多应用方面的协议请求

3、四层与七层区别

        四层负载均衡数据在底层就进行了分发,而七层负载均衡数据包则是在最顶层进行分发,七层负载均衡效率没有四层负载均衡高。

         四层负载均衡可以用来解决七层负载均衡端口限制问题(七层负载均衡最大使用65535个端口号)

        但是四层不支持协议的转发(http,https,DNS等)只支持IP,不识别域名。

-

        七层负载均衡更贴近于服务,如HTTP协议就是七层协议

        支持很多功能,比如支持http信息的改写、头部信息的改写、安全应用规则控制、URL匹配规则控制、以及转发、rewrite等一些规则,在应用层的服务里面可以做的内容更多。

七、 NGINX 7层负载均衡

1、nginx部署

下载nginx安装包 

nginx网站域名:http://nginx.org/

安装依赖性

dnf install -y gcc pcre-devel openssl-devel

安装nginx

tar zxf nginx-1.24.0.tar.gz
cd nginx-1.24.0/

关闭debug(可选)

 vim auto/cc/gcc

去掉服务版本号(可选)

vim src/core/nginx.h

安装 相关

./configure --help #可以看到可用参数
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module
【注:此命令是安装一些模块,此命令必须在nginx源码目录下执行】

很多的模块 

 

make(将源码编译成本系统可以用的可执行程序)

dnf install -y make
make
make install

创建软连接,方便调用

ln -s /usr/local/nginx/sbin/nginx  /usr/local/sbin/

启动服务  重载nginx服务  关闭nginx服务

nginx
nginx  -s reload
nginx  -s stop

配置启动脚本(使用systemctl 命令)

vim /lib/systemd/system/nginx.service
systemctl  daemon-reload #使新的脚本可以运行
systemctl  enable --now nginx
 [Unit]
 Description=The NGINX HTTP and reverse proxy server
 After=syslog.target network-online.target remote-fs.target nss-lookup.target
 Wants=network-online.target

 [Service]
 Type=forking
 PIDFile=/usr/local/nginx/logs/nginx.pid
 ExecStartPre=/usr/local/nginx/sbin/nginx -t
 ExecStart=/usr/local/nginx/sbin/nginx
 ExecReload=/usr/local/nginx/sbin/nginx -s reload
 ExecStop=/bin/kill -s QUIT $MAINPID
 PrivateTmp=true

 [Install]
 WantedBy=multi-user.target

2、负载均衡

配置nginx文件

vim /usr/local/nginx/conf/nginx.conf
http {
    upstream backend {
        server 192.168.189.112 weight=2; ##权重weight=2 默认为1
        server 192.168.189.113;
        server 127.0.0.1 backup;		//只有当所有的后端server全部失效才会被启用
    }
...
#定义虚拟主机,当访问此域名时反向代理负载均衡
server {
        listen 80;
        server_name www.yyl.org;
        location / {
                proxy_pass http://backend;
        }
}

}
systemctl  reload nginx

测试:

vim /etc/hosts  #测试机添加解析

 

关闭后端vm2,nginx自带健康检测

 3、修改nginx服务配置

修改启动用户

useradd -M -d /usr/local/nginx/ -s /sbin/nologin nginx
vim /usr/local/nginx/conf/nginx.conf
systemctl reload nginx.service
ps aux | grep nginx

nginx进程与cpu核心绑定

vim /usr/local/nginx/conf/nginx.conf
systemctl reload nginx.service
ps aux | grep nginx

   ## worker_processes auto;  是自动的

修改nginx并发连接数

vim /usr/local/nginx/conf/nginx.conf
vim /etc/security/limits.conf
usermod  -d /usr/local/nginx/ -s /bin/bash nginx  #改成可以登录否则无法查看
su - nginx
ulimit -a
logout
usermod -d /usr/local/nginx/ -s /sbin/nologin nginx  #改回不能登录比较安全

nginx模块编译

默认为rr模式 ip hash 根据客户端ip进行负载均衡

ip_hash调度算法比较符合客户使用习惯,算法为了保证连接稳定根据客户端ip进行负载均衡,相同客户端IP访问时,会访问到同一服务端,一个sever对一个IP。

ip_hash算法缺陷在于:客户端发送请求到nginx服务器,再由nginx服务器到后端RS,后端RS再返回到nginx服务器再返回客户端,所以后端RS不知道是谁访问了自己。


改进:可以用Sticky cookie来实现,类似于浏览器的cookie。客户端发送请求时,后端RS返回信息时会将session信息传回客户端,客户端存到浏览器中,这是RS分配给每一个客户端的,以后每次请求RS就通过这个cookie来判断是哪个客户端。

sticky

先停止nginx服务

systemctl stop nginx.service

下载扩展包并解压

unzip nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip

重新编译

cd nginx-1.22.0/
make clean ##清除原来编译的内容
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module  --add-module=/root/nginx-goodies-nginx-sticky-module-ng-08a395c66e42
make ##注意不要进行make install安装,因为软件已经安装过,现在直是去更新,执行make install 会进行覆盖安装
\cp -f objs/nginx  /usr/local/nginx/sbin/nginx  覆盖原二进制程序

测试:

 vim /usr/local/nginx/conf/nginx.conf

sticky 不可以使用backup 

 nginx  -t  检测语法

 启动nginx服务

 测试:

 不同的客户端:

 4、LNMP架构

      Nginx平滑版本升级

cd nginx-1.24.0/
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module
make

备份原程序

cd /usr/local/nginx/sbin/
cp nginx nginx.old

 

拷贝新程序

 \cp -f /root/nginx-1.24.0/objs/nginx nginx

修改配置文件 (1.24版本不支持sticky   ) 

获取nginx进程Pid

ps ax|grep nginx

唤醒新程序进程

kill -USR2 42188
ps ax|grep nginx

 

此时有多个nginx版本在处理请求

回收旧版本进程

kill -WINCH 42188
ps ax|grep nginx

此时只有新版本在响应业务请求

 Nginx平滑版本回退

拷贝旧版本程序

cd /usr/local/nginx/sbin/
 \cp -f nginx.old nginx

唤醒原版本程序

kill -HUP 42188
ps ax|grep nginx

回收新版本work进程

kill -WINCH 45025
ps ax|grep nginx
curl -I localhost

回收新版本master进程

kill -QUIT 45025
ps ax|grep nginx

八、 Pacemaker高可用

Pacemaker+Nginx

1、Pacemaker

       Pacemaker是一个集群资源管理器。它利用集群基础构件(OpenAIS 、heartbeatcorosync)提供的消息和成员管理能力来探测并从节点或资源级别的故障中恢复,以实现群集服务(亦称资源)的最大可用性。

       Pacemaker是一个通过管理多台机器的资源来实现系统的高可用性框架。

2、实验环境

vm1 vm4

需要将vm4上的nginx配置与vm1完全相同

 vm1:

scp -r /usr/local/nginx/ vm4:/usr/local/
scp /lib/systemd/system/nginx.service vm4:/lib/systemd/system/nginx.service

vm4 

ln -s /usr/local/nginx/sbin/nginx  /usr/local/sbin/
useradd -M -d /usr/local/nginx/ -s /sbin/nologin nginx
vim /etc/security/limits.conf
systemctl  daemon-reload
systemctl  enable --now nginx
ps aux | grep nginx
curl -I localhost

 

关闭vm1,vm4上的Nginx

systemctl disable --now nginx.service

3、主机配置免密

ssh-keygen
ssh-copy-id vm4

4、配置yum源

rhel8需要在外网下载

vm1,vm4都需要配置

vim /etc/yum.repos.d/yyl.repo
[HighAvailability]
name=HighAvailability
baseurl=https://mirrors.aliyun.com/centos/8-stream/HighAvailability/x86_64/os/
gpgcheck=0

5、安装软件

dnf install -y pacemaker-2.1.2-4.el8 pcs psmisc
ssh vm4 dnf install -y pacemaker-2.1.2-4.el8 pcs psmisc

6、启动pcsd服务

systemctl enable --now pcsd.service
ssh vm4 systemctl enable --now pcsd.service
echo yyl | passwd --stdin hacluster
ssh vm4 'echo yyl | passwd --stdin hacluster'

 7、配置corosync

pcs host auth vm1 vm4
pcs cluster setup  mycluster vm1 vm4

8、 启动与校验集群

pcs cluster start --all
pcs cluster enable --all
crm_verify -L -V
pcs property set stonith-enabled=false
pcs status

9、 创建集群资源

pcs resource create vip ocf:heartbeat:IPaddr2 ip=192.168.189.100 op monitor interval=30s
pcs status
vim /etc/hosts

手动移除vm1上的vip后,集群会自动检测并修复

ip a d 192.168.189.100/24 dev ens160

 

节点失效备援

vm1失效后资源自动迁移至vm4

pcs node standby
pcs status
pcs node unstandby
pcs status

 10、添加nginx服务资源

在添加资源之前,确保vm1和vm4主机上的nginx服务正确配置

pcs resource create nginx systemd:nginx op monitor interval=60s
pcs status

此时发现资源并不在同一台主机上创建资源组,强制资源运行在同一节点

pcs resource group add hagroup vip nginx
pcs status

vm4节点失效,资源整体迁移到vm1

ssh vm4 pcs  node standby
pcs status
ssh vm4 pcs  node unstandby

测试:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值