Linux集群存储——day3——keepalived的高可用服务、HAProxy的负载均衡服务

端口监测

   nmap  命令进行测试
    需要装包 nmap
    可以进行检测具体的IP的某个端口
nmap -sS -n -p 端口 检测的主机IP | grep open
[ $? -eq 0 ] && echo  端口开放  ||  echo 端口未开放


HA 高可用集群

    软件名:keepalived
    服务: keepalived
    主配置文件:/etc/keepalived/keepalived.conf(可以在进行配置修改前做个备份)

  keepalived可以做两种高可用集群,一个是就单个服务解决单点故障问题的高可用,另一个是结合LVS实现分发器的高可用(起初设计keepalived的目的)

   1. 对于普通服务的高可用,也就是在已经搭建了具体服务的服务器上进行操作
      先是装包、再配置、最后启服务
      对于配置就是修改配置文件,主要修改里面的:
       global_defs 全局配置(主要是注销一个设置)
       vrrp_instance  具体服务配置
              --  修改HA服务器名
              --  修改是 主、辅 服务器
              --  修改优先级
              --  修改密码
              --  修改VIP
         删除后面所有无用的配置

   2. 对于 Keepalived + LVS 服务的配置
      首先要安装包两个服务的包都要安装 Keepalived 和 ipvsadm ,如果之前有做过LVS服务需要清除其中的所有配置和策略。
      然后进行配置,还是要先进行和为普通服务配置高可用一样的操作,再在进行一些特殊配置代替ipvsadm命令的操作,实现让 keepalived 根据具体情况具体配置
      最后启动服务(如果设置开机自启动需要把ipvsadm也开启,不过启动服务的时候只需要启动keepalived)
       virtual_server  具体的ipvsadm的规则
              --  修改调度算法
              --  修改工作模式
              --  修改各个真实服务器的RIP、权重
              --  开启健康性检查,如果真实服务器出现问题就自动将其移除,如果恢复了自动加回

     对于配置文件详细解释(有!结尾的是必须修改的部分内容)

! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]                   //设置报警收件人邮箱
   }
   notification_email_from root@localhost  //设置发件人的具体信息
   smtp_server 127.0.0.1                   //定义邮件服务器
   smtp_connect_timeout 30
   router_id LVS_DEVEL                //设置路由ID号
   vrrp_skip_check_adv_addr
 # vrrp_strict                    //必须将其注释 !
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance HA服务器名字 {                //名字
  state MASTER                         //主服务器为MASTER、辅服务器为BACKUP !
  interface eth0                    //定义网络接口
  virtual_router_id 50                //主辅VRID号必须一致
  priority 100                     //服务器优先级,优先级高优先获取VIP !
  advert_int 1                    //每多少秒查看一次
  authentication {
    auth_type pass
    auth_pass 密码                       //主辅服务器密码必须一致 !
  }
  virtual_ipaddress { 预备定义的VIP  }    //谁是主服务器谁获得该VIP !
}

virtual_server 预备定义的VIP 端口 {       //设置ipvsadm的VIP规则 !
  delay_loop 6
  lb_algo wrr                          //设置LVS调度算法为WRR !
  lb_kind DR                           //设置LVS的模式为DR !
  persistence_timeout 50              //多长时间内同一个客户的访问,将分发给同一个服务器,可以注释掉关闭该功能
  protocol TCP

  real_server 真实服务器的RIP1 端口 {          //设置后端web1服务器真实IP !
    weight 权重值                                 //设置权重 !
    TCP_CHECK {                    //对后端web2服务器的TCP协议进行检查,如果其相关服务如HTTP出问题了,就会自动删除相关的ipvs的配置,如果服务器重新可用了就会再添加到ipvs配置中
    connect_timeout 3
    nb_get_retry 3
    delay_before_retry 3
    }
  }
  real_server 真实服务器的RIP2 端口 {          //设置后端web2服务器真实IP !
    weight 权重值                                 //设置权重 !
    TCP_CHECK {                    //对后端web2服务器的TCP协议进行检查,如果其相关服务如HTTP出问题了,就会自动删除相关的ipvs的配置,如果服务器重新可用了就会再添加到ipvs配置中
    connect_timeout 3
    nb_get_retry 3
    delay_before_retry 3
    }
  }
}

注:
   1. 如果先开启的是辅服务器,那时候还没开主服务器,辅服务器并不会立刻获得vip 进行工作,需要等待一段时间,原因是他要反复确认主服务器不可用,不过也有可能。
   2. 每个关键字间,与大括号间都是有空格的
   3. 做 Keepalived + LVS 服务的时候需要安装ipvsadm,设置开机自启动的时候,ipvsadm也需要开启
   4. 做一些服务的HA高可用的时候,比如HTTP等,如果整个主服务器down机了,那么辅服务器的keepalived就会起作用,抢夺服务,这样保证服务的稳定,可是如果主服务器的核心服务突然出现出问题挂了的时候,keepalived就不会转移服务,这时候需要写脚本,结合nmap检测来实现,基本算法就算nmap发现某个服务挂了就把自己的keepalived关闭,这样服务就会被辅服务器取走从而继续提供服务
      但是对于lvs服务的高可用的时候不需要,因为只需要配置中开启检测 keepalived 就会自动完成该功能


