linux集群

一、搭建高可用

高可用集群,即“HA集群”,也常称作“双机热备”,用于关键业务。常见实现高可用的开源软件有heartbeat和keepalived,其中keepalived还有负载均衡的功能。这两个软件类似,核心原理都是通过心跳线连接两台服务器,正常情况下由一台服务器提供服务,当这台服务器宕机,备用服务器顶替。

准备

节点 作用 网卡 IP
master 主节点 NAT 192.168.200.10
backer 备用节点 NAT 192.168.200.21

 

安装nginx

安装nginx教程连接:nginx - 花花de代码生活 - 博客园 (cnblogs.com)

两个节点都需要安装nginx

安装keepalived

VRRP协议有1个master角色和至少1个backup角色,所以做本实验需要准备至少两台Linux机器。这里我们拿两台Linux虚拟机(20和21,其中20作为master,21作为backup)来完成以下操作。

# yum install -y keepalived

CentOS默认的yum源里就有keepalived包,安装keepalived很简单,但重点在于配置,下面我们拿一个实际案例来阐述 keepalived的高可用功能。

修改keepalived配置文件

master节点

编辑master(192.168.200.20)的keepalived配置文件:红色:注意事项 

[root@master ~]# vim /etc/keepalived/keepalived.conf      //内容如下
global_defs {         #全局配置标识,表明这个区域{}是全局配置
   notification_email {    
        1615134@qq.com   #表示发送通知邮件时邮件源地址是谁
   }
   notification_email_from root@aaaaa.com    #表示keepalived在发生诸如切换操作时需要发送email通知,以及email发送给哪些邮件地址,邮件地址可以多个,每行一个
   smtp_server 127.0.0.1      #表示发送email时使用的smtp服务器地址,这里可以用本地的sendmail来实现
   smtp_connect_timeout 30    #连接smtp连接超时时间
   router_id LVS_DEVEL      #机器标识
}

vrrp_script chk_nginx {    
    script "/usr/local/sbin/check_ng.sh"    #检查服务是否正常,通过写脚本实现,脚本检查服务健康状态
    interval 3    #检查时间间断是3秒
    }

