• Doris FE负载均衡配置


    0 背景概述

    Doris完全兼容了mysql协议,并且Doris FE本身通过多follower选举机制选举出master,可以保证fe本身的高可用性,也可以通过加入observer fe节点来提高fe的读并发能力。但是对于前端连接来讲,还是需要显示执行要连接的fe的url(jdbc)或host ip地址.通过这种方式,如果要访问的fe挂掉的话,上面的应用层就会出错。通过这种方式来访问Doris提供的服务,应用层代码是不够健壮的。Doris官方提供了几种fail over和load balance的方案,总结如下:

    1. 自己在应用层代码进行重试和负载均衡。比如发现一个连接挂掉,就自动在其他连接上进行重试。应用层代码重试需要应用自己配置多个doris前端节点地址。

    2. 如果使用 mysql jdbc connector 来连接Doris,可以使用 jdbc 的自动重试机制:

    jdbc:mysql://[host:port],[host:port].../[database][?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]...

    3. 应用可以连接到和应用部署到同一机器上的mysql proxy,通过配置mysql proxy的failover和loadbalance功能来达到目的。

     

    对比这几种方案

    1. 有点是不需要部署复杂的组件来支持,直接在应用层进行处理,缺点是将fe节点的部署情况和应用层代码进行了耦合,不利于系统的扩展。

    2. 同方案1,只是将这种耦合转移到了jdbc的连接字符串上面了,而且这种方案还不通用,仅限于使用mysql jdbc jar包的方式来进行访问的Dodis的情况,对于其他的访问方式,如odbc,这种方案就不可用了。

    3. 此方案个人认为是这几种方案中最好的解决方案,对上层应用处理来讲,透明化了,扩展性也比较强,缺点是必须部署更多的组件。

    本文将通过构建一个haproxy+keepalived 组合的FE负载均衡集群的方式来讲方案3的具体应用。

    1. 集群规划:

    192.168.1.101   palo101           CentOS 7.4    FE observer + BE+Haproxy 
    192.168.1.102   palo102           CentOS 7.4    FE observer + BE+Haproxy+KeepAlived 
    192.168.1.103   palo103           CentOS 7.4    FE observer + BE+Haproxy+KeepAlived 
    192.168.1.104                                   LoadBalancer VIP

    说明:

    a) 其中 192.168.1.101, 192.168.1.102,192.168.1.103上的Doris FE和Doris BE均已安装好,具体安装请参见Doris官方文档或者本人的前期博文,这里不再赘述。本文的范畴是构建fe的负载均衡器。

    b) 192.168.1.104仅仅是一个可用的ip地址资源,没有被任何主机占用。负载均衡器在主备的时候会选举一个vip loadbalance,并在此地址上提供负载均衡服务,也就是说上层应用层代码均通过连接此地址来使用Doris提供的服务。

    2. 安装HaProxy

     Haproxy是一个开源的高性能的反向代理或者说是负载均衡服务软件之一,它支持双机热备、虚拟主机、基于TCP和HTTP应用代理等功能。其配置简单,而且拥有很好的对服务器节点的健康检查功能(相当于keepalived健康检查),当其代理的后端服务器出现故障时,Haproxy会自动的将该故障服务器摘除,当服务器的故障恢复后Haproxy还会自动将RS服务器。

    HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

    Haproxy软件引入了frontend,backend的功能,frontend(acl规则匹配)可以根据任意HTTP请求头做规则匹配,然后把请求定向到相关的backend(server pools等待前端把请求转过来的服务器组)。通过frontend和backup,我们可以很容易的实现haproxy的7层代理功能,haproxy是一款不可多得的优秀代理服务软件。

    2.1 在192.168.1.101,192.168.1.102,192.168.1.103三台机器上分别安装haproxy

    yum -y install haproxy 

    配置如下:

    sudo vim  /etc/haproxy/haproxy.cfg

    输入如下内容:

    global
    
        log         127.0.0.1 local2         #日志定义级别
        chroot      /var/lib/haproxy         #当前工作目录
        pidfile     /var/run/haproxy.pid     #进程id
        maxconn     4000                     #最大连接数
        user        haproxy                  #运行改程序的用户
        group       haproxy
        daemon                               #后台形式运行
        stats socket /var/lib/haproxy/stats
    
    defaults
        mode                    tcp           #haproxy运行模式(http | tcp | health)
        log                     global
        option                  dontlognull
        option                  redispatch    #serverId对应的服务器挂掉后,强制定向到其他健康的服务器
        option                  tcp-smart-accept
        option                  tcp-smart-connect
        retries                 3             #三次连接失败则服务器不用
        timeout http-request    15s
        timeout queue           5m
        timeout connect         10s           #连接超时
        timeout client          480m          #客户端超时
        timeout server          480m          #服务器超时
        timeout http-keep-alive 10s
        timeout check           10s           #心跳检测
        maxconn                 900           #最大连接数
    
    listen stats                              #配置haproxy状态页(用来查看的页面)
        mode http
        bind :8888                            #web前端监控页面的监听端口
        stats enable
        stats hide-version                    #隐藏haproxy版本号
    stats uri     /haproxyadmin?stats         #一会用于打开状态页的uri
        stats realm   Haproxy Statistics     #输入账户密码时的提示文字
        stats auth    admin:admin             #用户名:密码
    
    frontend  main
    bind 0.0.0.0:3306                        #使用3306端口。监听前端端口【表示任何ip访问3306端口都会将数据轮番转发到mysql服务器群组中】
        default_backend             palofe   #后端服务器组名
    
    backend palofe
        #balance     leastconn                 //使用最少连接方式调度
        balance roundrobin #设置默认负载均衡方式,轮询方式
        server  palofe161   192.168.1.101:9030 check port 9030  maxconn 300 inter 5000 fall 3 rise 3 #转发到101的9030端口,并监听9030端口,监听间隔为5秒钟,如果连续两次检测不到活跃,则从ha群组中剔除,如果连续两次成功,则恢复到群组中来
        server  palofe164   192.168.1.102:9030 check port 9030  maxconn 300 inter 5000 fall 3 rise 3
        server  palofe046   192.168.1.103:9030 check port 9030  maxconn 300 inter 5000 fall 3 rise 3

    说明: Doris FE我们使用的默认端口9030,而mysql默认端口为3306,为了使mysql客户端连接负载均衡器时的使用习惯和mysql保持兼容,我们的设置haproxy的监听端口为3306.(使用mysql客户端连接时,如果不输入端口号,默认为3306)

    这个体现在配置中就是:

    bind 0.0.0.0:3306 #使用3306端口。监听前端端口【表示任何ip访问3306端口都会将数据轮番转发到doris fe集群群组中】

    我们在haproxy的backend中进行了端口映射,把访问3306端口的请求转发到Doris FE的9030端口,采用的是轮询roundrobin 分配算法。

    2.2 启动haproxy并设置开启启动

    sudo systemctl start haproxy     #启动
    sudo systemctl enable haproxy   #设置开机启动

    2.3 测试haproxy

    在192.168.1.101上用浏览器打开http://192.168.1.101:8888/haproxyadmin?stats,用户名密码为admin:admin(在上面haproxy.conf文件中配置的),其他机器可以更换IP地址,操作亦同。如果出现以下界面,则表明haproxy安装成功。

    注:如果是要通过tar包安装的haproxy,最好创建haproxy.service(通过rpm包或者yum安装的不需要做此操作),操作如下:

    sudo /usr/lib/systemd/system/haproxy.service

    填写以下内容:

    [Unit]
    Description=Process Monitoring and Control Daemon
    After=rc-local.service nss-user-lookup.target
    
    [Service]
    LimitCORE=infinity
    LimitNOFILE=100000
    LimitNPROC=100000
    Type=forking
    ExecStart=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg
    
    [Install]
    WantedBy=multi-user.target

    其中ExecStart=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg 记得修改成自己实际的路径

    3. 安装Keepalived

     keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。

    虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。

    keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。

    3.1. 在192.168.1.101,192.168.1.102,192.168.1.103三台机器上分别安装keepalived

    sudo yum install -y keepalived 

    3.2 配置keepalived

    sudo vim  /etc/keepalived/keepalived.conf

    输入如下配置信息:

    #简单的头部,这里主要可以做邮件通知报警等的设置,此处就暂不配置了;
    global_defs {
            #notificationd LVS_DEVEL
            router_id palo101
    }
    #预先定义一个脚本,方便后面调用,也可以定义多个,方便选择;
    vrrp_script chk_haproxy {
        script "/etc/keepalived/chk.sh"  #具体脚本路径
        interval 2  #脚本循环运行间隔
        timeout 2
        fall 3
    }
    #VRRP虚拟路由冗余协议配置
    vrrp_instance VI_1 {       #VI_1 是自定义的名称;
        state BACKUP           #MASTER表示是一台主设备,BACKUP表示为备用设备【我们这里因为设置为开启不抢占,所以都设置为备用】
        nopreempt              #开启不抢占
        interface ens192       #指定VIP需要绑定的物理网卡
        virtual_router_id 11   #VRID虚拟路由标识,也叫做分组名称,该组内的设备需要相同
        priority 130           #定义这台设备的优先级 1-254;开启了不抢占,所以此处优先级必须高于另一台
    
        advert_int 1           #生存检测时的组播信息发送间隔,组内一致
        authentication {       #设置验证信息,组内一致
            auth_type PASS     #有PASS 和 AH 两种,常用 PASS
            auth_pass edw      #密码
        }
        virtual_ipaddress {
            192.168.1.104      #指定VIP地址,组内一致,可以设置多个IP
        }
        track_script {         #使用在这个域中使用预先定义的脚本,上面定义的
            chk_haproxy   
        }
    
        notify_backup "/etc/keepalived/restart_haproxy.sh" #表示当切换到backup状态时,要执行的脚本 
    notify_fault
    "/etc/keepalived/restart_haproxy.sh" #故障时执行的脚本
    }

    注意: 几台机器的priority要设置为不同,以便可以进行抢占工作。 在本例中101-103的priority分别设置为 110,120,130 

    在上述配置中用到了chk.sh文件,用于检测本机的haproxy是否alive,并在检测haproxy死亡时出发处理动作,所以我们创建chk.sh文件

    sudo vim /etc/keepalived/chk.sh

    输入以下内容:

    #!/bin/bash
    #
    if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
           /usr/bin/systemctl  stop keepalived
    fi

    授权chk.sh执行权限

    sudo chmod +x /etc/keepalived/chk.sh

    创建文件restart_haproxy.sh

    sudo vim /etc/keepalived/restart_haproxy.sh

    填写内容如下:

    /usr/bin/systemctl restart haproxy

    授权restart_haproxy.sh执行权限

    sudo chmod +x /etc/keepalived/restart_haproxy.sh

    这里对haproxy活跃检测失败的处理是停止掉本机的keepalived进程,出让vip

    3.3 设置keepalived开机启动并启动keepalived

    sudo systemctl enable keepalived    #设置开机启动
    sudo systemctl start  keepalived    #启动keepalived

    4. 负载均衡测试

     4.1 测试通过3306端口可以访问到Doris

    a) 所有三台机器的haproxy,keepalived,doris fe全部开启

    b) 使用mysql客户端连接192.168.1.104,并且不带参数-P 3306指定端口

    mysql -h 192.168.1.104 -uroot -proot

    测试效果如下:

    说明: 3306端口在虚拟机器上监听成功。(192.168.1.104实际上并没有安装任何实际的机器,完全由负载均衡器选举产生的访问资源,是一个虚拟的活跃vip负载均衡器)

    4.2  停止掉102.168.1.102,192.168.1.103上的keepalived,并使用mysql客户端通过3306端口访问负载均衡器,连接失败

    sudo systemctl stop keepalived   #停止keepalived
    mysql -h 192.168.1.104 -uroot -proot
    Warning: Using a password on the command line interface can be insecure.
    ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.1.104' (113)

    4.3 高可用测试

    4.3.1 启动三台机器上的haproxy, 并启动192.168.1.102,192.168.1.103上的keepalived

    首先查看三台机器的相关进程id

    192.168.1.101

    [edw@palo101 ~]$ ps -e | grep haproxy
     9084 ?        00:00:00 haproxy-systemd
     9085 ?        00:00:00 haproxy
     9086 ?        00:00:04 haproxy

    192.168.1.102

    [edw@palo102 keepalived]$ ps -e | grep haproxy
    16592 ?        00:00:00 haproxy-systemd
    16593 ?        00:00:00 haproxy
    16594 ?        00:00:00 haproxy
    [edw@palo102 keepalived]$ ps -e | grep keepalived
    16580 ?        00:00:00 keepalived
    16581 ?        00:00:00 keepalived
    16582 ?        00:00:00 keepalived

    192.168.1.103

    [edw@palo103 keepalived]$ ps -e | grep haproxy
    19910 ?        00:00:00 haproxy-systemd
    19911 ?        00:00:00 haproxy
    19912 ?        00:00:00 haproxy
    [edw@palo103 keepalived]$ ps -e | grep keepalived
    19975 ?        00:00:00 keepalived
    19976 ?        00:00:00 keepalived
    19977 ?        00:00:00 keepalived

    4.3.2 浏览器打开http://192.168.1.104:8888/haproxyadmin?stats

    注意:我们打开的是104的url,也就是部署在102和103上的keepalived选举出的vip loadbalancer的ip地址.

    目前是102获得了vip load balancer

    4.3.3 在192.168.1.102上关闭haproxy

    sudo kill -9 16594

    刷新4.3.2中打开的浏览器页面,

    我们发现目前取得vip的地址转移到了103上,实现了高可用,一台机器上的负载均衡器挂了之后,另外一台依然可用。实现了对负载均衡器的vip主备功能。(实际上,http://192.168.1.104:8888/haproxyadmin?stats该url依然可以打开,就说明负载均衡器依然活着)

    并且在三个haproxy中,发现了一台挂的,也就是图中黄色的条目,就是代表102的机器

    4.3.4 在192.168.1.102上启动haproxy

    [edw@palo102 keepalived]$ sudo systemctl start haproxy
    [edw@palo102 keepalived]$ ps -e | grep haproxy
    20228 ?        00:00:00 haproxy-systemd
    20229 ?        00:00:00 haproxy
    20230 ?        00:00:00 haproxy

    4.4.5 刷新4.3.2中打开的页面http://192.168.1.104:8888/haproxyadmin?stats

    发现vip依然在103上,没有发生vip负载均衡器的更换,并且三个负载均衡器均处于活跃状态,即当vip宕机之后,vip发生转移,但是之前挂掉的vip(现在已经选举出了新的vip了)重新online后,不会发生控制权的转移。

    4.4 负载测试

    安装抓包工具tcpdump

    sudo yum install -y  tcpdump

    在192.168.1.101,192.168.1.102,192.168.1.103分别启动抓包

    sudo tcpdump -n -i ens192 host 192.168.1.101 and 192.168.1.104  #101机器上,注意ens192为当前机器的活跃mac网卡的名称,各个机器可能会不一样,请注意根据自己的实际情况修改
    sudo tcpdump -n -i ens192 host 192.168.1.102 and 192.168.1.104  #102机器上,注意ens192为当前机器的活跃mac网卡的名称,各个机器可能会不一样,请注意根据自己的实际情况修改
    sudo tcpdump -n -i ens192 host 192.168.1.103 and 192.168.1.104  #103机器上,注意ens192为当前机器的活跃mac网卡的名称,各个机器可能会不一样,请注意根据自己的实际情况修改

     抓包结果:

    192.168.1.101

    [edw@palo101 ~]$ sudo tcpdump -n -i ens192 host 192.168.1.101 and 192.168.1.104
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on ens192, link-type EN10MB (Ethernet), capture size 262144 bytes

    192.168.1.102

    [edw@palo102 keepalived]$ sudo tcpdump -n -i ens192 host 192.168.1.102 and 192.168.1.104
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on ens192, link-type EN10MB (Ethernet), capture size 262144 bytes

    192.168.1.103

    [edw@palo103 keepalived]$ sudo tcpdump -n -i ens192 host 192.168.1.103 and 192.168.1.104
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on ens192, link-type EN10MB (Ethernet), capture size 262144 bytes

    使用mysql客户端连接mysql -h 192.168.1.104 -uroot -proot 负载均衡器,并进行一些操作。由于我们采用的是roundrobin轮询算法,所以结果很明显,三台机器都抓到了请求包,说明负载均衡起作用了。

    4.5 测试任意一台fe宕机,该fe会被移出haproxy群组

    4.5.1 在192.168.1.101中,执行下面命令停止palo_fe

    [edw@palo101 ~]$ sudo supervisorctl stop palo_fe
    palo_fe: stopped
    [edw@palo101 ~]$ sudo supervisorctl status palo_fe
    palo_fe                          STOPPED   Dec 10 05:47 PM

    刷新4.3.2中的页面http://192.168.1.104:8888/haproxyadmin?stats

    监控页面中101服务器显示为down状态,后续请求将不会转发到该节点。

    4.5.2 在192.168.1.101中启动palo_fe,查看该节点的fe又重新已经被加入到服务群组中来了

    [edw@palo101 ~]$ sudo supervisorctl start palo_fe
    palo_fe: started
    [edw@palo101 ~]$ sudo supervisorctl status palo_fe
    palo_fe                          RUNNING   pid 31924, uptime 0:00:07

  • 相关阅读:
    ICommand接口
    Binding自动侦听
    WPF比较两个随机数大小写,利用MVVM思想实现
    从一个ListBox中的元素点击导入另一个ListBox元素中
    利用FluidMoveBehavior制作出手机通讯录平滑的效果
    从零开始学习Gradle之三---多项目构建
    用Gradle 构建你的android程序
    iPhone/iPad调整事件递交
    iOS8-Sampler
    iOS8-Sampler
  • 原文地址:https://www.cnblogs.com/lenmom/p/10095215.html
Copyright © 2020-2023  润新知