其他分享
首页 > 其他分享> > haproxy-负载均衡及高可用集群、读写分离、结合pacemaker高可用、结合fence防止文件系统脑裂

haproxy-负载均衡及高可用集群、读写分离、结合pacemaker高可用、结合fence防止文件系统脑裂

作者:互联网

目录:

介绍

在前面和本片文章都有介绍:lvs、haproxy、nginx。
基于软件的负载均衡:软件有lvs、haproxy、nginx。
lvs是工作在四层、仅负责分发请求作用的负载均衡,负载均衡性能最强。Lvs实现负载均衡可结合keepalived进行后端健康检测。
nginx工作在7层,针对http应用做一些策略配置,可以检测后端端口故障,最大的优点是并发量高,且支持二次开发,商用价值高。
haproxy是工作在4/7层,提供高可用性和负载均衡。支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy运行在时下的硬件上,完全可以支持数以万计的 并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

一.haproxy负载均衡

实验环境:
我们需要做的准备工作为:(ip自己随意使用自己)
server1 172.25.1.1 作为haproxy服务器及集群管理服务器
server2 172.25.1.2 负载均衡(后端服务器)
server3 172.25.1.3 负载均衡(后端服务器)
server4 172.25.1.4 集群管理服务器

安装配置haproxy

[root@server1 ~]# yum install haproxy -y

配置vim /etc/haproxy/haproxy.cfg
只需要修改其中的一部分,自行参考:有的需要注释掉!


stats uri /status
        
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
#---------------------------------------------------------------------
backend app
    balance     roundrobin
    server  app1 172.25.1.2:80 check
    server  app2 172.25.1.3:80 check

在这里插入图片描述

在这里插入图片描述vim /etc/security/limits.conf

在这里插入图片描述

配置完成之后开启服务并查看服务状态
80端口开启了服务

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

在这里插入图片描述
当然需要在server2,server3上开启httpd服务
之后,就可以在网页进行测试:
172.25.1.1/status
在这里插入图片描述

HAProxy的日志管理

编辑文件:加入haproxy的日志信息!

取消注释udp的两行!
    [root@server1 ~]# vim /etc/rsyslog.conf
    取消注释
    最后添加
    local2.* 			/var/log/haproxy.log
    [root@server1 ~]# systemctl restart rsyslog.service

在这里插入图片描述

在这里插入图片描述
当重启服务或者有操作的时候,错误日志文件才会出现不然不会出现
之后我们在重启haproxy出现问题,失败的时候,就可以查看日志报错修复
vim /var/log/haproxy.log
在这里插入图片描述

status添加用户认证

若是在配置文件中添加用户认证 登陆需要用户和密码:
vim /etc/haproxy/haproxy.cfg

stats uri /status
status auth admin:westos

在这里插入图片描述
重启服务:
systemctl reload haproxy.service
然后访问网页:
在这里插入图片描述

如果访问的是 172.25.1.1不断刷新,就会出现负载均衡
在这里插入图片描述

在这里插入图片描述刚才的配置文件中最下面添加的app下面的参数 roundrobin:

