美文网首页高可用
[2022版] 最细致的HAProxy + KeepAlived

[2022版] 最细致的HAProxy + KeepAlived

作者: BlairWaldorf | 来源:发表于2022-08-23 16:20 被阅读0次

最近在工作中遇到需要搭建一个高可用集群的需求,查看了网上的一些资料,发现都相对比较陈旧,步骤也不是非常的详细。于是就写了这篇搭建教程,方便有同样需求的同学参考

下载并安装VirtualBox

https://www.virtualbox.org/wiki/Downloads

本次搭建教程使用的版本是Virtual Box 6.1版本

下载CentOS镜像

https://mirrors.aliyun.com/centos/7/isos/x86_64/

本次搭建教程使用的版本是其中的CentOS-7-x86_64-DVD-2009.iso

配置安装第一台CentOS虚拟机 (下文中用Node01表示)
  1. 打开VirtualBox应用程序,点击下方图中的New来创建一台新的虚拟机Node01


    p1.png
  2. 随后参考下图进行虚拟机的类型,版本选择


    p2.png
  3. 之后可以一路维持默认选项点击下一步,在完成创建后,在左侧列表里可以看到新的虚拟机。双击该虚拟机之后,会让你选择用于启动的ISO文件,此时就可以选中我们之前下载的CentOS 7的ISO文件进行系统安装


    p3.png
  4. 整个安装过程也非常的便捷,基本上和安装Windows系统差不多


    p5.png
  5. 注意在安装时候可以去设置root用户的密码,便于后续登陆系统


    p6.png
  6. 安装结束后,按照提示重启CentOS系统


    p7.png
配置网络接口
  1. 安装完系统之后,如果尝试执行ping www.baidu.com,会提示如下错误

    p8.png
  2. 这是因为此时网络还没有被正确的配置,通过执行sudo nmcli d可以发现网络接口确实处于未连接状态

    p10.png
  3. 执行sudo nmtui进入如下图的配置界面, 随后依次选择

Edit a connection

enp0s3

其中有部分操作需要用空格键进行选择, 可以自己尝试下

p11.png
  1. 将下图中的Automatically connect勾选上,选择OK

    p12.png
  2. 配置完之后,输入reboot重启系统,再次执行sudo nmcli d以及ping www.baidu.com,可以发现网络已经连通了

    image-20220821214531474.png
配置阿里云的yum源

依次执行下列命令并等待至完成

curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache
安装Docker

可以参考官方文档,或者也可以直接按照下面的步骤进行安装

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo systemctl start docker
启动微服务容器

为了节省本教程的复杂度,我已经提前准备好了两个微服务镜像方便测试,分别命名为

chuckge/spring-jib-app
chuckge/spring-jib-app-v2

两个服务都提供了一个路径为\helloworld的Endpoint,差别在于spring-jib-app-v2在调用后会返回"V2"字样便于区分

执行docker run -dp 8080:8080 chuckge/spring-jib-app后等待容器启动完成

此时,可以尝试在虚拟机中执行curl localhost:8080/helloworld, 会发现返回了一个IP地址的字符串

创建第二台虚拟机 (下文中用Node02表示)

按照上面的步骤创建第二台虚拟机,唯一不同之处是在这台虚拟机上运行以spring-jib-app-v2为镜像的容器,用于和第一台虚拟机Node01后续进行区分,在完成上述的步骤之后,在Node02上执行下面的命令运行该V2版本的微服务容器

docker run -dp 8080:8080 chuckge/spring-jib-app-v2

下文中如果不特殊说明,所有的步骤都需要再两个Node上均操作

虚拟机的两种网络链接模式

在VirtualBox中选中某台虚拟机,点击Settings -> Network之后,可以进行网络适配器的配置

在本次实验中,会用到其中两种 (切换模式后,记得通过reboot重启虚拟机)

image-20220823133406623.png
  1. NAT

    在这个模式下,虚拟机可以直接连接Internet,在使用yum等进行安装的时候需要切换到此模式

  2. Host-only Adapter

    • 在这个模式下,宿主机以及虚拟机会处于同一网段,并且互相之间可以Ping通,在全部安装配置完毕之后可以切换到此模式再宿主机上进行访问测试

    • 下文中在haproxy.cfg配置文件中的两台虚拟机IP(192.168.56.101和192.168.56.102),需要在这个模式下,通过ip addr命令获取后按照实际情况进行配置

      image-20220823134126057.png
