zoukankan      html  css  js  c++  java
  • Docker下Ubuntu系统编译安装HAprox+Keepalived+MySQL负载高可用架构

    系统环境:Ubuntu16.04(Docker容器)

    架构环境:

    Keepalived/HAproxy MASTER: 172.17.0.4

    Keepalived/HAproxy BACKUP: 172.17.0.6

    MySQL MASTER: 172.17.0.2

    MySQL SLAVE: 172.17.0.3

    HAproxy版本:haproxy-2.0.8.tar.gz

    Keepalived版本:keepalived-2.0.19.tar.gz

    一、安装HAproxy(MASTER/BACKUP两台都要装)

    1、前往官网https://www.haproxy.org/ 下载HAproxy

    解压,进入haproxy-2.0.8目录

    vim INSTALL;查看安装说明

     

    2、编译安装HAproxy

    1)编译

    报错1:bash: make: command not found

     

    我直接用docker容易,make命令没安装,安装一下:

    apt-get -y install make

    然后执行:

    make -j 2 TARGET=generic USE_GZIP=1

    报错2:/bin/sh: 1: gcc: not found

     

    未安装gcc,安装gcc:

    apt-get -y install gcc

    然后再执行:

    make -j 2 TARGET=generic USE_GZIP=1

    暂时未报错:

     

    2)安装

    直接执行:

    make install PREFIX=/usr/local/HAproxy2.0.8

     

    3)复制命令至/usr/local/sbin/下

     

    3、添加服务启动脚本文件

     vim /etc/init.d/haproxy

    #!/bin/bash
    #
    # chkconfig: 2345 85 15
    # descrition: haproxy loadbalancer
     
    DAEMON=haproxy
    PROG_DIR=/usr/local/HAproxy2.0.8
    RETVAL=0
     
    success() {                       #跟朋友的探讨,使用shell本身来实现;当然也可以使用for的遍历循环, 
                                        总之方法有很多种
    for ((i=0;i<=5;i++))
    do
    sleep 0.2
    echo -n "."
    done
    }
     
    start ()
    {
        PROG_STAT=$(netstat -tlnp | grep ${DAEMON})
        if [ -z "$PROG_STAT" ]; then
      $PROG_DIR/sbin/$DAEMON -f $PROG_DIR/conf/${DAEMON}.cfg
            echo -ne "Starting ${DAEMON}......			"  && success
      echo -e "e[32m[OK]e[0m" 
        else
            echo "$DAEMON is already running"
    RETVAL=65
        fi
    }
     
    stop ()
    {
        PROG_STAT=$(netstat -tlnp | grep ${DAEMON})
        if [ -n "$PROG_STAT" ]; then
            echo -ne "stopping ${DAEMON}......			"  && success
            PROG_PID=$(cat $PROG_DIR/run/${DAEMON}.pid)
            kill $PROG_PID
            echo -e "e[32m[OK]e[0m"
        else
            echo "$DAEMON is already stopped"
    RETVAL=66
        fi
    }
     
    restart()
    {
        echo -ne "restarting ${DAEMON}......			"   && success
        PROG_PID=$(cat $PROG_DIR/run/${DAEMON}.pid)
        $PROG_DIR/sbin/$DAEMON -f $PROG_DIR/conf/${DAEMON}.cfg -st $PROG_PID
        echo -e "e[32m[OK]e[0m"
    }
     
    status ()
    {
        PROG_STAT=$(netstat -tlnp | grep ${DAEMON})
        if [ -z "$PROG_STAT" ]; then
            echo "${DAEMON} stopped"
        else
            echo "${DAEMON} running"
        fi
    }
     
    case "$1" in
        start)
            start
            ;;
        stop)
            stop
            ;;
        restart)
            restart
            ;;
        status)
            status
            ;;
        *)
            echo "Usage /etc/init.d/$DAEMON {start | stop | restart | status}"
    RETVAL=67
    esac
    exit $RETVAL

    赋予执行权限:

    chmod +x /etc/init.d/haproxy

    4、添加haproxy.conf配置文件

    先创建haproxy用户与组:

     

    再创建配置文件:

    mkdir -p /etc/haproxy

    vim /etc/haproxy/haproxy.conf

    global
        log 127.0.0.1 local2 info    # 设置日志文件输出定向,info为日志级别
        chroot /usr/local/HAproxy2.0.8    # 改变当前工作目录
        pidfile /usr/local/HAproxy2.0.8/run/haproxy.pid    #PID文件位置
        user haproxy    # 用户与用户组
        group haproxy
        daemon    # 守护进程启动,运维方式为后台工作
        maxconn 4000    # 最大连接数
    
    # 作用于其后紧跟的listen块,直至下一个defaults 块,下一个default 将替换上一个块作用于以后的listen
    defaults
            log global      #启动每个实例日志记录事件和流量
            mode http       #默认的模式mode {tcp|http|health},tcp是四层,http是七层,health只会返回ok
            retries 3       #对server的connection失败后,重试的次数
            option redispatch       #启用或禁止在连接故障情况下的会话重新分配
            maxconn 4096    #maxconn每个进程可用的最大连接数
            timeout http-request    10s
            timeout queue   1m
            timeout connect 10s
            timeout client 1m
            timeout server 1m
            timeout http-keep-alive 10s
    
    frontend main
            bind 0.0.0.0:3307
            default_backend mysql
    
    backend mysql
            balance leastconn    #算法:最少连接数
            server mysql1 172.17.0.2:3306 check port 3306 maxconn 300
            server mysql2 172.17.0.3:3306 check port 3306 maxconn 300

    复制一份配置文件到该目录:

    cp -a /etc/haproxy/haproxy.conf /usr/local/HAproxy2.0.8/conf/haproxy.cfg

    来启动haproxyd服务

    /etc/init.d/haproxy start

     

    显示服务启动成功,端口也在

    二、安装Keepalived

    1、前往官网下载所需版本https://www.keepalived.org/

    同样解压,进入目录,查看安装说明文档(此处忽略)

    2、编译扮装

    1)检查环境

    ./configure --prefix=/usr/local/keepalived-2.0.19

    报错1:Can not include OpenSSL headers files

     

    没有openssl,执行:

    apt-get -y install openssl libssl-dev

    注意:redhat和centos中是需要安装openssl和openssl-devel的,在ubuntu中,openssl-devel被libssl-dev所代替,安装libssl-dev即可

    再重新检查环境~

     

    ok,每问题,警告忽视

    2)编译、编译安装

    make && make install

     

    ok,编译安装完成

    3、编辑配置文件

    cp /usr/local/keepalived-2.0.19/etc/keepalived/keepalived.conf /etc/keepalived/  #复制配置文件

    cp /usr/local/keepalived-2.0.19/sbin/keepalived /usr/local/sbin/

    cp /usr/local/keepalived-2.0.19/etc/rc.d/init.d/keepalived /etc/init.d/  #复制服务启动文件

    chmod +x /etc/init.d/keepalived

    vim /etc/keepalived/keepalived.conf(MASTER机)

    ! Configuration File for keepalived
    
    global_defs {
       router_id r1         #虚拟路由名称,master和backup不能一致
    }
    
    vrrp_script chk_haproxy {       #定义检查脚本
            script "/etc/keepalived/chk_haproxy.sh"         #脚本位置
            interval 3      #每3秒检测一次
            fall 3          #失败判断3次
    #       weight  -2      #失败后权重-2
    }
    
    vrrp_instance VI_1 {
        state MASTER        #状态,只有MASTER或BACKUP
        interface eth0      #网卡名称,注意一定要是自己正在使用的网卡名称
        virtual_router_id 53        #虚拟路由id,是虚拟路由的mac最后两位
        priority 100                #优先级
        advert_int 1                #通告间隔时间
        authentication {            #认证
            auth_type PASS
            auth_pass 1111
        }
    
        track_script {     #执行以上脚本
            chk_haproxy
        }
    
        virtual_ipaddress {         #VIP地址,同网段
            172.17.0.253
        }
    #   notify_master "/etc/init.d/haproxy start"   #当 当前节点成为master时,执行的任务
    #   notify_backup "/etc/init.d/haproxy restart" #当 当前节点成为backup时,执行的任务
    #   notify_fault  "/etc/init.d/haproxy stop"    #当 当前节点出现故障时,执行的任务    
    }

    ok,创建健康检查脚本文件

    vim /etc/keepalived/chk_haproxy.sh

    #/bin/bash
    
    STAT=`ps -C haproxy --no-header | wc -l`
    
    if [[ ! "$STAT" -eq 1  ]];then
            /etc/init.d/keepalived stop
    fi

    如果进程未在,直接关闭keepalived

    chmod +x chk_haproxy.sh #给个执行权限

    4、启动keepalived服务

    启动文件中某些文件不存在,需要手动链接一下(ubuntu就是麻烦):

     

    ln -s /lib/lsb/init-functions /etc/init.d/functions

    mkdir /etc/rc.d

    ln -s /etc/init.d /etc/rc.d/

    cp /src/keepalived-2.0.19/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

    然后安装daemon命令:

    apt-get -y install daemon

    注意图中,daemon -- keepalived 之前是 daemon keepalived,加了两条横杠

    这个命令是有问题的,其中的-D本来是给keepalived用的,但这样组合后被认为是daemon命令的参数。这会导致服务不能启动。  如果不修改,会提示启动失败,但却不输出具体信息。

    注意,由于我是使用docker容器安装的keepalived,所以我需要将此容器保存成镜像,然后再重新docker run,要加上--privileged这个参数,才能显示keepalived的VIP(不是用容器安装的可以忽略)

    docker run -dit --privileged --name ha_keep  -p 3308:3307 ha_keep

    下边启动服务:

    /etc/init.d/keepalived start

     

    执行:ip addr

     

    5、配置BACKUP机

    haproxy服务于MASTER机一致,keepalived服务主要修改主配置文件

    Keepalived/BACKUP机配置文件:

    ! Configuration File for keepalived
    
    global_defs {
       router_id r2         #虚拟路由名称,master和backup不能一致
    }
    
    vrrp_script chk_haproxy {       #定义检查脚本
            script "/etc/keepalived.chk_haproxy.sh"         #脚本位置
            interval 3      #每3秒检测一次
            fall 3          #失败判断3次
    #       weight  -2      #失败后权重-2
    }
    
    vrrp_instance VI_1 {
        state BACKUP        #状态,只有MASTER或BACKUP
        interface eth0      #网卡名称,注意一定要是自己正在使用的网卡名称
        virtual_router_id 53        #虚拟路由id,是虚拟路由的mac最后两位
        priority 99                 #优先级
        advert_int 1                #通告间隔时间
        authentication {            #认证
            auth_type PASS
            auth_pass 1111
        }
    
        track_script {
            chk_haproxy
        }
    
        virtual_ipaddress {         #VIP地址,同网段
            172.17.0.253
        }
    #   notify_master "/etc/init.d/haproxy start"   #当 当前节点成为master时,执行的任务
    #   notify_backup "/etc/init.d/haproxy restart" #当 当前节点成为backup时,执行的任务
    #   notify_fault  "/etc/init.d/haproxy stop"    #当 当前节点出现故障时,执行的任务
    } 

    其他配置相同,然后启动keepalived

    6、测试将MASTER机的haproxy服务stop,会不会自动将keepalived服务关掉,将VIP转移到BAKUP机

    下图所示VIP到BACKUP机就说明配置ok

     

    7、负载均衡高可用配置完毕,不过此架构适用于mysql主主复制或有共享存储服务器。

    如有转载请标明出处

  • 相关阅读:
    Fractions Again?! UVA
    Maximum Product UVA
    Investigating Div-Sum Property UVA
    Period UVALive
    Numbers That Count POJ
    Orders POJ
    小明的数列
    Spreading the Wealth uva 11300
    Play on Words UVA
    第二百七十天 how can I 坚持
  • 原文地址:https://www.cnblogs.com/v-fan/p/11878151.html
Copyright © 2011-2022 走看看