roundrobin算法(根据服务器权重轮询的算法,可以自定义权重,它支持慢启动,并能在运行时修改权重,所以是一种动态算法。
在客户端上进行负载均衡测试:
for i in {1…10}; do curl 172.25.1.1 ;done
结果如下:
在这里插入图片描述

权重

若是在后面加上权重:
因为默认的权重是1,若是后面协会写2已经是权重变大了!
如下如:
在这里插入图片描述

这样再负载均衡的时候,server2的次数会是server3的两倍!

source 调度算法(对请求的源IP地址进行hash处理,根据hash运算处理结果调度至后端服务器。可使固定IP的请求始终调度至统一服务器。)

在这里插入图片描述

这样会把IP锁定在一个地址:
在这里插入图片描述

当关闭某server3服务器的http服务时如下:说明其具有对后端服务器健康检查的功能 在这里插入图片描述

图片访问锁定

写入图片的格式:
在这里插入图片描述
static地址改为172.25.1.3:80 check

在这里插入图片描述

我们需要在server3上建立目录放入图片

cd /var/www/html
mkdir  images/
put vim,jpd

在这里插入图片描述

放入什么图片都可以,只要格式符合即可!!!
我放入两张:
访问网页:172.25.1.1/images/vim.jpg
在这里插入图片描述
再次访问172.25.1.1/images/iso7.gif

在这里插入图片描述

访问黑名单

acl blacklist src 172.25.1.250/24
block if blacklist

在这里插入图片描述再次访问,发现拒绝访问:403
在这里插入图片描述

错误403:重定向

若是不想出现访问失败的界面,而是想让客户访问另外一个网页需要重定向!
需要把错误403定向到一个网页 :
配置如下:
在这里插入图片描述
再次访问网页172。25。1。1
跳转到了百度
在这里插入图片描述
在这里插入图片描述

重定向

将前面的错误403重定向注释掉
redirect location http://www,taobao.com

在这里插入图片描述

在这里插入图片描述

二.结合PHP

在server3上安装php
yum install -y php
修改php默认发布页面

cd /var/www/html
vim index.hrml
<?php
phpinfo()
?>
systemctl restart httpd

在这里插入图片描述

接着修改haproxy中的配置文件
vim /etc/haproxy/haproxy.cfg

以.php结尾的转到访问static

在这里插入图片描述

这时候,再次访问172.25.1.1/index.php 跳转到了 172.25.1.3/index.php
在这里插入图片描述

三.HAProxy的读写分离

vim /etc/haproxy/haproxy.cfg

acl write method POST
acl write method PUT

use_backend_static 				if write

在这里插入图片描述当然需要在配置文件最后面修改static的地址:
在这里插入图片描述

server2和server3同样操作

[root@server2 html]# yum install php -y
[root@server3 html]# yum install php -y

变为完后发给server3:
scp index.php server3:/var/www/html/

[root@serve2 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
[root@server2 html]# mkdir upload
[root@server2 html]# chmod 777 upload

编辑后,把目录和文件发给server3上:
scp -r upload upload_file.php server3:/var/www/html/

<?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";
  }
?>

修改完之后,重启httpd服务

测试: 读得时候,访问的是server2的php
在这里插入图片描述
点击choose file选择一张图片
因为刚才的php代码里面写了图片的格式可以为下面三种,找到符合的图片,或者修改代码为你的图片格式都可以!!

if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))

然后submit提交
在这里插入图片描述

可以发现提交的图片出现在server3刚才建立的uoload目录上,而server2上没有:

在这里插入图片描述

四.pacemaker+haproxy双机热备

corosync是集群框架引擎程序,pacemaker是高可用集群资源管理器
准备server4机子:
下载及配置,修改软件仓库,安装高可用插件
vim /etc/yum.repos.d/dvd.repo

cat /etc/yum.repos.d/dvd.repo
因为虚拟机使用的是redhat 7.6的镜像,所以镜像下本来就有高可用的包!
server1,server4都需要配置:

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

[HighAvailability]
name=dvd HighAvailability
baseurl=http://172.25.1.254/rhel7.6/addons/HighAvailability
gpgcheck=0

在server1,server4都需要下载!!

    [root@server4 ~]# yum install haproxy.x86_64
    [root@server4 ~]# ssh-keygen
    [root@server4 ~]# ssh-copy-id server1
    [root@server4 ~]# yum install -y pacemaker pcs psmisc policycoreutils-python
    [root@server4 ~]# ssh server1 yum install -y pacemaker pcs psmisc policycoreutils-python
    [root@server4 yum.repos.d]# systemctl enable --now pcsd.service
    [root@server4 yum.repos.d]# ssh server1 systemctl enable --now pcsd.service

把server1上前面修改的配置文件发给server4

[root@server1 haproxy]# scp /etc/haproxy/haproxy.cfg server4:/etc/haproxy/

给用户密码

    [root@server4 ~]# passwd hacluster   #westos
    [root@server4 ~]# ssh server1 passwd hacluster
    ## 给用户密码##

在这里插入图片描述

接下来进行集群的认证:

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