HTTP的协议模型

  1. HTTP close 一次连接一个请求,依次访问
       客户端发送请求建立连接,然后服务端回应请求后断开连接
       适用于: 网页信息完整性高,安全性高的网页,每个数据都要认真传递,丢包率低
       缺点: 每次服务端只会响应一次请求,每次请求都要消耗资源建立TCP三次握手,导致延迟较大

  2. Keep-alive 一次连接多个请求,依次回应
       客户端发送请求建立连接,然后服务端回应请求,然后客户端可以继续发送请求,服务端继续回应,直到客户端请求断开
       适用于: 一般网页数据的传递
       缺点: 服务端必须让客户端知道传输数据的长度以避免无限期的等待,一个一个请求处理,效率不高

  3. Pipelining 一次连接多次请求,同步回应
       客户端发送请求建立连接,然后客户端可以发送多个请求,服务端多线程同步回复数据
       适用于: 大量图片视频的网页,效率极高,延迟低
       缺点: 安全性不如前面,丢包率也相对略高


HAProxy

    LVS是基于端口的LB负载均衡服务,如果像HTTP他具体域名想给不同的服务器负责,那LVS是不能实现的,这时候就要用HAProxy来实现基于uri的负载均衡
    url 是网络地址,也就是从协议http开始,里面有域名,还有具体访问的文件所在网络位置,
    uri 是资源位置,一般在web网页名中指的就是域名后面添加的网页文件所在的位置,不过和url关系比较复杂,就不细说了。

   搭建HAProxy的步骤:装包配置起服务
   装包 yum install haproxy
   修改配置文件:/etc/haproxy/haproxy.cfg
   启动服务:systemctl restart haproxy

   有三个工作模式
       mode http    客户端被深度分析后发给服务器
       mode tcp     客户端和服务器建立对话,不检查第七层协议
       mode health  只做健康状态检查

配置文件组成
    default  后面所有部分没有设置的参数就用这个缺省的参数
    frontend 根据接受客户端的数据包进行分类处理
    backed  根据连接的后端服务器,进行分类部署
    listen   吧fronted的基本配置和backed结合起来配置

配置文件内容的详细解释:

global                # 采用全局配置
 log 127.0.0.1 local2
 chroot /usr/local/haproxy
 pidfile /var/run/haproxy.pid        # 记录haproxy进程的pid信息的文件存放路径
 maxconn 4000            # 最大连接数,默认4000
 user haproxy
 group haproxy
 daemon               # 创建1个进程进入deamon模式运行

defaults                # 默认配置参数,当下面没有具体配置的时候所有配置参数的默认参数
 mode http            # 默认的模式mode { tcp|http|health } 
 log global             # 采用全局定义的日志
 option dontlognull      # 不记录健康检查的日志信息
 option httpclose        # 每次请求完毕后主动关闭http通道
 option httplog           # 日志类别http日志格式
 option forwardfor      # 后端服务器可以从Http Header中获得客户端ip
 option redispatch      # serverid服务器挂掉后强制定向到其他健康服务器
 timeout connect 10000              # 如果backend没有指定,默认为10s
 timeout client 300000               # 客户端连接超时时间
 timeout server 300000              # 服务器连接超时
 maxconn  60000              # 最大连接数
 retries  3              # 3次连接失败就认为服务不可用,也可以通过后面设置

 stats refresh 5s             # 统计页面自动刷新时间
 stats uri /网络路径              # 自定义统计页面的uri
# 例如: stats uri /status       客户端访问 http://域名/status 就可以查看集群状态

# 创建负载均衡服务
listen  weblb  172.25.10.100:80     # 分发服务,创建一个叫weblb的集群,对客户端开放访问的VIP是172.25.10.100,端口是80
    cookie  SERVERID rewrite        # 设置cookie-session服务
    balance roundrobin            # 指定负载均衡算法
    server  web1 172.25.10.110:80 cookie cook1 check inter 2000 rise 2 fall 5
    server  web2 172.25.10.120:80 cookie cook2 check inter 2000 rise 2 fall 5
   # 上面是配置server的真实服务器,配置了两个真实web服务器名字分别为web1,web2,后面就是真实服务器的RIP,设置了cookie名,然后每2000ms连接一次,如果出现失败后,就每2ms连接一次,连续连接5次失败就默认该设备有问题,就不发送请求给他了,然后还是每2000ms连接一次,如果某个时候连上了,就再恢复其服务。

