haproxy负载均衡+pcs高可用+fence

实验环境:

  • 母盘为redhat7.6的操作系统,快照出四台虚拟机
    在这里插入图片描述
  • 给真机和虚拟机都加上地址解析,如上图所示
  • 通过真机的httpd服务给虚拟机搭建7.6的网络软件仓库
  • 关闭防火墙,selinux状态设为disabled

一、HAproxy简介:

  • HAProxy是一个使用C语言编写的自由及开放源代码软件[1],其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
  • HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

二、HAproxy的安装配置:

安装及负载均衡配置

[root@server1 ~]# yum install haproxy -y
[root@server1 ~]# cat /etc/haproxy/haproxy.cfg

#---------------------------------------------------------------------
# Exmple configuration for a possible web application.  See the
# full configuration options online.
#
#   http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
#
#---------------------------------------------------------------------
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    # to have these messages end up in /var/log/haproxy.log you will
    # need to:
    #
    # 1) configure syslog to accept network log events.  This is done
    #    by adding the '-r' option to the SYSLOGD_OPTIONS in
    #    /etc/sysconfig/syslog
    #
    # 2) configure local2 events to go to the /var/log/haproxy.log
    #   file. A line like the following can be added to
    #   /etc/sysconfig/syslog
    #
    #    local2.*                       /var/log/haproxy.log
    #
    log         127.0.0.1 local2
 
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000
 
    stats uri /status
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend  main *:80
#    acl url_static       path_beg       -i /static /images /javascript /stylesheets
#    acl url_static       path_end       -i .jpg .gif .png .css .js
#
#    use_backend static          if url_static
    default_backend             app
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
#backend static
#    balance     roundrobin
#    server      static 127.0.0.1:4331 check
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app
    balance     roundrobin
    server  app1 172.25.4.2:80 check
    server  app2 172.25.4.3:80 check

配置文件修改位置:

在这里插入图片描述

[root@server1 ~]# systemctl start haproxy.service 
[root@server1 ~]# netstat -antlp | grep 80

在这里插入图片描述
测试:
网页查看后端状态:
在这里插入图片描述

负载均衡:
在这里插入图片描述
当down掉某台后端的httpd服务时:

[root@server2 ~]# systemctl stop httpd

在这里插入图片描述
在这里插入图片描述
有以上结果,说明对后端有健康检查功能。

算法配置和加密访问

haproxy的八种负载均衡算法:

  • roundrobin
    基于权重进行轮询,在服务器的处理时间保持均匀分布时,这是最平衡,最公平的算法.此算法是动态的,这表示其权重可以在运行时进行调整.不过在设计上,每个后端服务器仅能最多接受4128个连接
  • static-rr
    基于权重进行轮叫,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效.不过,其在后端服务器连接数上没有限制
  • leastconn
    新的连接请求被派发至具有最少连接数目的后端服务器.在有着较长时间会话的场景中推荐使用此算法,如LDAP、SQL等;其并不太适用于较短会话的应用层协议,如HTTP.此算法是动态的,可以在运行时调整其权重
  • first
    第一个具有可用连接槽的服务器得到连接.这些服务器将从最小到最大的id选择.一旦一个服务器到达它的最大连接数,下一个服务器将被使用.如果不定义每个服务器的maxconn参数,这个算法是无意义的.使用这个算法的目的是尽量使用最小数量的服务器以便于其他服务器可以在非密集时段待机.这个算法将忽略服务器权重
  • source
    将请求的源地址进行hash运算,并由后端服务器的权重总数相除后派发至某匹配的服务器.这可以使得同一个客户端IP的请求始终被派发至某特定的服务器.不过,当服务器权重总数发生变化时,如某服务器宕机或添加了新的服务器,许多客户端的请求可能会被派发至与此前请求不同的服务器.常用于负载均衡无cookie功能的基于TCP的协议.其默认为静态,不过也可以使用hash-type修改此特性
  • uri
    对URI的左半部分(“?”标记之前的部分)或整个URI进行hash运算,并由服务器的总权重相除后派发至某匹配的服务器.这可以使得对同一个URI的请求总是被派发至某特定的服务器,除非服务器的权重总数发生了变化.此算法常用于代理缓存或反病毒代理以提高缓存的命中率.需要注意的是,此算法仅应用于HTTP后端服务器场景.其默认为静态算法,不过也可以使用hash-type修改此特性
  • url_param
    通过< argument>为URL指定的参数在每个HTTP GET请求中将会被检索.如果找到了指定的参数且其通过等于号”=”被赋予了一个值,那么此值将被执行hash运算并被服务器的总权重相除后派发至某匹配的服务器.此算法可以通过追踪请求中的用户标识进而确保同一个用户ID的请求将被送往同一个特定的服务器,除非服务器的总权重发生了变化.如果某请求中没有出现指定的参数或其没有有效值,则使用轮叫算法对相应请求进行调度.此算法默认为静态的,不过其也可以使用hash-type修改此特性
  • hdr(< name>)
    对于每个HTTP请求,通过< name>指定的HTTP首部将会被检索.如果相应的首部没有出现或其没有有效值,则使用轮询算法对相应请求进行调度.其有一个可选选项”use_domain_only”,可在指定检索类似Host类的首部时仅计算域名部分(比如通过www.baidu.com来说,仅计算”baidu”字符串的hash值)以降低hash算法的运算量.此算法默认为静态的,不过其也可以使用hash-type修改此特性