在这里插入图片描述

[root@server4 ~]# pcs cluster setup --name mycluster server
##在同一个节点上使用pcs集群设置来生成和同步crosync配置##

在这里插入图片描述

开启集群服务,开启开机自动启动:

    [root@server4 ~]# pcs cluster start --all
    ##启动集群##
    [root@server4 ~]# pcs cluster enable --all
    ##开机自启动##

在这里插入图片描述

在这里插入图片描述

搞定之后,查看一下配置如下:
pcs status:看到server1,server4都在线即可!
在这里插入图片描述

如果查看集群状态报错

[root@server4 ~]# crm_verify -LV

如下图:
在这里插入图片描述

那是因为没有将stonith-enabled=false

[root@server4 ~]# pcs property set stonith-enabled=false

设置后在查看!:
刚才的pcs status的警告也消失了!
在这里插入图片描述

既然需要完成高可用,那么就和前面学习的lvs ,nginx的高可用一样
需要设置vip进行变化
添加的vip为自己网段的100号:172.25.1.100

[root@server4 ~]# pcs resource --help
[root@server4 ~]# pcs resource create ClusterIP ocf:heartbeat:IPaddr2 ip=172.25.1.100 op monitor interval=30s

查看状态,可以看到vip在server1上:
在这里插入图片描述

这个时候我们停掉server1的状态:

[root@server4 ~]# pcs cluster stop server1

因为高可用,固然会飘到server4上!
在这里插入图片描述

    [root@server4 ~]# pcs resource agents systemd | grep haproxy
    ##查看资源管理器中有没有haproxy程序管理##
    root@server4 ~]# pcs resource create haproxy systemd:haproxy op monitor interval=60s
##将haproxy与集群建立连接##

在这里插入图片描述

在这里插入图片描述在查看pcs status的时候我们看到
clusterip 和haproxy分别在不同的虚拟机,server1,server4

在这里插入图片描述
我们需要把这两个参数所在的虚拟机固定在一个上面,这样才能实现高可用!!
建立资源管理组,约束资源,控制资源启动顺序,使其运行在统一服务器上

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

再次查看状态发现ok!
在这里插入图片描述
如果ClusterIP或者haproxy服务停掉,集群就会自动重启服务或者添加ClusterIP

比如测试一下:关掉server4的服务 haproxy.service

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

我们会发现haproxy显示server4失败
下面也会有失败的提示:
在这里插入图片描述

但是等一会在查看就会发现重新启动了服务:因为高可用会先检测状态,再启动服务,若是启动失败才会切换master!!
在这里插入图片描述
如果将正在使用的服务器的网卡down掉,他会自动跳到集群另外一台服务器上:因为网断掉之后,无法重新启动,只能切换!

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

而且server4已经下线了
在这里插入图片描述

但是这个时候,看一下server4的状态,发现卡死在那里了!!除非手动关掉server1,在重启才会重新加入集群中!!
但是这就有问题了:
若是server1也坏了,没有人发现进行手动重启,那岂不是文件系统脑裂!
,客户端就会访问出问题!那么我们需要找到办法让挂掉的机子重新自动重启!
我们接下来就需要结合fence来使用!

fence结合pacemaker防止文件系统脑裂

在server4,1上

[root@server4 ~]# yum install -y fence-virt.x86_64
[root@server4 ~]# ssh server1 yum install -y fence-virt.x86_64

查看模块
stonith_admin -I
stonith_admin -M -a fence_xvm

在这里插入图片描述

在这里插入图片描述

##在真机下载##

[root@Sun_s ~]# dnf install fence-virtd-libvirt.x86_64 fence-virtd-multicast.x86_64 fence-virtd.x86_64 -y

[root@Sun_s ~]# fence_virtd -c