vrrp_instance VI_1 {        #VRRP配置标识 VI_1是实例名称
    state MASTER        #定义master相关 MASTER为主 BACKUP为备
    interface ens33    #通过vrrp协议去通信、去发广播。此为网卡名
    virtual_router_id 51   #定义路由器ID ,配置的时候和从机器一致    
    priority 100   #权重,主角色和从角色的权重是不同的,一般主比从大
    advert_int 1  #设定MASTER与BACKUP主机质检同步检查的时间间隔,单位为秒
    authentication {        #认证相关信息
      auth_type PASS      #认证类型
        auth_pass 5201314>g     #密码的形式是一个字符串
    }
    virtual_ipaddress {     #设置虚拟IP地址 (VIP),又叫做漂移IP地址
        192.168.200.100
    }
    track_script {       #加载脚本
        chk_nginx
    }
}
【小技巧】全部删除下面的时候:按123然后接着按dd后面的就全删除了
!!!只做高可用的话先下面的必须删掉
!!!只做高可用的话先下面的必须删掉
!!!只做高可用的话先下面的必须删掉
virtual_server 192.168.200.100 443 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.201.100 443 {
        weight 1
        SSL_GET {
            url {
              path /
              digest ff20ad2481f97b1754ef3e12ecd3a9cc
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 10.10.10.2 1358 {
    delay_loop 6
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    sorry_server 192.168.200.200 1358

    real_server 192.168.200.2 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.3 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 10.10.10.3 1358 {
    delay_loop 3
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.200.4 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.5 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

keepalived要实现高可用,监控Nginx服务是必不可少的,它本身没有这个功能,需要借助自定义脚本实现,所以接下来我们还需要定义一个监控Nginx服务的脚本,如下:

[root@master ~]# vim /usr/local/sbin/check_ng.sh  //添加如下内容
#!/bin/bash                                     
  #时间变量,用于记录日志
d=`date --date today +%Y%m%d_%H:%M:%S`
#计算nginx进程数量  
  n=`ps -C nginx --no-heading|wc -l`
#如果进程为0,则启动nginx,并且再次检测nginx进程数量    
  if [ $n -eq "0" ]; then      
         /etc/init.d/nginx start
          n2=`ps -C nginx --no-heading|wc -l`   
#如果还为0,说明nginx无法启动,此时需要关闭keepalived
          if [ $n2 -eq "0"  ]; then
                  echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
                  systemctl stop keepalived
          fi
 fi

编辑完监控Nginx服务的脚本,还需要给它x权限,否则无法被keepalived调用,命令如下:

[root@master ~]# chmod a+x /usr/local/sbin/check_ng.sh   

完成以上操作,就可以启动master上的keepalived了,如果没有启动Nginx服务,它会帮我们自动拉动起来,并监听VIP:

[root@master ~]# systemctl start keepalived
[root@master ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:f8:e3:b9 brd ff:ff:ff:ff:ff:ff
    inet 192.168.200.20/24 brd 192.168.200.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.200.100/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::a709:f89:6e2d:666a/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::f47a:43ff:375e:c80/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever

backup节点

[root@backup ~]# vim /etc/keepalived/keepalived.conf    //内容如下
global_defs {
   notification_email {
        1615134@qq.com
   }
   notification_email_from root@aaaaa.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_script chk_nginx {
    script "/usr/local/sbin/check_ng.sh"
    interval 3
    }

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 5201314>g
    }
    virtual_ipaddress {
        192.168.200.100
    }
    track_script {
        chk_nginx
    }
}
!!!下面的也要删掉

编辑监控脚本,如下:

[root@backup ~]# vim /usr/local/sbin/check_ng.sh    //内容如下
d=`date --date today +%Y%m%d_%H:%M:%S`
n=`ps -C nginx --no-heading|wc -l`
if [ $n -eq "0" ]; then
        systemctl start nginx
        n2=`ps -C nginx --no-heading|wc -l`
        if [ $n2 -eq "0"  ]; then
                echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
                systemctl stop keepalived
        fi
fi

编辑完监控Nginx服务的脚本,还需要给它x权限,否则无法被keepalived调用,命令如下:

[root@backup ~]# chmod a+x /usr/local/sbin/check_ng.sh 

启动nginx跟keepalived

[root@backup ~]# nginx
[root@backup ~]# systemctl start keepalived
[root@backup ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:58:3f:62 brd ff:ff:ff:ff:ff:ff
    inet 192.168.200.21/24 brd 192.168.200.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.200.100/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::af2f:833c:2874:5380/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

开始测试

这是测试的master节点开启keepalived的时候的样子(下面这个master节点的是我改了nginx页面后呈现的,nginx的html在:/usr/local/nginx/html/index.html)

 关闭master节点关闭keepalived

[root@master ~]# systemctl stop keepalived

 关闭后出现的页面

从中得出的结论就是,关闭master节点的keepalived,那么backup节点的就会顶上去

二、LVS高并发集群

LVS了解

LVS就是Linux虚拟服务器,Linxu virtual server,是由章文嵩博士主导开发的负载均衡项目。该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,其体系结构如图1所示,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器。

负载均衡

  • 负载均衡(Load Balance):负载均衡集群为企业需求提供了可解决容量问题的有效方案。负载均衡集群使负载可以在计算机集群中尽可能平均地分摊处理。
  • 负载通常包括应用程序处理负载和网络流量负载,每个节点都可以承担一定的处理负载,并且可以实现处理负载在节点之间的动态分配,以实现负载均衡。------原文链接:https://blog.csdn.net/hanjinjuan/article/details/120274878

负载均衡集群技术的实现

  • 负载均衡技术类型:基于 4 层负载均衡技术、基于 7 层负载均衡技术
  • 负载均衡实现方式:硬件负载均衡设备、软件负载均衡
  • 硬件负载均衡产品:F5 、深信服 、Radware
  • 软件负载均衡产品: LVS(Linux Virtual Server)、 Haproxy、Nginx、Ats(apache traffic server) ------原文链接:https://blog.csdn.net/hanjinjuan/article/details/120274878

四层负载和七层负载

第四层:传输层

第七层:应用层

所谓四层就是基于IP+端口的负载均衡,主要代表有LVS。

七层负载也称内容交换,就是基于URL等应用信息的负载均衡,主要代表有nginx。

NAT模式LVS搭建

准备

节点 作用 网卡 IP
dir LVS服务 NAT网卡/仅主机网卡 192.2168.200.130/192.168.100.128
rs1 web服务1 NAT网卡 192.168.200.131
rs2 web服务2 NAT网卡 192.168.100.132

LVS服务器必须要有两张网卡,一张网卡用来模拟外网(仅主机),一张网卡连接内网(NAT)。LVS服务器的作用就是以仅主机网卡,通信NAT网卡进入内网。所以clinet节点只需要有外网网卡即可(仅主机)。而web服务器只需要内网网卡(NAT)。

dir节点

#启动路由功能
[root@dir ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
#安装LVS
[root@dir ~]# yum install ipvsadm -y
[root@dir ~]# ipvsadm -A -t 192.168.100.128:80 -s rr
上一行代码解释:-A:暴露对外的虚拟服务器、-t:使用TCP协议、IP是仅主机的IP地址(外网IP)、-s:是使用此策略、rr:是轮巡回策略
[root@dir ~]# ipvsadm -a -t 192.168.100.128:80 -r 192.168.200.131:80 -m 
[root@dir
~]# ipvsadm -a -t 192.168.100.128:80 -r 192.168.200.132:80 -m
上一行代码解释:-a:对内暴露真实服务器、-t:使用TCP协议、第一个IP是仅主机IP(外网IP)、-r:连接到真是服务器

rs1节点

rs2节点也是这样

#下载httpd
[root@rs1 ~]# yum install  httpd -y
#启动httpd
[root@rs1 ~]# systemctl start httpd
#设置httpd自启
[root@rs1 ~]# systemctl enable httpd
[root@rs1 ~]# route add -net 192.168.100.0/24 gw 192.168.200.130
上一行代码解释:route add:添路由、-net:设置网段、第一个IP是仅主机IP、gw:写网关、最后一个IP是dir的内网IP

开始访问。以下图为标准这就是成功了。

如果不是这样的你可以看看你三个虚拟机的防火墙和SElinux是否关着。

 

 keepalived+LVS

节点 服务 IP
dir keepalived+LVS 192.168.200.130
rs1 httpd 192.168.200.131

rs2

httpd 192.168.200.132

dir节点

[root@dir ~]# vim /usr/local/sbin/lvs_dr.sh
#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/usr/sbin/ipvsadm
vip=192.168.200.110
rs1=192.168.200.131
rs2=192.168.200.132
#注意这里的网卡名字
ifconfig ens33:2 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev ens33:2
$ipv -C
$ipv -A -t $vip:80 -s wrr
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1

[root@dir ~]# yum install -y keepalived ipvasdm [root@dir ~]# vim /etc/keepalived/keepalived.conf //添加内容如下 vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.200.110 } } virtual_server 192.168.200.110 80 { #VIP delay_loop 10 #每隔10秒查询realserver状态 lb_algo wlc #lvs算法 lb_kind DR #DR模式 persistence_timeout 60 #(同一IP的连接60秒内被分配到同一台realserver) protocol TCP #用TCP协议检查realserver状态 real_server 192.168.200.131 80 { #真实服务器ip weight 100 #权重 TCP_CHECK { connect_timeout 10 # 10秒无响应超时(连接超时时间) nb_get_retry 3 #失败重试次数 delay_before_retry 3 #失败重试的间隔时间 connect_port 80 #连接的后端端口 } } real_server 192.168.200.132 80 { weight 100 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
#ipvsadm规则清空 [root@dir
~]# ipvsadm -C [root@dir ~]# systemctl start keepalived [root@dir ~]# systemctl enabe keepalived

rs节点

rs1跟rs2一样操作

[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地址给客户端
#参考文档www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
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
 
[root@rs1 ~]# bash /usr/local/sbin/lvs_rs.sh 
[root@rs2 ~]# bash /usr/local/sbin/lvs_rs.sh 

 测试:

[root@dir ~]# ipvsadm -ln

 

posted @ 2022-03-01 19:57  花花de代码生活  阅读(118)  评论(0编辑  收藏  举报