算法定义在此处,系统默认的算法为roundrobin:
在这里插入图片描述
加密访问:

[root@server1 ~]# vim /etc/haproxy/haproxy.cfg 
[root@server1 ~]# systemctl restart haproxy.service

用户名为admin,密码为sk:
在这里插入图片描述

在这里插入图片描述

三、HAproxy的日志管理:

[root@server1 ~]# vim /etc/security/limits.conf   #在最后一行加上下文的语句,即改即生效
[root@server1 ~]# cat /etc/security/limits.conf | tail -1
haproxy         -        nofile          4096
[root@server1 ~]# vim /etc/sysconfig/rsyslog #在双引号里加上-r

在这里插入图片描述

[root@server1 ~]# vim /etc/rsyslog.conf
[root@server1 ~]# systemctl restart rsyslog.service

取消下面两行的注释:
在这里插入图片描述
指定存放路径,重启日志服务:
在这里插入图片描述
刷新网页监控,生成新的日志,查看:
在这里插入图片描述

四、haproxy的动静分离:

把server3作为静态后端,负责写入数据,在server2上查看:

[root@server1 ~]# vim /etc/haproxy/haproxy.cfg 
[root@server1 ~]# systemctl restart haproxy.service

在这里插入图片描述
在这里插入图片描述

用户只能访问到server2:
在这里插入图片描述
在server3上下载一张图片:

[root@server3 ~]# cd /var/www/html 
[root@server3 html]# mkdir images
[root@server3 html]# cd images/
[root@server3 images]# mv ~/vim.jpg  .
[root@server3 images]# ls
vim.jpg

在网页上访问:
在这里插入图片描述
设置访问黑名单

在这里插入图片描述
在这里插入图片描述

重定向
即访问被拒绝403时自动切换到指定页面(www.baidu.com):
在这里插入图片描述
在这里插入图片描述
重定向2
在这里插入图片描述
在这里插入图片描述

五、haproxy的读写分离:

在这里插入图片描述
server2:

[root@server2 html]# yum install -y php
[root@server2 html]# cd /var/www/html/
[root@server2 html]# mkdir upload
[root@server2 html]# chmod 777 upload
[root@server2 html]# vim index.php
<html>
<body>

<form action="upload_file.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>

</body>
</html>
[root@server2 html]# vim upload_file.php
<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 2000000))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
 
    if (file_exists("upload/" . $_FILES["file"]["name"]))
      {
      echo $_FILES["file"]["name"] . " already exists. ";
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "upload/" . $_FILES["file"]["name"]);
      echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
      }
    }
  }
else
  {
  echo "Invalid file";
  }
?>
[root@server2 html]# systemctl  restart httpd