安装HAProxy
  1. 关闭SELINUX

    编辑/etc/selinux/config文件,将SELINUX=enforcing修改成SELINUX=disabled

  2. 关闭IP Tables (防火墙)

    systemctl stop firewalld.service
    systemctl disable firewalld.service
    
  3. 通过yum安装haproxy

    yum -y install haproxy
    
  4. 创建haproxy的日志文件

    mkdir /var/log/haproxy
    chmod a+w /var/log/haproxy
    
  5. 开启rsyslog记录haproxy日志功能

    vi /etc/rsyslog.conf
    将下面两行的注释去掉(#号)
    $ModLoad imudp
    $UDPServerRun 514
    在文件的末尾添加
    local3.*                       /var/log/haproxy/haproxy.log
    
    vi /etc/sysconfig/rsyslog
    修改 SYSLOGD_OPTIONS="-r -m 0 -c 2"
    
    vi /etc/haproxy/haproxy.cfg
    将`log 127.0.0.1 local2`改成`log 127.0.0.1 local3 info`
    
    重启日志服务
    systemctl restart rsyslog.service
    
  6. 修改haproxy配置

    vi /etc/haproxy/haproxy.cfg
    
    #---------------------------------------------------------------------
    # Example 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 local3 info
    
        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
    
    #---------------------------------------------------------------------
    # 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      static1 192.168.56.101:8080 check
        server      static2 192.168.56.102:8080 check
    
    #---------------------------------------------------------------------
    # round robin balancing between the various backends
    #---------------------------------------------------------------------
    backend app
        balance     roundrobin
        server  app1 192.168.56.101:8080 check
        server  app2 192.168.56.102:8080 check
    
    listen stats
        bind :10086
        stats uri /admin?stats
        stats auth admin:admin
        stats admin if TRUE
        
    
安装keepalived
  1. 通过yum进行安装

    yum -y install keepalived

  2. 配置keepalived (Node 1)

    vi /etc/keepalived/keepalived.conf
    
    global_defs {
       notification_email {
         root@localhost
       }
       notification_email_from keepalived@localhost
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id node01
    }
    
    vrrp_instance VI_1 {
        state MASTER
        interface enp0s3
        virtual_router_id 51
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
        }
        virtual_ipaddress {
            192.168.56.105
        }
    }
    
  3. 配置keepalived (Node 2)

    vi /etc/keepalived/keepalived.conf
    
    global_defs {
       notification_email {
         root@localhost
       }
       notification_email_from keepalived@localhost
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id node02
    }s
    
    vrrp_instance VI_1 {
        state BACKUP
        interface enp0s3
        virtual_router_id 51
        priority 98
        advert_int 1
        authentication {
            auth_type PASS
        }
        virtual_ipaddress {
            192.168.56.105
        }
    }
    
启动Docker, Docker container, HAProxy, Keepalived (Node01)
systemctl start docker
docker run -dp 8080:8080 chuckge/spring-jib-app
systemctl start haproxy
systemctl status haproxy #查看haproxy启动状态,如果有绿色active,说明成功启动
systemctl start keepalived
systemctl status keepalived #查看keepalived启动状态,如果有绿色active,说明成功启动
启动Docker, Docker container, HAProxy, Keepalived (Node02)
systemctl start docker
docker run -dp 8080:8080 chuckge/spring-jib-app-v2 #注意此处和上面Node01的不同
systemctl start haproxy
systemctl status haproxy #查看haproxy启动状态,如果有绿色active,说明成功启动
systemctl start keepalived
systemctl status keepalived #查看keepalived启动状态,如果有绿色active,说明成功启动

下面开始进行测试

首先查看当前VIP(192.168.56.105)在哪台虚拟机上

由于Node01的priority数值较高,所以会被选作Master,在Node01上执行ip addr可以看到持有该VIP

image-20220823153642932.png
通过VIP访问HAProxy的控制台页面

http://192.168.56.105:10086/admin?stats

用户名: admin

密码: admin

在这个页面中,可以清晰的看到HAProxy的一些实时统计数据


image-20220823153939241.png
通过VIP访问后端服务

注意此处使用的是192.168.56.105进行访问,而并不是真实的IP(101和102),这样才能实现和具体实例IP解耦,实现高可用

http://192.168.56.105/helloworld

多次刷新后,可以看到请求被均匀分发到两个后端服务上


image-20220823154120828.png
image-20220823154157960.png
将Node01上的HAProxy和Keepalived停止,查看VIP是否能自动漂移到Node02

在Node01上执行

systemctl stop haproxy
systemctl stop keepalived

在Node02上执行ip addr,可以发现VIP已经自动漂移到Node02上

image-20220823155001825.png
再次通过VIP访问后端服务验证

http://192.168.56.105/helloworld

多次访问会发现,请求仍然能被正常处理,并且均匀的分发到两个后端服务上,不过此时工作的已经Node02上的HAProxy了

TIPS:
  1. 如果遇到启动haproxy报错 HAProxy cannot bind socket [0.0.0.0:10086]

    在虚拟机命令行执行setsebool -P haproxy_connect_any=1

相关文章

网友评论

    本文标题:[2022版] 最细致的HAProxy + KeepAlived

    本文链接:https://www.haomeiwen.com/subject/oasggrtx.html