# 基于uri进行负载均衡配置的接受数据端配置,创建网络地址分组
frontend  netlb  192.168.10.100:80    # 创建一个叫netlb的集群,对客户端开放访问的VIP是192.168.10.100,端口是80
    acl url_boy       path_beg    -i /boy        # 客户输入的网络地址是/boy开头的所有请求放入自定义名为url_boy组中
    acl url_girl      path_beg    -i /girl

    acl url_html     path_end    -i .html        # 客户输入的网络地址是.html开头的所有请求放入自定义名为url_html组中
    acl url_php      path_end    -i .php

    use_backend   htmlgrp     if url_html        # url_html组的请求转发给 htmlgrp的真实服务器组中的服务器
    use_backend   phpgrp      if url_php
    use_backend   boygrp      if url_boy
    use_backend   girlgrp      if url_girl    

    default_backend      htmlgrp        # 当用户输入的uri特点不满足上面任意一个uri组,就默认发给htmlgrp服务器组内所有的服务器,然后把完整的uri发给这些服务器,如果服务器中没有网页就不会返回,HAProxy只是做一个转发

# 基于uri进行负载均衡配置的发送数据端配置,创建真实服务器组
backend htmlgrp        # 创建一个名为htmlgrp的真实服务器组,上面声明的每个真实服务器组都要创建            
    balance     roundrobin    # 分布算法
    server   weba  192.168.10.110:80 check        # 把真实服务器的RIP为192.168.10.110的80端口加入htmlgrp真实服务器组
    server   webb  192.168.10.111:80 check

总结:

   1. 调度服务器只是把请求进行分发,不过也没有数据返回取决于后端真实服务器,他有相应的数据就有返回,如果没有,那就没有,如果客户端访问的时候不是一个具体的文件,那请求转发后,网站服务器能响应就可以返回,不能就不会响应

   2. 如果想做个简单的负载均衡,就直接写一个listen即可,如果想做基于uri等按照职能需求区分的负载均衡就需要分别编辑frontend(把接受的数据包分类)、backend(把后端服务器进行分类)


  用HAProxy做基于uri的LB负载均衡服务

    0.准备网站服务器(web主机,不过负载均衡集群中会有很多web主机,每个主机都要做一样的部署),LB调度器(haproxy)

       0.1 装包(apache软件包、数据库软件包、php解析软件包、php连接数据库软件包)

[root@web ~]# yum install httpd mariadb-server php php-mysql

       0.2 启动服务

[root@web ~]# for i in httpd mariadb
do
systemctl restart $i
systemctl enable $i
done

       0.3. 测试web服务的html和php解析情况(编写一个html文件和php文件,让客户端访问一下即可)

[root@web ~]# echo "$HOSTNAME" > /var/www/html/test.html
[root@web ~]# echo '<?php
$x=mysql_connect("localhost","root","数据库root密码(刚刚创建的数据库root密码是空,这引号内什么都不写即可)");
if ($x) {echo "'$HOSTNAME' mariab OK";} else {echo "'$HOSTNAME' mariab error";}
' > /var/www/html/test.php

    1. 搭建haproxy服务器
       1.1 安装软件包haproxy

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

       1.2 修改配置文件/etc/haproxy/haproxy.cfg(配置如上,如果要动静分离就根据uri的结尾来分,如果做基于功能模块的负载均衡就按照uri开头分)

       1.3 启动服务

[root@haproxy ~]# systemctl restart haproxy

    2. 客户端访问测试


对比Nginx、LVS、HAProxy的负载均衡作用的区别

Nginx
   用来做HTPP的web服务的情况最多

  优点:
    1. 不单单可以做LB,还可以HA高可用集群,也可以做web服务
    2. 支持拓展正则,可以根据业务需求做调整,可以做动静结合
    3. 可以支持极高的并发量
  缺点:
    1. 只支持http协议
    2. 监控检查只能通过端口
    3. 效率和负载最低


LVS
   LVS/DR 作为LB负载均衡中,用的最多的集群结构

  优点:
    1. 负载能力强,效率最高
    2. 应用面广,几乎可以用在所有应用提供负载均衡
  缺点:
    1. 本身不能做健康检查,但是可以配合keepalived
    2. 只能记录端口的,不能做动静分离等
    3. 如果架构庞大,LVS/DR配置会很繁琐


HAProxy
    通常作为web网站的负载均衡服务
  优点:
    1. 支持cookie、session功能
    2. 有友好的检查服务器健康性的功能
    3. 可以根据业务需求做区分,效率和负载中等
    4. 支持TCP,可以对数据库做负载
  缺点:
    1. 不支持拓展正则,匹配能力不强,只能勉强做点区分
    2. 不支持apache日志

配置中的对比记忆
服务 对输入数据分类 对数据发送进行分类
Nginx upsteam local
HAProxy frontend backend 

猜你喜欢

转载自blog.csdn.net/Yu1543376365/article/details/83004833