server3上执行上述同样的操作。
测试:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六、corosync+pacemaker高可用部署:

  • pacemaker是一个开源的高可用资源管理器(CRM),位于HA集群架构中资源管理、资源代理(RA)这个层次,它不能提供底层心跳信息传递的功能,要想与对方节点通信需要借助底层的心跳传递服务,将信息通告给对方。(作为通信层和提供关系管理服务,心跳引擎,检测心跳信息)
  • Corosync是集群管理套件的一部分,它在传递信息的时候可以通过一个简单的配置文件来定义信息传递的方式和协议等。

实验在server4上部署:
安装部署

[root@server4 ~]# yum install haproxy.x86_64 -y  
[root@server4 ~]# scp server1:/etc/haproxy/haproxy.cfg /etc/haproxy/
[root@server4 ~]# systemctl disable --now haproxy.service
[root@server4 ~]# ssh-keygen
[root@server4 ~]# ssh-copy-id server1  #对server1执行免密操作
[root@server4 ~]# vim /etc/yum.repos.d/dvd.repo #添加高可用软件仓库:

[dvd]
name=rhel7.6
baseurl=http://172.25.4.250/rhel7.6
gpgcheck=0

[HighAvailability]
name=HighAvailability
baseurl=http://172.25.4.250/rhel7.6/addons/HighAvailability
gpgcheck=0
[root@server4 ~]# scp /etc/yum.repos.d/dvd.repo server1:/etc/yum.repos.d/
[root@server4 ~]# yum install -y pacemaker pcs psmisc policycoreutils-python
[root@server4 ~]# ssh server1 yum install -y pacemaker pcs psmisc policycoreutils-python
[root@server4 ~]# systemctl enable --now pcsd.service
[root@server4 ~]# ssh server1 systemctl enable --now pcsd.service
[root@server4 ~]# passwd hacluster #为hacluster用户设置密码,在两个server上使用相同的密码,同步corosync配置,或者在其他server上启动和停止集群
[root@server4 ~]# ssh server1 "echo westos | passwd --stdin hacluster"

在这里插入图片描述

[root@server4 ~]# pcs cluster auth server1 server4

在这里插入图片描述
建立集群,同步corosync配置

[root@server4 ~]# pcs cluster setup --name mycluster server1 server4 

在这里插入图片描述

启动集群并设置开机自启:

[root@server4 ~]# pcs cluster start --all
[root@server4 ~]# pcs cluster enable --all

在这里插入图片描述
查看集群状态

[root@server4 ~]# pcs status

在这里插入图片描述

上图中出现了警告,解决此警告:

[root@server4 ~]# crm_verify -LV  #检查报错
[root@server4 ~]# pcs property set stonith-enabled=false
[root@server4 ~]# crm_verify -LV

在这里插入图片描述
添加资源

[root@server4 ~]# pcs resource --help 
[root@server4 ~]# pcs resource create vip ocf:heartbeat:IPaddr2 ip=172.25.4.100 op monitor interval=30s
[root@server4 ~]# pcs status
ocf资源脚本所遵循的标准以及在何处执行
heartbeat特定标准,提供脚本资源
IPaddr2资源脚本的名称
op monitor监控
interval=30s监控频率

在这里插入图片描述
测试故障转移,关闭server1:

[root@server4 ~]# pcs cluster stop server1
[root@server4 ~]# pcs status

在这里插入图片描述

[root@server4 ~]# pcs cluster start server1
[root@server4 ~]# pcs status

重启server1后,vip依然在server4上(对于旧版本的pacemaker,集群可能会将IP移回其原始位置server1)
在这里插入图片描述
接入haproxy资源

[root@server4 ~]# pcs resource agents systemd | grep haproxy # 查看资源管理器中有没有haproxy程序管理
[root@server4 ~]# pcs resource create haproxy systemd:haproxy op monitor interval=60s
[root@server4 ~]# pcs status

在这里插入图片描述
建立资源管理组hagroup,约束资源,控制资源启动顺序,使其运行在统一服务器上:

[root@server4 ~]# pcs resource group add hagroup vip haproxy
[root@server4 ~]# pcs status

在这里插入图片描述
创建资源管理组完成后即可成功访问:
在这里插入图片描述

