一.Linux集群概述
• 根据功能划分为两大类:高可用和负载均衡
• 高可用集群通常为两台服务器,一台工作,另外一台作为冗余,
当提供服务的机器宕机,冗余将接替继续提供服务
• 实现高可用的开源软件有:heartbeat、keepalived
• 负载均衡集群,需要有一台服务器作为分发器,它负责把用户的
请求分发给后端的服务器处理,在这个集群里,除了分发器外,就
是给用户提供服务的服务器了,这些服务器数量至少为2
• 实现负载均衡的开源软件有LVS、keepalived、haproxy、nginx,
商业的有F5、Netscaler
二.keepalived介绍
• 在这里我们使用keepalived来实现高可用集群,因为heartbeat在
centos6上有一些问题,影响实验效果
• keepalived通过VRRP(Virtual Router Redundancy Protocl)来实现高可
用。
• 在这个协议里会将多台功能相同的路由器组成一个小组,这个小组里会
有1个master角色和N(N>=1)个backup角色。
• master会通过组播的形式向各个backup发送VRRP协议的数据包,当
backup收不到master发来的VRRP数据包时,就会认为master宕机了。此
时就需要根据各个backup的优先级来决定谁成为新的master。
• Keepalived要有三个模块,分别是core、check和vrrp。其中core模块为
keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和
解析,check模块负责健康检查,vrrp模块是来实现VRRP协议的。
- 用keepalived配置高可用
3.1环境准备
节点规划
服务器 | IP地址 | VIP地址 |
Master(主节点) | 192.168.213.130 | 192.168.213.100 |
Backup(从节点) | 192.168.213.132 | 192.168.213。100 |
3.2修改主机名
修改两个节点的主机名
Master 节点
[root@master ~]# hostnamectl set-hostname master
[root@master ~]# bash
Backup 节点
[root@ backup~]# hostnamectl set-hostname backup
[root@ backup~]# bash
3.3 关闭防火墙
关闭两节点的防火墙
[root@master ~]# setenforce 0
[root@master ~]# systemctl stop firewalld
Backup 节点也要关闭防火墙,操作一致
- 安装编译nginx
Master和backup节点均要安装nginx服务,master和backup节点的配置除特别提到的地方其他配置均相同
4.1安装依赖包
[root@master ~]# yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel
[root@master ~]# yum install libxml2-devel libxslt-devel
[root@master ~]# yum install gd-devel
4.2下载nginx包,并解压
[root@master ~]# wget http://nginx.org/download/nginx-1.20.1.tar.gz
[root@master ~]# tar -zxvf nginx-1.20.1.tar.gz
./configure: error: perl 5.8.6 or higher is required显示版本过低
[root@master ~]#sudo yum update
[root@master ~]#sudo yum install perl
[root@master ~]#sudo yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
4.3进入安装包目录
[root@master ~]# cd nginx-1.20.1
4.4配置编译选项
[root@master nginx-1.20.1]# ./configure --prefix=/usr/local/nginx
编译安装,编辑配置文件
编译安装成功后,编辑nginx.server文件,添加如下内容
[root@master ~]# make && make install
[root@master ~]# vi /etc/systemd/system/nginx.server
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.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=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
重新加载配置,并启动nginx服务
[root@master ~]# systemctl daemon-reload
[root@master ~]# /usr/local/nginx/sbin/nginx
4.5设置nginx的浏览页面,区分2节点的nginx服务器
编辑配置文件index.html文件修改如下区域
Master节点
[root@master ~]#vi /usr/local/nginx/html/index.html
<h1>Welcome to nginx! 192.168.213.130 </h1>
Backup节点
[root@master ~]#vi /usr/local/nginx/html/index.html
<h1>Welcome to nginx! 192.168.213.132 </h1>
4.6在浏览器访问2节点
结果如下:
- 安装配置 keepalived
2节点均需安装keepalived服务,,master和backup节点的配置除特别提到的地方其他配置均相同
5.1 安装keepalived
[root@master ~]# yum install -y keepalived
5.2 配置主服务器
编辑keepalived.conf 文件,修改以下内容
[root@master ~]# vi /etc/keepalived/keepalived.conf ! Configuration File for keepalived ######################### 全局配置 ############################# global_defs { # 定义管理员邮件地址,可以有多个,每行一个 notification_email { # 设置报警邮件地址,可以设置多个,每行一个。 需开启本机的sendmail服务 } } # keepalived在发生诸如切换操作时需要发送email通知地址,表示发送通知的邮件源地址是谁 notification_email_from [email protected] #指定发送email的smtp服务器 smtp_server 127.0.0.1 #设置连接smtp server的超时时间 smtp_connect_timeout 30 #运行keepalived的机器的一个标识,通常可设为hostname。故障发生时,发邮件时显示在邮件主题中的信息。 router_id nginx-l ######################### vrrpd配置 ############################# vrrp_skip_check_adv_addr # vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } # 定义chk_nginx脚本,脚本执行间隔10秒,权重-10,检测nginx服务是否在运行。有很多方式,比如进程,用脚本检测等等 vrrp_script chk_nginx { # 这里通过脚本监测 script "/data/chk_nginx.sh" # 脚本执行间隔,每2s检测一次 interval 2 # 脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5 weight -10 # 检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间) fall 2 # 检测1次成功就算成功。但不修改优先级 rise 1 } # 定义vrrp实例,VI_1 为虚拟路由的标示符,自己定义名称,keepalived在同一virtual_router_id中priority(0-255)最大的会成为master,也就是接管VIP,当priority最大的主机发生故障后次priority将会接管 vrrp_instance VI_1 {
# 指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器。 注意这里的state指定instance(Initial)的初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的, #但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高, #那么他会就回抢占为MASTER state MASTER
# 指定HA监测网络的接口。与本机 IP 地址所在的网络接口相同,可通过ip addr 查看 interface ens33 #当该keepalived切换为MASTER状态时,执行下面的脚本 notify_master /data/chk_master.sh #当该keepalived切换为BACKUP状态时,执行下面的脚本 notify_backup /data/chk_backup.sh
# 发送多播数据包时的源IP地址,这里注意了,这里实际上就是在哪个地址上发送VRRP通告,这个非常重要, # 一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址 mcast_src_ip 192.168.186.129
#虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的 virtual_router_id 51
#定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级 priority 100 #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒 advert_int 1 # 设置验证类型和密码。主从必须一样 authentication { # 设置vrrp验证类型,主要有PASS和AH两种 auth_type PASS
#设置vrrp验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信 auth_pass 1111 } # VRRP HA 虚拟地址 如果有多个VIP,继续换行填写 #设置VIP,它随着state变化而增加删除,当state为master的时候就添加,当state为backup的时候则删除,由优先级决定 virtual_ipaddress { 192.168.186.108/24 } # 执行nginx检测脚本。注意这个设置不能紧挨着写在vrrp_script配置块的后面(实验中碰过的坑),否则nginx监控失效!! track_script {
#引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。 chk_nginx } } |
5.3 配置从服务器
编辑keepalived.conf 文件,修改以下内容
[root@backup ~]# vi /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { } } notification_email_from 26989465332qq.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id nginx-2 router_id LVS_DEVEL vrrp_skip_check_adv_addr # vrrp_strict标红这两行删掉上面同理 vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_script chk_nginx { script "/data/chk_nginx.sh" interval 2 weight -10 fall 2 rise 1 } vrrp_instance VI_1 { state BACKUP interface ens33 notify_master /data/chk_master.sh notify_backup /data/chk_backup.sh mcast_src_ip 192.168.186.128 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.186.108/24 } track_script { chk_nginx } } |
5.4 创建检测脚本
2节点的配置均相同
在上一节的主从服务器配置中,就已经添加过检测脚本模块了。在配置的路径下创建编辑chk_nginx.sh脚本
[root@master ~]# mkdir data [root@master ~]# touch chk_nginx.sh [root@master ~]# vi touch chk_nginx.sh #!/bin/bash # 获取当前运行的 Nginx 进程数量,并将其存储在变量 A 中 A=`ps -C nginx --no-header | wc -l` # 检查 Nginx 进程数量是否为 0 if [ $A -eq 0 ]; then # 如果 Nginx 进程数量为 0,尝试重新启动 Nginx /usr/local/nginx/sbin/nginx
# 等待 3 秒钟,以便 Nginx 有足够的时间启动 sleep 3
# 再次检查 Nginx 进程数量 if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then
# 如果 Nginx 进程数量仍然为 0,停止 keepalived 服务 systemctl stop keepalived fi fi |
5.5设置脚本权限
[root@master ~]# chmod +x chk_nginx.sh
5.6启动keepaliced服务
2节点均要启动服务
[root@master ~]# systemctl stop keepalived
5.7查看主从节点IP绑定情况
Master节点
[root@master ~]# ip a
Backup节点
[root@backup ~]# ip a
如果服务运行正确,会在master节点看到虚拟IP地址,而backup上只有本机的IP地址。一般去情况下,只有在主节点服务奔溃的情况下,从节点上才会出现虚拟IP
访问
5.8在浏览器访问master,backup和VIP的IP地址
Master节点
Backup节点
http://192.168.213.132
VIP虚拟地址
访问vip地址会自动跳转到master节点上
六.验证高可用
验证主节点nginx服务为宕机,nginx服务是否会自动重启
如果重启则说明chk_nginx脚本执行成功,如果nginx未能重启,则应当执行脚本中的命令关闭keepalived服务。
在master节点
关闭nginx服务
[root@master ~]# pkill -9 -f nginx
查看nginx端口状态
[root@master ~]# ss -tuln | grep :80
验证宕机主节点keepalived服务,虚拟ip是否会转移到backup节点上
Master节点
[root@master ~]# systemctl stop keepalived
[root@master ~]# ip a
发现虚拟IP已经不存在
Backup节点
[root@backup ~]# ip a
查看backup节点发现虚拟IP转移到此
在浏览器访问虚拟IP
http://192.168.213.100
发现跳转到backup节点
由于主服务器发生故障,备份服务器(Backup)接管 VIP,继续提供服务
验证恢复master主节点服务,虚拟IP是否会回到主节点上
Master节点
重启keepalived服务,查看IP
[root@master ~]# systemctl restart keepalived
[root@master ~]# ip a
发现虚拟IP回到master节点
在浏览器访问虚拟IP
发现跳转回master节点
在配置keepalived服务时设置master节点的优先级高于backup,所以当master节点恢复正常后,虚拟IP重新回到master上,而backup继续做冗余备份。
搭载负载均衡集群
一.负载均衡集群介绍
负载均衡集群不难理解,从字面上也能猜到,简单说就是让多台服务器均衡地去承载压力。实现负载均衡集群的开源软件有LVS、keepalived、haproxy、Nginx等,当然也有优秀的商业负载均衡设比如F5、NetScaler等。商业的负载均衡解决方案稳定性没的说,但是成本非常昂贵,所以本节以开源的LVS为主。
- LVS介绍
LVS(Linux Virtual Server)是由国内大牛章文嵩开发的,这款软件的流行度不亚于Apache的httpd,它是一款四层的负载均衡软件,是针对TCP/IP做的转发和路由,所以稳定性和效率相当高。不过LVS最新的版本是基于Linux2.6内核的,这意味着它已经有多年没有更新了。虽然目前越来越多的企业选择使用Nginx实现负载均衡,但LVS依然被诸多企业应用在核心的架构当中。如下图所示,在该架构中有一个核心的角色叫作调度器(Load Balancer).用来分发用户的请求,还有诸多的真实服务器(Real Server),也就是处理用户请求的服务器。
LVS根据实现方式的不同,主要分为三种类型:NAT模式、IPTunnel(IP隧道)模式、DR模式。
(1)NAT模式
这种模式的实现原理很简单,调度器会把用户的请求通过预设的iptables规则转发给后端的真实服务器。其中调度器有两个IP,一个是公网IP,一个是内网IP,而真实服务器只有内网IP。用户访问的时候请求的是调度器的公网IP,它会把用户的请求转发到真实服务器的内网IP上。这种模式的好处是节省公网IP,但是调度器会成为一个瓶颈。NAT模式架构如下图所示。
(2) IP Tunnel模式
IP隧道是将一个IP报文封装在另一个IP报文的技术,这可以使目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。像大家熟知的VPN技术其实就是IP隧道。在LVS的IP Tunnel架构中,后端服务器有一组而非一个,所以不可能静态地建立一一对应的隧道,而是动态地选择一台服务器,将请求报文封装和转发给选出的服务器。这样,我们可以利用IP隧道的原理,将一组服务器上的网络服务组成在一个IP地址上的虚拟网络服务。IP Tunnel模式架构如下图所示。
调度器(LoadBalancer)将请求报文封装在另一个IP报文中,再将封装后的IP报文转发给真实服务器。真实服务器收到报文后,先将报文解封获得原来目标地址为VIP的报文,服务器发现VIP地址被配置在本地的IP隧道设备上,所以就处理这个请求,然后根据路由表将响应报文直接返回给客户。这种模式下,需要给调度器和所有的真实服务器全部分配公网IP,所以比较浪费公网IP。
(3)DR模式
和IPTunnel模式方法相同,用户的请求被调度器动态地分配到真实服务器上,真实服务器响应请求把结果直接返回给用户。不过,在这种模式下不会封装IP,而是将数据帧的MAC地址改为真实服务器的MAC地址。DR模式架构如下图所示。
LVS的官方网站给出了三种模式的比较,如下表所示:
_ | VS/NAT | VS/TUN | VS/DR |
server | any | Tunneling | Non-arp device |
server network | private | LAN/WAN | LAN |
server number | low(10~20) | High(100) | High(100) |
server gateway | load balancer | own router | own router |
以上三种方法所能支持最大服务器数的估值是假设调度器使用100MB网卡,调度器的硬件配置与后端服务器的硬件配置相同,而且是针对一般Web服务的。使用更高的硬件配置(如千兆网卡和更快的处理器)作为调度器,调度器所能调度的服务器数量会相应增加。当应用不同时,服务器的数目也会相应地改变。所以,以上数据估计主要是为三种方法的伸缩性进行量化比较。
通过比较可以看出,NAT模式适合小型的集群,机器数量不多,它的优势是节省公网IP。 TUN和DR相差不大,都能支撑较大规模的集群,但缺点是浪费公网IP。
- LVS的调度算法
调度器把客户端发来的请求均衡地分发给后端的真实服务器,这是依靠预先设定好的调度算法实现的,在LVS中支持的调度算法主要有以下8种。
1.轮询调度(Round-Robin)
非常简单的一种调度算法。就是按顺序把请求依次发送给后端的服务器,它不管后端服务器的处理速度和响应时间怎样。当后端服务器性能不一致时,用这种调度算法就不合适了。
2.带权重的轮询调度(Weighted Round-Robin)
比第一种算法多了一个权重的设置,权重越高的服务器被分配到的请求就越多,这样后端服务器性能不一致时,就可以给配置低的服务器较小的权重。
3.最小连接调度(Least-Connection)
这种算法会根据各真实服务器上的连接数来决定把新的请求分配给谁,连接数少说明服务器是空闲的,这样把新的请求分配到空闲服务器上才更加合理。
4.带权重最小连接调度(Weight Least-Connection)
在最小连接调度的基础上再增加一个权重设置。这样就可以人为地去控制哪些服务器上多分配请求,哪些少分配请求。
5.基于局部性的最少链接调度(Locality-Based Least Connection)
这种算法简称LBLC,是针对请求报文的目标IP地址的负载均衡调度,目前主要用于Cache集群系统,因为在Cache集群中客户请求报文的目标IP地址是变化的。算法的设计目标是在服务器的负载基本平衡的情况下,将相同目标IP地址的请求调度到同一台服务器,来提高各台服务器的访问局部性和主存Cache命中率。
- 带复制的基于局部性最少链接调度(Locality-Based Least Connections with Replication)
该算法简称LBLCR,也是针对目标IP地址的负载均衡,它与LBLC算法的不同之处是:它要维护从一个目标IP地址到一组服务器的映射,面LBLC算法是维护从一个目标IP地址到一台服务器的映射。 LBLCR算法先根据请求的目标IP地址找出该目标IP地址对应的服务器组。按“最小连接”原则从该服务器组中选出一台服务器,若服务器没有超载,则将请求发送到该服务器;若服务器超载,则按“最小连接”原则从整个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
7.目标地址散列调度(Destination Hashing)
该算法也是针对目标IP地址的负载均衡的,但它是一种静态映射算法,通过一个散列(hash)函数将一个目标IP地址映射到一台服务器。目标地址散列调度算法先根据请求的目标IP地址。作为散列键(hash key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
8.源地址散列调度(Source Hashing)
该算法正好与目标地址散列调度算法相反,它根据请求的源IP地址,作为散列键从静态分配的散表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。它的算法流程与目标地址散列调度算法的基本相似,只不过将请求的目标IP地址换成请求的源IP地址。
对于以上8种调度算法前4种用得最多,也最容易理解,它们基本上能满足绝大多数的应用场景。
- NAT模式LVS搭建
NET模式下,调度器需要有两个IP,一个公网IP一个内网IP,真实服务器只需要内网IP。此架构需要准备三台虚拟机。三台虚拟机的IP分配如下:
调度器dir:192.168.200.130(内网IP,vmware为NAT模式),192.168.147.144(公网IP,vmware仅主机模式)。
真实服务器rs1:192.168.200.131(内网IP)
真实服务器rs2:192.168.200.132(内网IP)
其中调度器上有两块网卡,作为内网的这块网卡使用的是NAT的网络,而作为“公网”的网卡使用的是仅主机网络。需要注意,所谓的公网其实仅仅是模拟的,并不是真正意义上的公网。在配置LVS之前,需要做一些准备工作。首先,真实服务器rs1(192.168.200.131)和rs2(192.168.200.132)上要把内网的网关设置为dir的内网IP(192.168.200.130),否则实验无法成功。
(1)节点规划
服务器 | 内网地址 | 网关地址 | 外网地址 |
Dir | 192.168.133.104 | 192.168.133.104 | 192.168.101.130 |
Rs1 | 192.168.133.103 | 192.168.133.104 | |
Rs2 | 192.168.133.102 | 192.168.133.104 |
- 修改主机名
修改3节点的主机名
Dir节点
[root@hostlocal ~]# hostnamectl set-hostname dir [root@hostlocal ~]# bash |
Rs1节点
[root@hostlocal ~]# hostnamectl set-hostname rs1 [root@hostlocal ~]# bash |
Rs2节点
[root@hostlocal ~]# hostnamectl set-hostname rs2 [root@hostlocal ~]# bash |
- 设置防火请
关闭3节点的防火墙
[root@dir ~]# setenforce 0
[root@dir ~]# systemctl stop firewalld
清空3节点的iptables规则并保存
[root@dir ~]# systemctl start iptables [root@dir ~]# iptables -F [root@dir ~]# service iptables save |
4.安装配置ipvsadm
安装ipvsadm服务
在dir上安装ipvsadm,LVS的核心工具:
[root@dir ~]# yum install -y ipvsadm |
2.2 编写lvs_nat.sh 脚本
[root@dir ~]# vi /usr/local/sbin/lvs_nat.sh #! /bin/bash # director 服务器上开启路由转发功能 echo 1 > /proc/sys/net/ipv4/ip_forward #启用 Linux 内核的 IP 转发功能。IP 转发允许 Linux 系统作为一个路由器,将数据包从一个网络接口转发到另一个网络接口。 # 关闭icmp的重定向 echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects # 注意区分网卡名字 echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects echo 0 > /proc/sys/net/ipv4/conf/ens36/send_redirects # director 设置nat防火墙 iptables -t nat -F #清空net表中的所有规则 iptables -t nat -X #删除nat表中的所有用户自定义链 iptables -t nat -A POSTROUTING -s 192.168.213.0/24 -j MASQUERADE 3添加 POSTROUTING 链的 MASQUERADE 规则 # director设置ipvsadm IPVSADM='/usr/sbin/ipvsadm' $IPVSADM -C $IPVSADM -A -t 192.168.101.130:80 -s wlc -p 300 $IPVSADM -a -t 192.168.101.130:80 -r 192.168.213.102:80 -m -w 1 $IPVSADM -a -t 192.168.101.130:80 -r 192.168.213.103:80 -m -w 1 |
5.给予脚本权限,执行脚本
[root@dir ~]# chmod +x /usr/local/sbin/lvs_nat.sh
[root@dir ~]# bash /usr/local/sbin/lvs_nat.sh
6.配置rs1,rs2节点
安装Nginx服务
[root@rs1 ~]# yum install nginx -y |
给rs1,rs2设置默认主页,方便区分,并启动nginx服务
[root@rs1 ~]# echo "hi RS1" > /usr/share/nginx/html/index.html [root@rs1 ~]# systemctl restart nginx |
[root@rs1 ~]# echo "hi RS2" > /usr/share/nginx/html/index.html [root@rs1 ~]# systemctl restart nginx |
- 测试负载均衡
在dir节点上访问2个rs节点IP
[root@dir ~]# curl 192.168.213.102 [root@dir ~]# curl 192.168.213.103 |
在dir节点上访问外网IP,连续多次访问,就会发现RS1,RS2交替出现做到了负载均衡
[root@dir ~]# curl 192.168.101.130 |
- DR模式LVS搭
基础配置
-
- 节点规划
服务器 | 内网地址 | VIP地址 |
Dir | 192.168.213.107 | 192.168.101.103 |
Rs1 | 192.168.213.105 | |
Rs2 | 192.168.213.106 |
2.2 修改主机名
修改2节点的主机名
Dir节点
[root@hostlocal ~]# hostnamectl set-hostname dir [root@hostlocal ~]# bash |
Rs1节点
[root@hostlocal ~]# hostnamectl set-hostname rs1 [root@hostlocal ~]# bash |
Rs2节点
[root@hostlocal ~]# hostnamectl set-hostname rs2 [root@hostlocal ~]# bash |
2.3设置防火墙
关闭3节点的防火墙,禁止防火墙自启
[root@dir ~]# setenforce 0 [root@dir ~]# systemctl stop firewalld [root@dir ~]# systemctl disable firewalld |
安装配置ipvsadm
2.4安装ipvsadm服务
在dir上安装ipvsadm,LVS的核心工具:
[root@dir ~]# yum install -y ipvsadm |
2.5编写lvs_dr.sh脚本
[root@dir ~]# vi /usr/local/sbin/lvs_dr.sh #! /bin/bash echo 1 > /proc/sys/net/ipv4/ip_forward ipv=/usr/sbin/ipvsadm vip=192.168.133.133 rs1=192.168.133.131 rs2=192.168.133.132 · ipv:指向 ipvsadm 命令的路径,用于管理 LVS 配置。 · vip:虚拟 IP 地址(VIP),即访问者访问的公共 IP 地址。 · rs1、rs2:代表后端的两台真实服务器(Real Server),它们负责处理客户端请求。 #注意这里的网卡名字 ifconfig ens36:2 $vip broadcast $vip netmask 255.255.255.255 up route add -host $vip dev ens36:2 $ipv -C 清空当前的 IPVS 配置表,确保新的配置生效 $ipv -A -t $vip:80 -s wrr 添加一个监听在 VIP:80 端口上的虚拟服务,使用加权轮询调度算法 $ipv -a -t $vip:80 -r $rs1:80 -g -w 1 $ipv -a -t $vip:80 -r $rs2:80 -g -w 1 将两台真实服务器添加到虚拟服务中,设置为 LVS 负载均衡调度 |
启动脚本
[root@dir ~]# bash /usr/local/sbin/lvs_dr.sh |
2.6 配置rs1,rs2节点
安装Nginx服务
[root@rs1 ~]# yum install nginx -y |
给rs1,rs2设置默认主页,方便区分,并启动nginx服务
[root@rs1 ~]# echo "Hello RS1" > /usr/share/nginx/html/index.html [root@rs1 ~]# systemctl start nginx |
[root@rs1 ~]# echo "Hello RS2" > /usr/share/nginx/html/index.html [root@rs1 ~]# systemctl start nginx |
编写脚本
[root@rs1 ~]# vim /usr/local/sbin/lvs_rs.sh //两台rs上添加的内容一致
#/bin/bash
vip=192.168.200.110
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
启动rs1,rs2节点脚本
[root@rs1 ~]# bash /usr/local/sbin/lvs_rs.sh |
测试负载均衡
在浏览器访问VIP地址
http://192.168.213.100 |
RS1,2节点IP地址
http://192.168.213.105 http://192.168.213.106 |
- Keepalived +LVS
基础配置
3.1节点规划
服务器 | ip地址 | VIP地址 |
Master | 192.168.213.105 | 192.168.213.100 |
Slave | 192.168.213.106 | 192.168.213.100 |
Web1 | 192.168.213.107 | |
Web2 | 192.168.213.108 |
3.2 修改主机名
修改4节点的主机名
Master节点
[root@hostlocal ~]# hostnamectl set-hostname master [root@hostlocal ~]# bash |
Slave节点
[root@hostlocal ~]# hostnamectl set-hostname slave [root@hostlocal ~]# bash |
Web1节点节点
[root@hostlocal ~]# hostnamectl set-hostname web1 [root@hostlocal ~]# bash |
Web2节点节点
[root@hostlocal ~]# hostnamectl set-hostname web2 [root@hostlocal ~]# bash |
3.3 设置防火墙
关闭4节点的防火墙,禁止防火墙自启
[root@master ~]# setenforce 0 [root@master ~]# systemctl stop firewalld [root@master ~]# systemctl disable firewalld |
3.4 安装keepalived 、ipvsadm
服务器配置
3.1主服务器配置
[root@master ~]# vi /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { } ! 设置通知邮件的接收地址 notification_email_from [email protected] ! 设置通知邮件的发送地址 smtp_server 192.168.200.1 ! 设置SMTP服务器地址 smtp_connect_timeout 30 ! 设置SMTP连接超时时间(秒) router_id R1 ! 设置路由器标识 } vrrp_instance VI_1 { state MASTER ! 设置初始状态为主节点 interface ens33 ! 设置VRRP实例绑定的网络接口 virtual_router_id 2 ! 设置虚拟路由器ID priority 100 ! 设置优先级 advert_int 1 ! 设置VRRP广播间隔(秒) authentication { auth_type PASS ! 设置认证类型为密码 auth_pass 1111 ! 设置认证密码 } virtual_ipaddress { 192.168.213.100 ! 设置虚拟IP地址 } } virtual_server 192.168.213.100 80 { delay_loop 6 ! 设置健康检查间隔(秒) lb_algo rr ! 设置负载均衡算法为轮询 lb_kind DR ! 设置LVS模式为直接路由 nat_mask 255.255.255.0 ! 设置NAT掩码 ! persistence_timeout 50 ! 会话保持时间(秒),当前被注释 protocol TCP ! 设置协议为TCP real_server 192.168.213.107 80 { weight 1 ! 设置服务器权重 TCP_CHECK { connect_port 80 ! 设置健康检查连接的端口 connect_timeout 3 ! 设置连接超时时间(秒) nb_get_retry 3 ! 设置重试次数 delay_before_retry 3 ! 设置重试间隔(秒) } } real_server 192.168.213.108 80 { weight TCP_CHECK { connect_port 80 connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } |
配置完成后,启动keepalived服务,设置开机自启
[root@master ~]# systemctl start keepalived [root@master ~]# systemctl enable keepalived [root@master ~]# systemctl status keepalived |
3.2 备服务器配置
! Configuration File for keepalived gloal_defs { notification_email { } ! 设置通知邮件的接收地址 notification_email_from [email protected] ! 设置通知邮件的发送地址 smtp_server 192.168.200.1 ! 设置SMTP服务器地址 smtp_connect_timeout 30 ! 设置SMTP连接超时时间(秒) router_id R2 ! 设置路由器标识 } vrrp_instance VI_1 { state BACKUP ! 设置初始状态为主节点 interface ens33 ! 设置VRRP实例绑定的网络接口 virtual_router_id 2 ! 设置虚拟路由器ID priority 95 ! 设置优先级 advert_int 1 ! 设置VRRP广播间隔(秒) authentication { auth_type PASS ! 设置认证类型为密码 auth_pass 1111 ! 设置认证密码 } virtual_ipaddress { 192.168.192.200 ! 设置虚拟IP地址 } } virtual_server 192.168.213.100 80 { delay_loop 6 ! 设置健康检查间隔(秒) lb_algo rr ! 设置负载均衡算法为轮询 lb_kind DR ! 设置LVS模式为直接路由 nat_mask 255.255.255.0 ! 设置NAT掩码 # persistence_timeout 50 ! 会话保持时间(秒),当前被注释 protocol TCP ! 设置协议为TCP real_server 192.168.213.107 80 { weight 1 ! 设置服务器权重 TCP_CHECK { connect_port 80 ! 设置健康检查连接的端口 connect_timeout 3 ! 设置连接超时时间(秒) nb_get_retry 3 ! 设置重试次数 delay_before_retry 3 ! 设置重试间隔(秒) } } real_server 192.168.213.108 80 { weight 1 TCP_CHECK { connect_port 80 connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } |
配置完成后,启动keepalived服务,设置开机自启
[root@slave ~]# systemctl start keepalived [root@slave ~]# systemctl enable keepalived [root@slave ~]# systemctl status keepalived |
3.3web服务器配置
安装httpd服务
2台web服务器均安装
[root@web ~]# yum insatll -y httpd |
设置2台服务器的网页访问界面
Web1节点
[root@web1 ~]# echo "舒克" > /var/www/html/index.html |
Web2节点
[root@web2 ~]# echo "长江" > /var/www/html/index.html |
修改回环接口配置文件
进入相关配置文件
[root@web1 ~]# cd /etc/sysconfig/network-scripts/ |
备份配置文件
【[root@web1 ~]# cp -p ifcfg-lo ifcfg-lo:0 |
编辑配置文件
[root@web1 network-scripts]# vi ifcfg-lo:0 DEVICE=lo:0 #指定虚拟接口的名称。 IPADDR=192.168.213.100 #设置此接口的 IP 地址。 NETMASK=255.255.255.255 #设置网络掩码(这是 CIDR 表示法中的 /32) NETWORK=192.168.213.100 #指定网络地址。 BROADCAST=192.168.213.100 #设置广播地址。 ONBOOT=yes #确保在启动时启动接口 NAME=loopback |
启动回环接口,添加静态路由到lo:0接口
[root@web1 ~]# ifup ifcfg-lo:0 [root@web1 ~]# route add -host 192.168.192.200 dev lo:0 |
[root@web1 ~]# vi /etc/sysctl.conf net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce =2 net.ipv4.conf.default.arp_ignore = 1 net.ipv4.conf.default.arp_announce =2 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce =2 |
使更改立即生效
[root@web1 ~]# sysctl -p |
以上操作除网站访问页面外,其余操作web1、2节点均相同
测试
3.1 查看服务器ip情况
查看master节点上的IP地址,是否有虚拟ip存在
[root@master ~]# ip a |
查看备服务器
[root@slave ~]# ip a |
3.2 关闭测试
关闭主服务器keepalived服务,查看其IP情况
[root@master ~]# ip a |
查看slave节点ip情况
[root@slave ~]# ip a sh dev ens33 |