出现的选项直接enter下一步:
直到Interface [virbr0]: br0手动输入br0
如下:

    [root@Sun_s ~]# fence_virtd -c
    Module search path [/usr/lib64/fence-virt]: 
     
    Available backends:
        libvirt 0.3
    Available listeners:
        multicast 1.2
     
    Listener modules are responsible for accepting requests
    from fencing clients.
     
    Listener module [multicast]: 
     
    The multicast listener module is designed for use environments
    where the guests and hosts may communicate over a network using
    multicast.
     
    The multicast address is the address that a client will use to
    send fencing requests to fence_virtd.
     
    Multicast IP Address [225.0.0.12]: 
     
    Using ipv4 as family.
     
    Multicast IP Port [1229]: 
     
    Setting a preferred interface causes fence_virtd to listen only
    on that interface.  Normally, it listens on all interfaces.
    In environments where the virtual machines are using the host
    machine as a gateway, this *must* be set (typically to virbr0).
    Set to 'none' for no interface.
     
    Interface [virbr0]: br0
     
    The key file is the shared key information which is used to
    authenticate fencing requests.  The contents of this file must
    be distributed to each physical host and virtual machine within
    a cluster.
     
    Key File [/etc/cluster/fence_xvm.key]: 
     
    Backend modules are responsible for routing requests to
    the appropriate hypervisor or management layer.
     
    Backend module [libvirt]: 
     
    The libvirt backend module is designed for single desktops or
    servers.  Do not use in environments where virtual machines
    may be migrated between hosts.
     
    Libvirt URI [qemu:///system]: 
     
    Configuration complete.
     
    === Begin Configuration ===
    backends {
    	libvirt {
    		uri = "qemu:///system";
    	}
     
    }
     
    listeners {
    	multicast {
    		port = "1229";
    		family = "ipv4";
    		interface = "br0";
    		address = "225.0.0.12";
    		key_file = "/etc/cluster/fence_xvm.key";
    	}
     
    }
     
    fence_virtd {
    	module_path = "/usr/lib64/fence-virt";
    	backend = "libvirt";
    	listener = "multicast";
    }
     
    === End Configuration ===
    Replace /etc/fence_virt.conf with the above [y/N]? y

它会 生成一个密钥文件在这里:
在这里插入图片描述

所以我们需要建立这个目录,让密钥可以方进去

    [root@Sun_s ~]# cd /etc/
    [root@Sun_s etc]# mkdir cluster/
    ##由于这个目录没有,所以需要手动创建##
    [root@Sun_s cluster]# dd if=/dev/urandom of=fence_xvm.key bs=128 count=1
    ##生成密钥##

在这里插入图片描述
之后,重启服务

[root@Sun_s cluster]# systemctl restart fence_virtd.service

在server1,4上建立目录

    [root@server4 ~]# mkdir /etc/cluster
    [root@server4 ~]# ssh server1 mkdir /etc/cluster
    ##创建目录存放密钥##
    [root@server4 ~]# pcs stonith create vmfence fence_xvm pcmk_host_map="server1:sun1;server4:sun4" op monitor interval=60s
    “将主机名和设备对应关系”加到集群中

把刚才生成的密钥给资源管理的服务器server1,server4

[root@Sun_s cluster]# scp fence_xvm.key root@172.25.1.4:/etc/cluster/
[root@Sun_s cluster]# scp fence_xvm.key root@172.25.1.1:/etc/cluster/

再次查看server4的pcs status
发现fence 已经加入进来
在这里插入图片描述因为前面stonith-enabled关闭了,记得吗?
开启它!

[root@server4 ~]# pcs property set stonith-enabled=true
##将stonith启用##

测试:
打开server1的虚拟窗口观察变化

[root@server1 ~]# echo c > /proc/sysrq-trigger
##将server1模拟系统崩溃##此时打开server1的虚拟窗口观察变化

它和前面高可用不同,这个它会自动重启,而前面需要手动重启!
在这里插入图片描述

我们再查看一下状态::
因为server1前面挂掉了,vip,haprox所以转移到了server4上
而fence服务修复了server1,所以会停留在server1上!
在这里插入图片描述

若是把server4挂掉,那么server4就会自动重启,vip,haprox所以转移到了server1上
而fence服务修复了server4,所以会停留在server4上!

标签:haproxy,fence,可用,server4,server1,##,pacemaker,root
来源: https://blog.csdn.net/qq_46490950/article/details/118675195