高可用测试
如果VIP或者haproxy停止工作,那么集群就会自动添加VIP或者重启haproxy,在本地恢复:

[root@server4 ~]# systemctl stop haproxy.service 
[root@server4 ~]# pcs status

在这里插入图片描述

如果将正在使用的服务器的网卡down掉,他会自动跳到集群另外一台服务器上:

[root@server4 ~]# ip link set down eth0
[root@server1 ~]# pcs status

注:如果是用主机连接的虚拟机,down掉网卡后连接会中断,所以需要在server1上查看状态
在这里插入图片描述
注:再次启动server4网卡后,服务会自动跳转回server4:
在这里插入图片描述
在这里插入图片描述

七、fence(stonith):

在这里插入图片描述

  • 每个节点之间互相发送探测包进行判断节点的存活性。一般会有专门的线路进行探测,这条线路称为“心跳线”(上图直接使用eth0线路作为心跳线)。假设node1的心跳线出问题,则node2和node3会认为node1出问题,然后就会把资源调度在node2或者node3上运行,node1会认为自己没问题不让node2或者node3抢占资源,此时就出现了脑裂。

此时如果在整个环境里有一种设备直接把node1断电,则可以避免脑裂的发生,这种设备叫做fence或者stonith

  • stonith是“shoot the other node in the head”的首字母简写,它是Heartbeat软件包的一个组件,它允许使用一个远程或“智能的”连接到健康服务器的电源设备自动重启失效服务器的电源,stonith设备可以关闭电源并响应软件命令,运行Heartbeat的服务器可以通过串口线或网线向stonith设备发送命令,它控制高可用服务器对中其他服务器的电力供应,换句话说,主服务器可以复位备用服务器的电源,备用服务器也可以复位主服务器的电源。
[root@server4 ~]# yum install -y fence-virt.x86_64
[root@server4 ~]# ssh server1 yum install -y fence-virt.x86_64
[root@server4 ~]# pcs stonith  list     #列出stonith列表
fence_virt - Fence agent for virtual machines
fence_xvm - Fence agent for virtual machines

在真机172.25.4.250(foundation40)上:

[root@foundation40 Desktop]# dnf install fence-virtd-libvirt.x86_64 fence-virtd-multicast.x86_64 fence-virtd.x86_64 -y
[root@foundation40 Desktop]# fence_virtd -c
需要手动输入的只有
Interface [virbr0]: br0 # 此处需要输入网桥网卡名

在这里插入图片描述
生成的密钥路径:
在这里插入图片描述
生成密钥,需手动建立目录:

[root@foundation40 Desktop]# cd /etc/
[root@foundation40 etc]# mkdir cluster
[root@foundation40 etc]# cd cluster/
[root@foundation40 cluster]# dd if=/dev/urandom of=fence_xvm.key bs=128 count=1
1+0 records in
1+0 records out
128 bytes copied, 5.1372e-05 s, 2.5 MB/s
[root@foundation40 cluster]# systemctl restart fence_virtd.service
[root@foundation40 cluster]# ls
fence_xvm.key

建立真机和虚拟机的免密:

[root@server4 ~]# mkdir /etc/cluster
[root@server4 ~]# ssh server1 mkdir /etc/cluster
[root@foundation40 cluster]# scp fence_xvm.key server1:/etc/cluster/
[root@foundation40 cluster]# scp fence_xvm.key server4:/etc/cluster/

将fence设备添加到集群:

[root@server4 ~]# pcs stonith create vmfence fence_xvm pcmk_host_map="server1:server1;server4:server4" op monitor interval=60s
[root@server4 ~]# pcs status
[root@server4 ~]# pcs property set stonith-enabled=true #开启

在这里插入图片描述
测试:

[root@server1 ~]# pcs status
[root@server1 ~]# echo c > /proc/sysrq-trigger #模拟内核崩溃,服务所在机上操作

在这里插入图片描述

执行操作后,进入虚拟机管理界面,查看server1的运行状态:
发现自动断电重启:
在这里插入图片描述
重启后查看发现server4已经接管服务,虚拟fence也已转移:
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值